Java系统学习笔记

计算机知识

CMD

环境变量

想要在任意目录下都可以打开指定的软件,就可以把软件的路径配置到环境变量中。

JDK

JDK安装目录中

javac 是JDK提供的一个工具,可以通过这个工具,把java文件编译成class文件

java 也是JDK提供的一个工具,作用就是用来运行代码的。运行当前路径下的class文件(不加后缀名)

JAVA基础语法

Java入门

如何理解编译?

Java不能直接运行代码,需要编译后运行。

编译成自解码文件(不是给人看的,给计算机看的)

常见小问题

java代码必须使用英文状态下的符号

直接在文件夹的路径中输入 cmd 可以直接用cmd打开当前路径

JRE和JDK

JDK(Java Development kit):Java开发工具包

  • JVM:虚拟机,真正运行代码的地方
  • 核心类库:Java事先定义好的东西
  • 开发工具:javac 编译工具、java 运行工具、jdb 调试工具、jhat 内存分析工具

JRE(Java Runtime Environment):Java的运行环境

  • JVM
  • 核心类库
  • 运行工具

Java基础概念

注释

单行注释 //

多行注释 /* */

单行注释和多行注释 一般都要避免嵌套

文档注释 /** */
java有自带的工具可以根据文档注释自动的生成说明文档

关键字

关键字:被java赋予了特定涵义的英文字母

【特点】全部小写,有特殊颜色标记

class

用于(创建/定义)一个类。类是Java最基本的组成单元。后面跟随 类名。

字面量

告诉程序员数据在程序中的书写格式

字面量类型

|-----------|-----------------|---------------------|
| 字面量类型 | 说明 | 举例 |
| 整数类型 | 不带小数点的数字 | 666,-88 |
| 小数类型 | 带小数点的数字 | 13.14,-25.22 |
| 字符串类型 | 用双引号括起来的内容 | "HelloWorld","黑马程序" |
| 字符类型 | 用单引号括起来,内容只能有一个 | 'A','0','我' |
| 布尔类型 | 布尔值,表示真假 | 只有两个值:true,false |
| 空类型 | 一个特殊的值,空值 | null |

  • null是不能直接打印的,只能以字符串的格式打印出来
特殊类型的字面量
\t 制表符

不是单一的缩进、对齐、空格。→ 是在打印的时候,把前面的字符串的长度补齐到8,或者8的整数倍。最少补一格,最多补8格。

\r

\n

变量

【定义】 在程序的执行过程中,其值又可能发生改变的量(数据)

当某个数据经常发生改变时,可以用变量存储。当数据变化时,只要修改变量里面记录的值。

变量的定义格式

数据类型 变量名 = 数据值;

变量名可以理解为 为空间(小箱子)起的名字,数据值 存在空间里面的数值

数据类型:为空间中存储的数据,加入类型限制

!!

  • 变量只能存一个值,会覆盖
  • 变量名不能重复(是指重复用数据类型来定义同名变量)
  • 一条语句可以定义多个变量
  • 变量在使用之前一定要进行赋值 (建议:在定义变量时直接赋值)
  • 变量的作用域范围(后续讲解)

数据存储

计算机中的数据:文本(数字、字母、汉字)、图片、声音

在计算机中,任意数据都是以二进制的形式来存储的

不同进制的表现形式
  • 二进制:由0和1组成,代码中以 0b 开头
  • 十进制:由0~9组成,前面不加任何前缀
  • 八进制:由0~7组成,代码中以 0 开头
  • 十六进制:由0~9和a~f组成,代码中以 0x 开头
进制之间的转换

(1)其他进制转十进制

公式:系数 * 基数的权次幂 相加
系数 - 每一位上的数 基数 - 当前进制 权 - 从右往左,依次是0 1 2 3 4 5...

(2)十进制转其他进制

除基取余法:不断除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着拼起来

图片数据

黑白图、灰度图、彩色图

分辨率、像素、三原色

计算机中的三原色:红、绿、蓝(三基色:红、黄、蓝) RGB

取值范围:0~255 (255,255,255)

声音数据

对声音的波形图进行采样再存储

数据类型

基本数据类型

/ 引用数据类型(后续在数组和面向对象的课程中学习)

