Java 多态绑定的一个问题

来源:百度知道 编辑:UC知道 时间:2024/06/07 18:22:56
public class Test{
public static void main(String[] args){
sup a = new sup();
System.out.println(a.value+","+a.f()+","+a.h());
sup b = new sub();
System.out.println(b.value+","+b.f()+","+b.h());
sub c = new sub();
System.out.println(c.value+","+c.f()+","+c.g()+","+c.h());
}
}

class sup{
public int value = 0;
public int f(){return value;}
public String h(){return "sup";}
}

class sub extends sup{
public int value = 1;
public int f(){return value;}
public int g(){return super.value;}
public String h(){return "sub";}
}

结果是 0,0,sup
0,1,sub
1,1,0,sub
为什么结果不会是 0,0,sup
1,1,sub
1,1,0,sub
b不是引用sub型的吗,那b.value应该是1,如果b是sup型的那结果也应该是0,0,sup

方法有多态,但属性是不存在多态的.
访问谁的属性取决于声明的对象类型,跟用谁去实例化无关
说明白了没?

方法才会被覆盖,变量不会
可以说,b的变量是sup里的,因为b是sup类型,b的方法是sub 里的,因为被sub 覆盖了

这个就是方法的覆盖,sup b = new sub(); 这一句是
上溯造型,也就相当于
sup a = null;
sub b = new sub();
a = b;
这样如果子类又重写父类的方法,那么我们在调用的时候
实际访问到的就是子类中的这个方法,如果子类没对重写父
类的方法,那么我们看到的就是父类方法

sup b = new sub();
因为b是一个sup对象,但指向的是一个sub实例。多态是子类重写父类方法,父类对象指向子类实例,这样调用方法时会根据指向的实例调用相应子类的方法。但是它还是一个父类对象。

b 是sup b=new sub(); b这个对象本身是sup.
sup是sub的基类,派生类都可以向上转型的,所以这里sup b=new sub()不报错,因为sub向上转型了。这里如果你把sub() 改为一个非sup派生类,这里编译器会报错,说不能转型的。
详细信息在 thinking in java 4th 第165页开始的那一章

另外楼上的回答有误,b是sup对象,new sub() 这里是sub向上转型了,所以这里你如果输出b.g()是报错的

支持5楼!