java 多态缺陷

一,会覆盖私有方法


package object;


class Derive extends Polymorphism{
public void f1()
{
System.out.println("I am Derive");
}


}
public class Polymorphism{
private void f1()
{
System.out.println("I am Polymorphism");
}
public static void main(String[] args)
{
Polymorphism d = new Derive();
d.f1();
}


}/* output:
I am Polymorphism
*///:~

 

二.域与静态方法,一旦你访问某个域,这个访问就将在编译期进行解析,这种情况通常不会发生,因为通常将域设为private,只能通过方法访问域

package object;

class Base{
    public int i = 0;
    public int get(){return i;}
}
class Base2 extends Base{
    public int i =2;
    public int get(){return i;}
    public int get1(){return super.i;}
}

public class Polymorphism{
    public static void main(String[] args)
    {
        Base b1 = new Base2(); //当Base2转型为Base时任何域访问操作都将由编译器解析,因此不是多态的
//
,在本例中,Base2.get()和Base1.get分配了不同的存储空间
System.out.println(b1.get()+" " + b1.i); Base2 b2 = new Base2(); System.out.println(b2.get()+" " + b2.i + " "+ b2.get1()); } }/* output: 2 0 2 2 0 */

 当某个方法时静态的,它的行为就不具有多态性

package object;

class Base{
    public static int i = 0;
    public static  String get(){return " " + i;}
}
class Base2 extends Base{
    public static int i =2;
    public  static String get(){return " " + i;}
    public int get1(){return super.i;}
}

public class Polymorphism{
    public static void main(String[] args)
    {
        Base b1 = new Base2();
        Base.get();
         System.out.println(b1.get());
        Base2 b2 = new Base2();
        System.out.println(b2.get());
    }
}/* output:
 0
 2
*/
原文地址:https://www.cnblogs.com/jiangfeilong/p/10201123.html