class Base{
int i=99;
public void amethod(){
System.out.println("Base.amethod()");;
}
Base(){
amethod();
}
}
public class Derived extends Base {
int i=-1;
public static void main(String[] args) {
// TODO Auto-generated method stub
Base b=new Derived();
System.out.println(b.i);
b.amethod();
}
public void amethod(){
System.out.println("Derived.amethod()");
}
}
解决方案 »
- PCJAVA游戏Minecraft点联网闪退,根目录生成hs_err_pidXXX.log何解?
- 要求写一个正则表达式
- 计算器的问题!
- 想开发一个背单词的软件,用什么方式存储数据?
- 各位,书上说可以这样给数组赋值的我试了怎么不可以啊?
- 关于applet.ser
- Java中怎么输入一个字符串
- 数字转换成大写程序缺陷疑问
- 线程死锁
- 请问如何将float型的数据转换为int型的?
- 计算a++的问题..
- jdbc中Statement.createStatement()的问题ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.TYPE_SCORLL_SENSITIVE的区别
在这种情况下,涉及的任何域,比如i,都会指向Base 类中的值,但是方法的调用将
会指向实际类(Derived)中的方法而不是引用句柄(Base)中的方法。
Derived.amethod()
99
Derived.amethod()我想这是一个在继承中多态的表现
父类的非私有化属性和方法可以默认继承到子类。
父类的构造方法子类不可以继承,更不存在覆盖的问题。(非构造方法可以)
当构造一个对象的时候,系统先构造父类对象,再构造子类对象。
构造一个对象的顺序:(注意:构造父类对象的时候也是这几步)
① 递归地构造父类对象;
② 顺序地调用本类成员属性赋初值语句;
③ 本类的构造方法。所以构造方法先运行父类再运行子类是因为构造方法是无法覆盖的
所以结果:
第一行:其实是调用了父类的构造方法,再由构造方法调用定义的这个方法
有因为调用了相同的方法,这里子类覆盖了父类的方法。所以出现了子类方法的结果。第二行:但是不能重写父类中的属性的值,这就是为什么调用了b.i的时候是调用的父类的中的i的值,第三个:是直接调用了父类中被覆盖的方法,其实和构造方法是相同的结果,只是方式不同。至于你说的 amethod()在哪调用是不是一样的结果不知道你指的‘哪’是在哪里呢?
但我做了一个实验:就是将
Base b=new Derived();
System.out.println(b.i);
b.amethod();
第一行改成:Derived b=new Derived();下面相同出现的结果是:
Derived.amethod()
-1
Derived.amethod()
这里说明了Derived 类的实例但是把它赋予一个指向Derived类的引用所以i是指向Derived中的值。
楼上的能说明白些吗,
"第二行:但是不能重写父类中的属性的值,这就是为什么调用了b.i的时候是调用的父类的中的i的值, "
为什么不能新给值?? 看来我要重新复习下向上转型的知识了