class A
{
public String vara="aaa";
void print(){
System.out.println(vara);
}
}class B extends A
{
public String vara="bbb";
void print(){
System.out.println(vara);
}
}public class Main { /**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
A ca=new A();
B cb=new B();
A cab=new B(); System.out.println("ca:"+ca.vara);
ca.print();
System.out.println("----------------------");
System.out.println("cb:"+cb.vara);
cb.print();
System.out.println("----------------------");
System.out.println("cab:"+cab.vara);
cab.print();
}}结果是
ca:aaa
aaa
----------------------
cb:bbb
bbb
----------------------
cab:aaa
bbb那么第三个是为什么是这样子呢?
具体实现过程原理是怎么样的啊?有点糊涂了
{
public String vara="aaa";
void print(){
System.out.println(vara);
}
}class B extends A
{
public String vara="bbb";
void print(){
System.out.println(vara);
}
}public class Main { /**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
A ca=new A();
B cb=new B();
A cab=new B(); System.out.println("ca:"+ca.vara);
ca.print();
System.out.println("----------------------");
System.out.println("cb:"+cb.vara);
cb.print();
System.out.println("----------------------");
System.out.println("cab:"+cab.vara);
cab.print();
}}结果是
ca:aaa
aaa
----------------------
cb:bbb
bbb
----------------------
cab:aaa
bbb那么第三个是为什么是这样子呢?
具体实现过程原理是怎么样的啊?有点糊涂了
楼主【liucs1985】截止到2008-07-16 21:01:49的历史汇总数据(不包括此帖):
发帖的总数量:5 发帖的总分数:20 每贴平均分数:4
回帖的总数量:5 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:5 结贴的总分数:20
无满意结贴数:4 无满意结贴分:80
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:80.00 % 无满意结分率:400.00%
敬礼!
cab = new B(); // 父类的引用(变量)cab当然可以指向其子类对象B
cab.print(); // 动态绑定(对方法有效),在运行时决定 有引用对象的类型(这里即B),而不是引用对象的变量(这里即A)的类型来决定调用哪个方法。
cab.vara; // 值域貌似只由引用变量的类型(这里即A)来决定
A cab=new B();
System.out.println("cab:"+cab.vara);
cab.print();
cab.vara直接访问的父类的成员vara,print()是方法,动态绑定,实际是调用的子类的方法print,它访问的是子类的vara
System.out.println("cab:"+cab.vara);
cab.print(); cb指向的cab的实例吗?那么
ca=(A)cab
ca指向的也是cab的实例
为什么结果会不同呢cb=(B)cab
具体的过程是怎么样的?
比如cb中vara变成了“bbb”或者“aaa”
print方法调用的vara是哪里的,怎么调用的之类
System.out.println("this is A's print method");
System.out.println(vara);
}
}class B extends A { public String vara = "bbb"; void print() {
System.out.println("this is B's print method");
System.out.println(vara);
System.out.println(super.vara);
}
}public class ClassMain { public static void main(String[] args) {
// TODO code application logic here
A cab = new B();
System.out.println("cab:" + cab.vara);
cab.print();
}
} 这个例子可能能说的更清楚些.
子类重写的方法中如果需要访问父类的成员,用super.vara 来访问.
你可以在父类的print方法和子类的方法里都加一些说明自己是哪个类的语句,这就明白调用的是哪个类的方法了.
System.out.println("cb:"+cb.vara);
cb.print(); 不好意思,更正上面的代码
ca=(B)cabca.print()方法是动态绑定还是静态绑定的?