java多态部分理解

1. 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

2. 向上转型

public class Wine {
    public void fun1(){
        System.out.println("Wine 的Fun.....");
        fun2();
    } 

    public void fun2(){
        System.out.println("Wine 的Fun2...");
    }
}

class JNC extends Wine{
    /**
     * @desc 子类重写父类方法
     *        父类中不存在该方法,向上转型后,父类是不能引用该方法的
     * @param a
     * @return void
     */
    public void fun1(String a){
        System.out.println("JNC 的 Fun1...");
        fun2();
    }

    /**
     * 子类重写父类方法
     * 指向子类的父类引用调用fun2时,必定是调用该方法
     */
    public void fun2(){
        System.out.println("JNC 的Fun2...");
    }
}

class Test {
    public static void main(String[] args) {
        Wine a = new JNC();
        a.fun1();
    }
}

//====================================================================
结果:Wine 的Fun.....
     JNC 的Fun2...

分析:在这个程序中子类JNC重载了父类Wine的方法fun1(),重写fun2(),而且重载后的fun1(String a)与 fun1()不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行JNC的Wine类型引用是不能引用fun1(String a)方法。而子类JNC重写了fun2() ,那么指向JNC的Wine引用会调用JNC中fun2()方法。

public class Wine {
    public void fun1(){
        System.out.println("Wine 的Fun.....");
        fun2();
    }

    public void fun2(){
        System.out.println("Wine 的Fun2...");
    }
}

class JNC extends Wine{
    /**
     * @desc 子类重写父类方法
     *        父类中不存在该方法,向上转型后,父类是不能引用该方法的
     * @param 
     * @return void
     */
    public void fun1(){//改为重写,非重载
        System.out.println("JNC 的 Fun1...");
        fun2();
    }

    /**
     * 子类重写父类方法
     * 指向子类的父类引用调用fun2时,必定是调用该方法
     */
    public void fun2(){
        System.out.println("JNC 的Fun2...");
    }
}

class Test {
    public static void main(String[] args) {
        Wine a = new JNC();
        a.fun1();
    }
}

//===============================================================================
输出:JNC 的 Fun1...
	 JNC 的Fun2...

总结:指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。(子类中有的,父类没有,无法使用。子类有,父类有,使用子类中的方法)

牢牢记住一句话:无论向上向下转型,编译看左边,运行看右边。
意思就是:编译时候左边的对象有没有该方法(不严谨),运行时候看new的对象是谁,就调用谁的方法

文章借鉴点击跳转

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章