|----------|------------|-------------------------------------------------|----------|
| 数据类型 | 关键字 | 取值范围 | 内存占用 |
| 整数 | byte | -128 ~ 127 | 1 |
| 整数 | short | -32768 ~ 32767 | 2 |
| 整数 | ++int++ | -2147483648 ~ 2147483647(10位数) | 4 |
| 整数 | long | -9223372036854775808~9223372036854775808(19位数) | 8 |
| 浮点数 | float | -3.401298e-38 ~ 3.402823e+38 | 4 |
| 浮点数 | ++double++ | -4.9000000e-324 ~ 1.797693e+308 | 8 |
| 字符 | char | 0-65535 | 2 |
| 布尔 | boolean | true,false | 1 |

int、double为对应类型的默认类型

如果要定义long类型的变量,在数据值后面需要加一个L作为后缀(大小写都可)

如果要定义float类型的变量,在数据值后面需要加一个F作为后缀

整数和小数取值范围大小关系:double > float > long > int > short > byte

标识符

【定义】自己给类,方法,变量等起的名字

命名规则
  • 硬性要求
  1. 由数字、字母、下划线(_)和美元符($)组成
  2. 不能以数字开头
  3. 不能是关键字
  4. 区分大小写
  • 软性建议
  1. 小驼峰命名法:方法、变量
    标识符是一个单词的时候,全部小写 name
    标识符由多个单词组成的时候,第一个单词首字母小写,其他单词首字母大写 firstName
  2. 大驼峰命名法:类名
    标识符是一个单词的时候,首字母大写 Student
    标识符由多个单词组成的时候,第一个单词首字母大写 GoodStudent

!! 见名知意

键盘录入

Java帮我们写好了一个类叫 Scanner,这个类就可以接收键盘输入的数字。

步骤一:导包 --- Scanner这个类在哪

java 复制代码
import java.util.Scanner;

// 导包的动作必须出现在类定义的上边

步骤二:创建对象 --- 表示要开始用Scanner这个类了

java 复制代码
Scanner sc = new Scanner(System.in);
// 上面这个格式里,只有sc是变量名,可以变。其他的都不允许变

步骤三:接收数据 --- 真正要开始干活了

java 复制代码
int i = sc.nextInt();
// 只有i是变量名,可以变,其他的都不允许变。

IDEA

程序的输出结果 会在下方的 控制台 展示

项目结构介绍

project(项目)》module(模块)》package(包)》class(类)

IDEA中类相关操作

新建类

要在想要新建类的包上右击,否则会建到其它地方去

删除类

直接右击删除

修改类名

一起更改文件名和类名。

快捷键: shift + F6

IDEA中模块相关操作

新建模块

File -> Project Structure

删除模块、修改模块、导入模块(后续讲)

IDEA中项目相关操作

关闭项目

File -> Close Project

新建项目

打开项目、修改项目(后续讲)

新建包

com.itheima.demo1 是一个多级包

右击 openin -> explorer 可以打开本地文件夹的位置

编写代码中的技巧

快速生成main方法: psvm + 回车

输出语句: sout + 回车

运算符

学习【算术运算符、自增自减运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符】六种运算符 以及 运算符优先级

算术运算符

运算符:对字面量或变量进行操作的符号

表达式:用运算符把字面量或者变量连接起来,符合java语法的式子就可以称为表达式。(不同运算符连接的表达式体现的是不同类型的表达式)

【加、减、乘、除、取模】% 取模就是取余数

**!**在代码中,如果有小数参与计算,结果++有可能++不精确。具体原因,后续讲解,涉及小数在计算机中的存储模式。

/ 结果:

  1. 整数参与计算,结果只能得到整数
  2. 小数参与计算,结果有可能是不精确的。如果需要精确计算,需要用到后面的知识

% 结果:

  1. 可以用 取模 来判断,A是否可以被B整除
  2. 可以判断A是否为偶数
  3. 以后,应用于 地主发牌
"+" 操作的三种情况
  • 数字相加

数字进行运算时,数据类型不一样是不能运算的,需要转成一样的类型,才能运算。

隐式转换和强制转换

隐式转换:取值范围小的数值 变为 取值范围大的数值

强制转换:取值范围大的数值 变为 取值范围小的数值

隐式转换

byte < short < int < long < float < double

!!

  1. 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算
  2. byte short char 三种类型的数据在运算的时候,都会直接先提升为 int,然后再进行运算

强制转换

格式: 目标数据类型 变量名 = (目标数据类型)被强转的数据;

数据较大时,强转时数值可能会发生错误!


  • 字符串相加

当"+"操作中出现字符串时,这个"+"是字符串连接符,而不是算术运算符了。会将前后的数据进行拼接,并产生一个新的字符串。

