当前位置: 代码迷 >> J2SE >> 关于继承和多态的一个疑惑
  详细解决方案

关于继承和多态的一个疑惑

热度:130   发布时间:2016-04-23 20:21:57.0
关于继承和多态的一个疑惑,在线等

public class Print {
    public static void println(Object obj){
        System.out.println(obj);
    }
    public static void println(){
        System.out.println();
    }
    public static void print(Object obj){
        System.out.print(obj);
    }
}

上述代码是一个工具类,用来打印数据

public class Super {
    public int field = 0;
    public int getField(){return field;}
}

上述代码是一个简单的父类,一个整形成员变量,和一个获取该变量值的方法

public class Sub extends Super{
    public int field = 1;
    public int getField(){return field;}
    public int getSuperField(){return super.field;}
}

上述代码是一个子类,扩展了一个获取父类属性的方法

public class FieldAccess {
    public static void main(String[] args){
        Super sup = new Sub();
        println("sup.field = " + sup.field +
                ", sup.getField() = " + sup.getField());
        
        Sub sub = new Sub();
        println("sub.field = " + sub.field +
                ", sub.getField() = " + sub.getField() +
                ", sub.getSuperField() = " + sub.getSuperField());
    }
}

上述是程序入口,操作类。

sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0

上述是程序输出结果

我的疑惑是

 Super sup = new Sub();
        println("sup.field = " + sup.field +
                ", sup.getField() = " + sup.getField());

在这段代码输出的为何会是sup.field = 0, sup.getField() = 1,而不是
sup.field = 0, sup.getField() = 0,或者是sup.field = 1, sup.getField() = 1
------解决方案--------------------
在多态机制中(这里 Super sup = new Sub())
用 sup 调用的变量值(若子类和父类有相同的变量) 结果为 父类中的 变量 
 调用子类重写父类的方法时调用的是子类的方法
------解决方案--------------------
引用:
Quote: 引用:

这就是多态的典型体现,new的第一个量是继承自Super的Sub类,在执行sup.field时,由于父类“指针”指向子类对象,所以执行的应该是super的filed;而在执行sup.getSuperField()实际上由于子类Sub中重写了父类的getSuperFiled()方法,所以调用的应该是子类 Sub的的getSuperFiled()方法。


Super sup = new Sub(); 这里的sup是父类引用指向子类对象

sup.field; 那么这里的sup为什么会指向父类对象的field,而不是子类对象的field

sup.getField(); 那么这里为什么又指向了子类对象的getField()方法,而不是父类对象的getField()

既然在初始化时父类引用指向了子类对象,为何会出现既有指向父类对象的域,又有指向子类对象的域。为什么不同时指向子类对象,或者同时指向父类对象。

能说说为什么吗?不要只是单纯的现象。

变量和方法不一样,“多态是针对子类重写父类的方法的,但对变量则没有多态”(这句不是我说的)。
  相关解决方案