动态绑定
- 动态绑定,是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法
- Animal animal = new Cat();
- animal.eat();
类对象的加载
public class StaticDemo {
private static StaticDemo instance = new StaticDemo();
static int n1;
static int n2 = 3;
private static StaticDemo instance2 = new StaticDemo();
int n3;
int n4 = 5;
public StaticDemo() {
System.out.println("------构造------");
System.out.println(++n1);
System.out.println(++n2);
System.out.println(++n3);
System.out.println(++n4);
}
public static StaticDemo getInstance(){
return instance;
}
public static void main(String[] args) {
StaticDemo instance = StaticDemo.getInstance();
System.out.println("--------main---------");
System.out.println(n1);
System.out.println(n2);
System.out.println(instance.n3);
System.out.println(instance.n4);
System.out.println(instance2.n3);
System.out.println(instance2.n4);
}
}
//////////////////////////////////////////////////
------构造------
1
1
1
6
------构造------
2
4
1
6
--------main---------
2
4
1
6
1
6
////////////////////////////////////////////////////
分析:
1、先对static按照文件中顺序,先默认初始化,再显示初始化。
2、显示初始化时,创建对象,则接下来继续执行如下:
1)对成员变量默认初始化
2)对成员显示初始化
3)执行构造方法
局部内部类访问局部变量,局部变量必须被final修饰
因为局部变量会随着方法的调用结束而消失,这个时候,局部对象还没有从堆内存中消失,还要使用那个局部变量。为了让数据还能继续使用,使用final修饰,这样在堆内存里存储的实际上是一个常量值。(可通过反编译查看)