java 复制代码
"123" + 123  -> "123123"  

连续进行"+"操作时,从左到右逐个执行。

java 复制代码
1 + 99 + "年" -> "100年"

变量拼接的是变量值。


  • 字符相加

当 字符 + 字符 、 字符 + 数字 时,会把字符通过ASCII码表查询到对应的数字再进行计算。

java 复制代码
'a' + 1 = 98   =>    'a' = 97
自增自减

++:变量的值加 1

  • -:变量的值减 1

++ 和 -- 既可以放在变量的前面,也可以放在变量的后面。不管放前还是放后,单独写一行,运行的结果是一样的。
!! 参与计算时,稍有不同: a++ 先用后加 ; ++a 先加后用

赋值运算符

【=、+=、-=、*=、/=、%=】运算后赋值

**!**扩展的赋值运算符底层都隐藏了一个强制类型转换

java 复制代码
short s = 1;
s += 1;   =>   s =(short) (s + 1);

关系运算符(比较运算符)

【==、!=、>、>=、<、<=】成立为true,不成立为false

**!**关系运算符的结果都是Boolean类型的,要么是true,要么是false。

逻辑运算符

什么是逻辑运算符?

在数学中,我们可以表示为5 < x < 15。Java中,需要先拆解,再进行合并表达。

拆解为:x > 5 和 x < 15 , 合并后: x > 5 & x < 15

|--------|------------|--------------------|
| 符号 | 作用 | 说明 |
| & | 逻辑与(且) | 并且,两边都为真,结果才是真 |
| | | 逻辑或 | 或者,两边都为假,结果才是假 |
| ^ | 逻辑异或 | 相同为 false,不同为 true |
| ! | 逻辑非 | 取反 |

短路逻辑运算符

【&& 短路与 、 || 短路或】结果和普通逻辑运算符一致,但是有短路效果(左边表达式已经能判断出最终结果了,右边的表达式就不判断了)

三元运算符

作用:可以进行判断,根据判断的结果得到不同的内容

格式:关系表达式?表达式1:表达式2

关系表达式结果为真就执行 表达式1,结果为假就执行 表达式2

三元表达式的最终一定要使用(赋值给变量)

运算符的优先级

()优先于所有运算符

原码、反码、补码

原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负

反码:正数的补码反码是其本身,负数的反码是符号位保持不变,其余位取反

补码:正数的补码是其本身,负数的补码是在其反码的基础上+1

1000 0000:-128 既没有原码,也没有反码,只有补码的形式

计算机中的计算和存储都是以补码的形式存在的

一个字节的取值范围:-128 ~ +127 就是这个原因

利用原码进行计算,正数没有问题。但在负数计算时会出错,因为与正确的运算方向相反。反码就是为了解决原码不能计算负数的问题才出现的。负数运算时如果跨0,跟实际结果会有1的偏差,因此出现了补码。

原码也有逻辑与&、逻辑或|

<< 左移:向左移动,低位补0

判断和循环

流程控制语句

顺序结构

Java程序默认的执行流程,按照代码的先后顺序,从上往下依次执行

分支结构
if
  1. 大括号的开头可以另起一行书写,但建议卸载 if 那一行的末尾
  2. 在语句体中,如果只有一句代码,大括号可以省略不写。建议,还是不要省略..
  3. 如果对一个布尔类型的变量进行判断,不要用==号,直接把变量写在小括号中
java 复制代码
if(关系表达式1){
    语句体1;
}else if(关系表达式2){
    语句体2;
}
  ...
else{
    语句体n+1;
}
switch
java 复制代码
switch(){
    case 值1:
        语句体1;
        break;
    case 值2:
        语句体2;
        break;
    ...
    case 值3:
        语句体n+1;
        break;
}
  1. 表达式中取值为byte、short、int、char可以是枚举,JDK7以后可以是string
  2. case:后面跟的是要和表达式进行比较的值。只能是字面量,不能是变量。值不允许重复
  3. break:表示中断,用来结束switch语句
  4. default:表示所有情况都不匹配,就执行该处内容

default的位置和省略

default可以省略,语法不会有问题,但不建议省略。

default不一定写在最下面,可以写在任意位置,按习惯写在最下面。

case穿透

不写break就会导致case穿透,没有break会执行下一个case中的语句体。

switch新特性

JDK12之后,可以有不写break的写法。具体有需要再了解

