- 父类Parent;
- 子类Child 继承Parent;
- Test类测试;
Parent child = new Child();
class Parent{
static {
System.out.println("P-静态块");
}
{
System.out.println("P-非静态块");
}
public Parent(){
System.out.println("父类构造");
}
public void print(){
System.out.println("父类函数Print");
}
}
class Child extends Parent{
static {
System.out.println("Child-静态块");
}
{
System.out.println("Child-非静态块");
}
public Child(){
System.out.println("Child类构造");
}
public void print(){
System.out.println("子类函数Print");
}
}
public class Test{
static {
System.out.println("Test-静态块");
}
{
System.out.println("Test-非静态块");
}
public Test(){
System.out.println("Test类构造");
}
public static void main(String[] args) {
Parent child =new Child();
child.print();
}
}
运行结果如下:
Test-静态块
P-静态块
Child-静态块
P-非静态块
父类构造
Child-非静态块
Child类构造
子类函数Print
由此可见:
静态块:
- 优先级最高,永远被最先加载;
- 静态块是类的属性,只要是涉及到的类,都会被立刻加载(Test,Parent,Child);
- 而且只在类加载时加载一次,与类同生命周期。
非静态块:
构造函数:
- 当调用构造函数时,会先调用自己类里面的非静态块;
- 不初始化就不会调用,比如Test内的非静态块;
- 每次调用构造函数,就会调用非静态块,可以调用多次;
- 适用于创建对象之前在非静态块前清理;
P-非静态块
父类构造
Child-非静态块
Child类构造
多态:类内多态;
- Parent print()函数;
- Child print()函数;
Parent child = new Child();
会调用子类方法,覆盖父类;
静态、非静态方法;
- 实例方法覆盖实例方法;
- 静态方法覆盖静态方法;
- 不允许一个静态(static print)、一个非静态(print),会编译报错;
Error:(26, 18) java: Child中的print()无法覆盖Parent中的print()
被覆盖的方法为static
重载按照方法签名(方法名+参数 与static无关)因而一个静态(static print)、一个非静态(print)会被视为同一函数,但是不允许一个静态的 和非静态的同时存在,一个用类名、一个用实例变量,即使能调用,也失去了多态覆盖的意义;