用父类声明对象和用子类声明对象.我的理解对嘛?

ZMAK_Chun 2008-04-28 11:25:47
class Father{
int i=10;
public void printInfo(){
System.out.println("In Father");
}
}

class Son extends Father{
int i=20;
public void printInfo(){
System.out.println("In Son");
}
}

class Test{
public static void main(String args[]){
Son mySon=new Son(); //调用子类的变量和子类的方法
Father myFather=new Father(); //调用父类的变量和方法的方法
Father myFather2=mySon; //调用父类的变量和子类的方法
//mySon
System.out.println(mySon.i);
mySon.printInfo();
System.out.println();
//myFather
System.out.println(myFather.i);
myFather.printInfo();
System.out.println();
//myFather2
System.out.println(myFather2.i);
myFather2.printInfo();
System.out.println();


}
}
...全文
129 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shine_Panda 2008-04-28
  • 打赏
  • 举报
回复
No problem!
hmsuccess 2008-04-28
  • 打赏
  • 举报
回复
向上转型和向下转型问题,呵呵,学习 AWUSOFT
sunboy_yf 2008-04-28
  • 打赏
  • 举报
回复
实际上是这么调用的,呵呵。
通过引用类型的变量来访问所引用对象的方法和属性的时候,jvm采用以下绑定规则。
实例方法与引用变量实际引用的对象的方法绑定,动态绑定,因为是在运行时由jvm动态决定的
静态方法,成员变量(静态和实例变量)与引用变量所声明的静态方法和成员变量绑定,这用绑定是在编译阶段做的绑定,是静态绑定。

但是java编译器编译的时候都是按照声明的引用变量来处理的。
例如
在Father类中如果没有i=10的话,
Son类有i=20
System.out.println(myFather2.i);
上面这句话在编译的时候就报错,编译都是无法通过的。



ratzip 2008-04-28
  • 打赏
  • 举报
回复
这样写是可以的
ratzip 2008-04-28
  • 打赏
  • 举报
回复
这样写是可以的
Inhibitory 2008-04-28
  • 打赏
  • 举报
回复
恭喜你, 完全正确。
awusoft 2008-04-28
  • 打赏
  • 举报
回复
这样去记,首先都是访问本身类的东西(方法与属性)的.(父类定义就调用父类的,子类定义的话就调用子类的)


当一个父类定义的变量引用一个子类实例时,调用一个方法时,这个方法将会调用子类,因为方法被覆盖.

情况就特殊在父类定义变量,而引用子类对像的时候.
Father(父类) myFather = new Son(子类)();
aipb2008 2008-04-28
  • 打赏
  • 举报
回复
“调用”一词是沿用面向过程中的叫法。
在面向对象中,可以吧函数调用理解为“消息传递”。

Father f = new Father();
f.method(); //可以理解为向对象f发送method消息,实际的调用是 method(f),
//括号里是放松消息的目标对象
f = new Son();
f.method(); //method(f),这里f对象实际是Son,所以是把消息发送给Son对象,自然调用的子类方法

这样似乎比较好理解继承中的方法调用问题。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