switch和if第三种格式各自的使用场景

if的第三种格式多用于对范围的判断,switch把有限个数据一一列举,任选其一

巧妙利用case穿透,可以在switch语句中省略相同代码

java 复制代码
-- 也可以这么写
case 1,2,3,4,5:
循环结构

什么是循环?

  • 重复的做某件事情
  • 具有明确的开始和停止标志
for循环
java 复制代码
for(初始化语句;条件判断语句;条件控制语句){
    循环体语句
}

拓展:

  1. 求和的变量不能定义在循环里面,因为变量只在所属的大括号中有效
  2. 如果我们把变量定义在循环里面,那么当前变量只能在本次循环中有效。当本次循环结束后,变量就会从内存中消失。第二次循环开始的时候,又会重新定义一个新的变量。
  3. 下次累加求和的变量,应该把变量定义在循环的外面

快捷键:100.fori -> for(int i=0;i<100;i++){ }

while
java 复制代码
初始化语句;
while(条件判断语句){
    循环体语句;
    条件控制语句;
}

for 和 while 对比

  • for循环中,控制循环的变量,因为归属for循环的语法结构中;在for循环结束后,就不能再被访问到了
  • while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
  • 知道循环次数或范围时,多用for循环;只知道循环的结束条件,多用while循环
do ... while
java 复制代码
初始化语句;
do{
    循环体语句;
    条件控制语句;
}while(条件判断语句);

数组

数组的概述和静态初始化

数组指的是一种容器,可以用来存储同种数据类型的多个值。

数组容器在存储数据的时候,需要结合隐式转换。

数组的定义:

数据类型 [ ] 数组名 && 数据类型 数组名 [ ]

静态初始化

初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程

格式:

java 复制代码
数据类型 [] 数组名 = new 数据类型[]{元素1,元素2,元素3...}

【简写格式:数据类型 [ ] 数组名 = {元素1,元素2,元素3...}】

数组的地址值和元素访问

地址值

直接println数组,是打印出地址值

[D@776ec8df :其中 [ 表示当前是一个数组;D表示当前数组里面的元素都是double;@是一个间隔符号;776ec8df:才是数组真正的地址值(十六进制)。平时习惯把整体称作地址值

元素访问

利用索引可以读取数组中具体某一位上的数据

当访问了数组中不存在的索引,就会引发索引越界异常

数组遍历

遍历:将数组中的所有内容取出来,取出来之后可以(打印,求和,判断...)是取出数据的过程!

arr.length 可用于打印数组中的所有数据

**Tips:**一个循环只做一个事情!

数组动态初始化

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值

java 复制代码
数据类型 [] 数组名 = new 数据类型[数组长度]

数组默认初始化值的规律:整数类型 - 0 ;小数类型 - 0.0 ;字符类型 - '/u0000'(展示形式就是空格);布尔类型 - false ;引用数据类型 - null

动态初始化和静态初始化的区别:动态初始化手动指定数组长度,由系统给出默认初始化值。静态初始化手动指定数组元素,系统会根据元素个数,计算出数组的长度。

数组内存图

Java内存分配(JVM)

  • 栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行

程序的主入口(main方法)开始执行时会进栈,代码执行完毕后会出栈

  • 堆 存储对象或数组,new来创建的,都存储在堆内存

new出来的东西会在这块内存中开辟空间并产生地址

  • 方法区 存储可以运行的class文件,字节码文件加载时进入的内存
  • 本地方法栈 JVM在使用操作系统功能的时候使用,与开发没什么关系
  • 寄存器 给CPU使用,与开发没什么关系

如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据。

两个数组指向同一个空间的内存图

其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改后的结果了。

数组练习

1、求最值

注:将最值初始值设置为数组中的值!!为省略重复比较的过程,可以将循环条件改为从1开始。

2、求和并统计个数

随机数:bound:10 -- 0 ~ 9 ;随机数的范围一定是从0开始的,到这个数-1。包头不包尾

java 复制代码
// 1.导包  -- Random这个类在哪 
import java.util.Random

// 2.创建对象 --表示要开始用Random这个类了
Random r = new Random();  -- r是变量名

// 3.生成随机数 
int number = r.nextInt(随机数范围);  -- number是变量名

3、交换数据

!println 打印会换行 ;print 打印不换行

核心思想:借助一个中间变量来交换数据

4、打乱数据

获取随即索引:

java 复制代码
Random r = new Random();
int randomIndex = r.nextInt(arr.length);  --利用数组的长度

方法

什么是方法

方法(method)是程序中最小的执行单元。

提高代码的复用性、可维护性

方法的格式

把一些代码打包到一起,用到的时候就调用。这个把代码打包在一起,该过程称为方法定义

方法定义后并不是直接运行的,需要手动调用才能执行,该过程称为方法调用

最简单的方法定义&调用方式
  • 定义
java 复制代码
public static void 方法名(){
    方法体(就是打包起来的代码);
}
  • 调用
java 复制代码
方法名();
带参数的方法定义&调用方式

1.方法要干什么?

2.干这件事需要什么才能完成?

形参

全称形式参数,是指方法定义中的参数

实参

全称实际参数,是指方法调用中的参数

带返回值的方法定义&调用方式

方法的返回值就是方法运行的最终结果。

java 复制代码
public static 返回值类型 方法名(){
    方法体;
    return 返回值;
}
  • 调用
  1. 直接调用:方法名(实参);
  2. 赋值调用:数据类型 变量名 = 方法名()实参;
  3. 输出调用:println

如果方法执行到return,那么整个方法全部结束;break是结束循环或结束switch

方法的重载

在同一个类中,方法名相同,参数不同(个数不同、类型不同、顺序不同)的方法。与返回值无关。

Java虚拟机会通过参数的不同来区分同名的方法。

顺序不同可以构成重载,但是不建议~

好处:定义方法时不用想多个名字,调用方法时也不用那么麻烦。

方法的内存

1)方法调用的基本内存原理

2)方法传递基本数据类型的内存原理

