面向对象:多态、初始化块

Java引用变量有两个类型,一个是编译时类型,一个是运行时类型。编译时类型由声明该变量的使用类型决定,运行时类型由实际赋给该变量的对象决定。编译时与运行时类型不一样则多态。

多态是子类对象赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转由系统自动完成。

相同类型的变量、调用同一个方法呈现出不同的特征,这就是多态。

class FatherClass{
    public void method(){
        System.out.println("父类方法");
    }
}
public class SonClass extends FatherClass{
    public void method(){
        System.out.println("子类方法");
    }
    public static void main(String[] args){
        //多态
        FatherClass fc = new SonClass();
        fc.method();
    }
}

与方法不同,对象的实例变量不具有多态性。

class FatherClass{
    int a = 100;
}
public class SonClass2 extends FatherClass{
    int a = 10;
    
    public static void main(String[] args){
        FatherClass fc = new SonClass2();
        //输出100
        System.out.println(fc.a);
    }
}

强制类型转换

基本的数据类型转换只能在数值类型之间,引用类型转换必须是子类实例才行。

初始化块

使用初始化块

public class CHUSHIUHUAKUAI{
    {
        //初始化块
    }
}

当创建Java对象时,系统总是先调用该类里定义的初始化块。

初始化块总是在构造器执行之前执行。系统同样可以使用初始化块进行对象的初始化操作。

如果初始化块使用static修饰,则这个初始化块编程静态初始化块,也被称为类初始化块。普通初始化块负责对对象执行初始化,静态初始化块负责对类进行初始化。

class FatherClass{
    static{
        System.out.println("父类静态初始化块");
    }
    
    {
        System.out.println("父类普通初始化块");
    }
    
    public FatherClass(){
        System.out.println("父类构造方法");
    }
}

public class SonClass3 extends FatherClass{
    static{
        System.out.println("子类静态初始化块");
    }
    
    {
        System.out.println("子类普通初始化块");
    }
    public SonClass3(){
        System.out.println("子类构造方法");
    }
    public static void main(String[] args){
        SonClass3 sc = new SonClass3();
    }
}

执行顺序:父类静态初始化块, 子类静态初始化块, 父类普通初始化块, 父类构造方法, 子类普通初始化块, 子类构造方法。

猜你喜欢

转载自www.cnblogs.com/zaijie/p/11032376.html