初始化过程:
1. 初始化父类中的静态成员变量和静态代码块 ;
2. 初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;
案例:
public class Z extends X{
Y y = new Y();
Z () {
System.out.println("Z");
}
public static void main(String[] args) {
new Z();
}
}
public class X {
Y y = new Y();
X(){
System.out.println("X");
}
}
public class Y {
Y(){
System.out.println("Y");
}
}
程序运行时,控制台输出信息:
Y
X
Y
Z
类初始化过程
- 一个类要创建实例需要先加载并初始化该类
- main方法所在的类需要先加载和初始化
- 一个子类要初始化需要先初始化父类
- 一个类初始化就是执行<clinit>()方法
- <clinit>()方法由静态类变量显示赋值代码和静态代码块组成
- 类变量显示赋值代码和静态代码块代码从上到下顺序执行
- <clinit>()方法只执行一次
实例初始化过程
实例初始化就是执行<init>()方法
- <init>()方法可能重载有多个,有几个构造器就有几个<init>()方法
- <init>()方法由非静态实例变量显示赋值代码和非静态代码块代、对应构造器代码组成
- 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应构造器的代码最后执行
- 每次创建实例对象,调用对应构造器,执行的就是对应的<init>()方法
- <init>()方法的首行是super()或者super(实参列表),即对应父类的<init>()方法
方法的重写Override
哪些方法不可以被重写?
- final方法、静态方法、private等子类中的不可见方法
对象的多态性
- 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码
- 非静态方法默认的调用对象是this
- this对象在构造器或者说<init>方法中就是正在创建的对象
方法的参数传递机制
形参是基本数据类型:传递数据值
实参是引用数据类型:传递地址值;特殊的类型:String、包装类等对象不可变性
public static void main(String[] args) {
int i = 1;
String str = "hello";
Integer num = 200;
int[] arr = {1, 2, 3, 4, 5};
MyData my = new MyData();
change(i, str, num, arr, my);
System.out.println("i = " + i);
System.out.println("str = " + str);
System.out.println("num = " + num);
System.out.println("arr = " + Arrays.toString(arr));
System.out.println("my.a = " + my.a);
}
private static void change(int j, String s, Integer n, int[] a, MyData m) {
j += 1;
s += "world";
n += 1;
a[0] += 1;
m.a += 1;
}
static class MyData {
int a = 10;
}
/*输出结果
* i = 1
str = hello
num = 200
arr = [2, 2, 3, 4, 5]
my.a = 11
* */
成员变量与局部变量的区别
当局部变量与xx变量重名时,如何区分:
局部变量与实例变量重名:
在实例变量前面加'this.'
局部变量与类变量重名:
在类变量前面加'类名.'