基本数据类型

  • 整数类型
  • 浮点数类型
  • 布尔类型
  • 字符类型

引用数据类型

  • 除了左边的所有数据类型

基本数据类型变量中存储的是真是的数据,数据值是存储在自己的空间中的;

赋值给其他变量,也是赋的真实的值。

传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值。

3)方法传递引用数据类型的内存原理

引用存储类型变量中存储的是地址值;数据值是存储在其他空间中的(堆),自己空间中存储的是地址值;

赋值给其他变量,也是赋的地址值。

斯坦福大学练习题

CTRL + P 查看形参顺序

CTRL + alt + M 自动抽取方法

题目没看完~


面向对象

面向对象介绍

面向对象重点学习

  • 如何获取已有对象并使用
  • 如何自己设计对象并使用 → 面向对象语法

类和对象

对象可以理解为一个个能帮助我们解决问题的东西,这些东西需要按照设计图造出来。

类(设计图):是对象共同特征的描述;

对象:是真实存在的具体东西。

-- Java中,必须先设计类,才能获得对象。--

如何定义类

java 复制代码
public class 类名{
    1. 成员变量(代表属性,一般为名词)
    2. 成员方法(代表行为,一般是动词)
    3. 构造器(后面学习)
    4. 代码块(后面学习)
    5. 内部类(后面学习)
}

如何得到类的对象

java 复制代码
类名 对象名 = new 类名();

如何使用对象

  • 访问属性:对象名.成员变量
  • 访问行为:对象名.方法名(...)

【IDEA中,右击类 → split and move right 可以左右窗口方便查看】

定义类的补充注意事项

  • 用来描述一类事物的类,专业叫做:JavaBean类。在JavaBean类中,是不写main方法的。
  • 以前编写含有main方法的类,叫做测试类。我们可以在测试类中创建JavaBean类的对象并进行赋值调用。
  • 类名 -- 首字母建议大写,需要见名知意,驼峰模式
  • 一个java文件中可以定义多个class类,且只能一个类是public修饰的,而且public修饰的类名必须成为代码文件名。实际开发中建议一个文件定义一个class类
  • 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在默认值。

封装

面向对象的三大特征:封装、继承、多态

封装告诉我们,如何正确设计对象的属性和方法

原则:对象代表什么,就得封装对应的数据,并提高数据对应的行为

封装的好处

  • 让编程变得简单,有事找对象调方法就行
  • 降低学习成本,可以少学少记,有需要时去找方法就行

private关键字

是一个权限修饰符,可以修饰成员(成员变量和成员方法),被 private 修饰的成员只能在本类中才能访问

针对 private 修饰的成员变量,如果需要被其他类使用,提供相应的操作:提供"setxxx(参数)"方法,用于给成员变量赋值,方法用public修饰;提供"getxxx()"方法,用于获取成员变量的值,方法用public修饰

