class Base{
int i =99;
public void amethod(){
System.out.println("Base.amethod()");
}
}
public class RType extends Base{
int i =-1;
public static void main(String []args){
Base b = new RType ();
System.out.println(b.i);
b.amethod();
}
public void amethod(){
System.out.println("RType.amethod()");
}
}最后结果是:
99
RType.amethod()");对于Base b = new RType ();这一句b到底是属于谁的对象?为什么b.i=99 但是却调用了RType的方法?
int i =99;
public void amethod(){
System.out.println("Base.amethod()");
}
}
public class RType extends Base{
int i =-1;
public static void main(String []args){
Base b = new RType ();
System.out.println(b.i);
b.amethod();
}
public void amethod(){
System.out.println("RType.amethod()");
}
}最后结果是:
99
RType.amethod()");对于Base b = new RType ();这一句b到底是属于谁的对象?为什么b.i=99 但是却调用了RType的方法?
属性不能被覆盖
((RType) b).i == -1
当然是子类的对象;即 RType
为什么b.i=99 但是却调用了RType的方法?
Java里方法是动态绑定的,不管引用是父类类型还是子类的
调用方法都是子类的(重写的方法);
至于为什么b.i=99 是因为父类的引用只能指向父类的成员
这里叫 擦除
想显示子类的属性 就得 ((RType) b).i ;
如果 RType b = new RType ();想调用父类的属性就得 ((Base)b).i 这叫恢复
其实b里有两个 i 在堆中以 super.i 和 this.i 分辨的
记着一句话
方法决定于对象类型BTW 不建议在子类中用和父类同名的成员属性
同名属性决定于引用类型
tks学习你的态度和技术!
这里是多态,多态的条件有三个:继承、重写、父类的引用指向子类对象。这里满足这三个条件。所以b是类RType的对象
在RType中
class RType extends Base
{
other(){
}
}
你能够通过
b.other();访问么?
个人感觉应该是父类对象的引用