零散的几个要点
- 类中的成员变量分为实例变量(非静态成员变量)、类变量(静态成员变量),且被定义时均有其对应类型的默认值。
- 在堆区new一个对象时,如 Person p = new Person(); 赋值号左侧的引用存放在栈区,右侧new出来的对象及其实例变量存放在堆区。
- 若一个引用数据类型的初始值为null,如 String str = null; 为一个空引用,即此String对象引用为空,不指向任何确定的堆区空间。
- 类中的非静态成员方法/属性为该类的每个对象所独有。
类中的静态成员方法/属性为该类的所有对象共享(包括null空对象),在类中只有唯一的一份。 - 使用null空对象调用类中的非静态方法/属性,会报空指针异常。原因:对象为空,则其对应的方法/属性不存在。
使用null对象调用类中的静态方法/属性,程序可以正常执行。原因:被static修饰过的方法/属性为该类的所有对象(包括空对象)所共有,可以通过此类的任意对象进行访问。
变量存放的内存区
- 方法中的变量(基本类型变量、引用变量)均为局部变量,存放在栈区
int num = 0; num为基本类型变量,存放在栈区
String str = “abc“; str为引用变量,存放在栈区(右侧的对象实体存放在堆区) - 堆区对象的实例变量为其实例对象所独有,存放在堆区。但仅当该对象被new出来时,其实例变量才会被存放到堆区。
- 类中的类变量为所有对象所共享,一经定义,就会被存放到方法区。
【类中的方法、类变量都存放在方法区中,实例变量存放在堆中】
static相关的几个要点
- 方法中不能定义static静态变量,无论静态方法 / 非静态方法。
原因:方法中的变量都是局部变量,存放在栈区,而static静态变量存放在方法区。 - 静态方法中只能访问静态变量/方法,不能访问非静态变量/方法。
非静态方法可以访问静态变量/方法。 - 在类中定义常量时,通常定义为全局常量,由static final同时修饰。且在定义时即赋值。
全局常量的命名规则:所有单词大写,以下划线分隔。
如:static final String BLOG_NAME=“bubble”; - static final修饰的全局变量是为所有对象共享的、不可修改的值。若未被final修饰,则每个对象都可以对此唯一的类变量进行修改,且各对象访问该变量时会同步看到此修改。
final修饰的变量 —— 常量,只能被赋值一次,赋值后不可修改。
final修饰的类 —— 最终类,不能被继承,没有子类。final类中的方法默认也被final修饰。
final修饰的方法 —— 不能被子类的方法重写,但可以被继承和重载。
实例变量与构造方法
- 当new出类的一个对象时,才会在堆区分配空间存放该对象的实例变量。
- 给实例变量定义好的初值就是在构造方法中完成赋值的。
new出一个对象会干的两件事:
1) 在堆区开辟一个空间用于存放此对象,此空间的大小由其实例变量(对应类型)决定
2)调用构造方法给所有的实例变量赋值
-无论有参构造 / 无参构造,在进入构造方法前,实例变量的值都为其对应类型的默认值。
-进入构造方法后,才会将定义好的初值赋给实例变量。
-对于有参构造,下一步还会执行赋值语句,将实参传入的指定值赋给实例变量。
(单步调试结果)
构造方法的几个要点
- 构造方法可以重载,但重载形式仅以“参数的个数”作区分。语义上“参数的类型”在定义变量时就已经指定好了,与“参数的顺序”也无关。
- 若根据“参数个数”的不同实现重载的构造方法中若出现了重复性代码,则可以在一个构造方法中使用 this(参数) 调用其他的构造方法。
但需注意:
1)this(参数); 调用其他构造方法的语句必须置于当前构造方法的首行
2)this(参数); 在多个构造方法之间的相互调用不能成“环”
Java中的四种代码块
- 普通代码块
定义在方法中,使用{}括起来的代码块。
1)普通代码块内的变量为局部变量,作用域仅为{}内部,出了{}即销毁。
2)普通代码块内的定义与外部是互相独立的,同名变量在普通代码块内外可各定义一次。
- 构造代码块
定义在类中,使用{}括起来的代码块。
1)优先于构造方法被执行。
【执行顺序:构造块 > 构造方法】
如:对于实例变量name:创建对象时被存放到堆区;执行构造块被赋值为“小猫”;执行构造方法被赋值覆盖为“小狗”。
2)每产生一个对象就会调用一次构造块,有多少个对象就调用多少次构造块。 - 静态代码块
定义在类中,被static修饰的{}代码块。
1)静态代码块随类的加载而执行,且只执行一次,与对象无关。
2)优先于构造块被执行。
【执行顺序:静态代码块 > 构造块 > 构造方法】
如:根据单步调试查看,当主方法中执行到第7行创建Animal对象时,先执行了静态代码块,才执行构造块,再执行构造方法。
静态变量number的值变化过程:在定义时即存放到方法区中,初值为10;主方法执行到第9行时用到了Animal类则进行类加载,静态代码块随之执行,number的值覆盖为100。
3)若主方法main所在的主类中也有静态代码块,虽然主方法为程序的入口,但仍然先执行静态代码块。原因:先有主类才有主方法。静态代码块在类加载时即执行。
【执行顺序(主类中):静态代码块 > 主方法】
4)多个静态代码块在编译后会合并成一个。
- 同步代码块
后续补充。