this关键字

成员定义在方法中,就是局部变量;定义在方法外,就是成员变量

**就近原则:**当局部变量和成员变量一致时,没有任何前缀的使用变量,按照就近原则

this.变量 直接使用成员变量

构造方法

构造方法也叫做构造器、构造函数。

作用:在创建对象的时候给成员变量进行初始化的

构造方法的格式

public class Student{
    修饰符 类名(参数){
        方法体;
    }
}

特点

  • 方法名与类名相同,大小写也要一致
  • 没有返回值类型,连void都没有
  • 没有具体的返回值(不能由return带回结果数据)

空参构造方法在构造对象时成员变量都是默认初始化值,带参构造方法可以在方法中给所有成员变量赋值。

创建对象时由虚拟机调用构造方法,不能手动调用

每创建一次对象,就会调用一次构造方法。

如果自己没有写任何的构造方法,那么虚拟机会加一个空参构造方法(创建对象时调用),需要更改成员变量的值时可使用构造方法来赋值。空参构造在不知道属性值时很实用

构造方法注意事项

  1. 构造方法的定义:如果没有定义构造方法,系统将给出一个默认的无参数构造方法;如果定义了构造方法,系统将不再提供默认的构造方法
  2. 构造方法的重载:带参构造方法,和无参构造方法,两者方法名相同,但是参数不同,这叫构造方法的重载
  3. 推荐的使用方式:无论是否使用,都手动书写无参构造方法和带全部参数的构造方法

**TIPS:**说构造方法是用来创建对象的。这句话其实不太对。构造方法是创建对象时,给成员变量进行初始化的!!只是创建对象中的一步

标准的JavaBean类

①类名需要见名知意

②成员变量使用private修饰

③提供至少两个构造方法

  • 无参构造方法
  • 带全部参数的构造方法

④成员方法

  • 提供每一个成员变量对应的 setXxx()/getXxx()
  • 如果还有其他行为,也需要写上

快捷键:alt + fn + insert

构造方法 【Constructor】 -> 【select none】空参

-> 【全选 + ok】带全参

【Getter and Setter】 -> 【全选 + ok】为每个成员变量生成方法

(插件PTG 可实现1秒生成标准JavaBean,需连接外网)

对象内存图

一个对象的内存

Student s = new Student();

创建一个对象,内存中会做的事:

1.加载class文件

2.声明局部变量

3.在堆内存中开辟一个空间

4.默认初始化

5.显示初始化

6.构造方法初始化(4.5.6.是对3.中的变量进行赋值)

7.将堆内存中的地址值赋值给左边的局部变量

多个对象的内存

新new一个对象,就在堆内存中新开辟一块空间,对应新的地址值。不过不需额外加载一次class字节码文件

两个引用指向同一个对象

Student stu2 = stu1;表示stu2也指向stu1指向的001(两个对象指向同一个地址,此时其中一个对象改变空间中的值,其他对象访问的就是改变后的值)

stu1 = null;表示将null赋值给了stu1的地址,意味着图中的红线断开

基本数据类型和引用数据类型的区别

基本数据类型的数据值是存储在自己的空间中的。

特点:赋值给其他变量,也是赋的真实的值

引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值。

特点:赋值给其他变量,赋的地址值

this的内存原理

this的本质:所在方法调用者的地址值

成员变量和局部变量

面向对象综合案例

souf::System.out.printf 两部分参数:

第一部分参数:要输出的内容%s(占位)

第二部分参数:填充的数据

ctrl + P : 展示方法所对应的参数

API

字符串

集合

相关推荐
CCSBRIDGE2 小时前
Magento2项目部署笔记
笔记
爱吃西瓜的小菜鸡2 小时前
【C语言】判断回文
c语言·学习·算法
小A1593 小时前
STM32完全学习——SPI接口的FLASH(DMA模式)
stm32·嵌入式硬件·学习
亦枫Leonlew3 小时前
微积分复习笔记 Calculus Volume 2 - 5.1 Sequences
笔记·数学·微积分
岁岁岁平安3 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA3 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
qq_589568103 小时前
数据可视化echarts学习笔记
学习·信息可视化·echarts
爱码小白3 小时前
网络编程(王铭东老师)笔记
服务器·网络·笔记
LuH11244 小时前
【论文阅读笔记】Learning to sample
论文阅读·笔记·图形渲染·点云
兔C4 小时前
微信小程序的轮播图学习报告
学习·微信小程序·小程序