多态时类成员的特点

1、成员变量。

编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边。

class Parent{
    int ID = 1;//如果没有这句,编译出错

}

class Child extends Parent{
    int ID = 2;
}

public class test{
    public static void main(String[] args){
        Parent p = new Child();
        System.out.println("ID="+p.ID);
    }
}

运行结果:
ID=1
注意:在多态中,覆盖的是成员函数,成员变量是没有覆盖的。

2、成员函数(非静态)。

编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。
因为成员函数存在覆盖特性。

class Parent{
    int ID = 1;
    public void show(){       //如果没有show这个函数,编译出错
        System.out.println("Parent");
    }

}

class Child extends Parent{
    int ID = 2;
    public void show(){       
        System.out.println("Child");
    }
}

public class test{
    public static void main(String[] args){
        Parent p = new Child();
        p.show();
    }
}

运行结果:
Child

class Parent{
    int ID = 1;
    public void show(){
        System.out.println("Parent");
    }

}

class Child extends Parent{
    int ID = 2;
    /* public void show(){
        System.out.println("Child");
    } */
}

public class test{
    public static void main(String[] args){
        Parent p = new Child();
        p.show();
    }
}

运行结果:
Parent
总结:多态时是先去子类中找方法,如果子类中没有会使用父类中的方法。

3、静态函数。

编译时:参考引用型变量所属的类中的是否有调用的静态方法。
运行时:参考引用型变量所属的类中的是否有调用的静态方法。
简单说:编译和运行都看左边。

class Parent{
    int ID = 1;
    static void show(){
        System.out.println("Parent");
    }

}

class Child extends Parent{
    int ID = 2;
    static void show(){
        System.out.println("Child");
    }
}

public class test{
    public static void main(String[] args){
        Parent p = new Child();
        p.show();
    }
}

运行结果:
Parent
总结:其实对于静态方法,是不需要对象的,直接用类名调用即可。

你可能感兴趣的:(多态)