当前页面: 开发资料首页 → J2SE 专题 → 给一段程序,关于java override 的,不理解为什么这样输出
给一段程序,关于java override 的,不理解为什么这样输出
摘要: 给一段程序,关于java override 的,不理解为什么这样输出
public class CalC
{
void amethod()
{
System.out.println("CalC.amethod");
}
CalC()
{
amethod();
System.out.println("Hu?");
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
CalC cc = new CalChild();
cc.amethod();
}
}
class CalChild extends CalC
{
void amethod()
{
System.out.println("CalChild.amethod");
}
}
output:
CalChild.amethod
Hu?
CalChild.amethod
为什么CalC Constructor调用的不是自己的amethod()呢
CalC()
{
amethod();
System.out.println("Hu?");
}
这是一个父类的构造方法,
当new 子类时,首先要对父类初始化!
所以调用顺序为
CalC()
{
amethod();
System.out.println("Hu?");
}
void amethod()
{
System.out.println("CalChild.amethod");
}
这是一个十分要注意的地方
很容易出问题
java中子类的构造把父类的构造覆盖啦。
我想问的是什么在父类构造器中调用自己的方法,会出现override呢,也就是说第一个输出为什么是CalChild.amethod,而不是CalC.amethod
第一个当然不是CalChild.amethod,你用子类void amethod()覆盖了父类的void amethod(),执行CalC cc = new CalChild();时导致构造函数在调用了子类的void amethod(),如果你把子类的void amethod()屏掉,就会是CalC.amethod拉
“我想问的是什么在父类构造器中调用自己的方法”
构造函数
程序运行时首先执行的该类的构造函数因为void amethod()override了所以就成了子类中的
void amethod()方法了
声明 private 就好了,就不会覆盖了
我们先来看语句 CalC cc = new CalChild(); 这句话可以分解成
CalC cc;
cc=new CalChild();
这样看意思就明显了:先声明CalC 的引用cc,再将引用cc指向CalC的子类CalChild的实例上。于是当我们使用语句cc.amethod();时就会自然而然的调用子类的amethod()方法。
当然还要明确子类在构造时会先初始化父类的。
楼上的没有好好看问什么问题呢
觉得 cwl_feng() 同学回答的最好 呵呵 一起学习ing
但依然没有说到点上;
方法在内存中只有一个备份,所以的对象都共享这个备份,为了区分开到底是哪个对象在调用这个方法,关键的地方就是this的使用。this把调用方法的上下文对应到当前对象上。
第二,调用java中的所有成员变量或者成员函数都隐含了this。
所以这个地方就很明了了:构造子类,this指针代表的当前对象是子类实例,子类实例为啥不调用自己overriding的方法呢?!
真是的了
CalC cc = new CalChild();这一步也叫“异类搜集”,以父类类型声明变量作为子类对象的引用,此时子类的所有属性方法都失效,只有子类中重写父类的这样一中方法可以被变量调用,而不调用父类的同名方法,从而实现多态!
此程序前后两次打印都是一个原理。。