javase多态

Father father=new Son()  父类引用指向子类对象实现多态(动态绑定)

"编译看左运行看右"

public class Father {

    public void doing() {
        talking();
    }

    public void talking() {
        System.out.println("father is talking!");
    }
}

public class Son extends Father {

    @Override
    public void talking() {
        System.out.println("Son is talking!");
    }

    public static void main(String[] args) {
        Father father = new Son();
        father.doing();
       //输出结果为   Son is talking!
    }
}

编译看左运行看右(但是成员变量除外,父类引用指向子类对象时)

class Fu {
    int value=100;
}
 class Zi extends Fu{
    int value=999;
}

public class Demo04 {
    public static void main(String[] args) {
        Fu fu=new Zi();
        System.out.println(fu.value);
        //输出结果为100成员变量无法实现多态,但成员方法可以
    }
}

向上转型绝对安全,向下转型有可能会抛出ClassCastException异常

class Useful {
    public void f() {
    }
    public void g() {
    }
}
class MoreUseful extends Useful {
    @Override
    public void f() {
    }
    @Override
    public void g() {
    }
    public void u() {
    }
    public void v() {
    }
    public void w() {
    }
}
public class RTTI_Test {
    public static void main(String[] args) {
        Useful[] usefuls={
                new Useful(),
                new MoreUseful(),
        };
        usefuls[0].f();
        usefuls[1].f();
        ((MoreUseful)usefuls[0]).v(); //向下转型错误,抛出ClassCastException异常
        ((MoreUseful)usefuls[1]).v();
    }
}

父类构造方法尽量避免使用public修饰的方法.

可使用final或private修饰的方法,因为父类构造器调用被重写的方法后,可能子类方法中的子类成员变量还未被初始化.

 

 

你可能感兴趣的:(Java基础,java多态,java父类引用指向子类对象)