站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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();这一步也叫“异类搜集”,以父类类型声明变量作为子类对象的引用,此时子类的所有属性方法都失效,只有子类中重写父类的这样一中方法可以被变量调用,而不调用父类的同名方法,从而实现多态!
此程序前后两次打印都是一个原理。。


↑返回目录
前一篇: 我不会,求一个结果 。我的代码都贴出来,能够使用的,我要的是”数据库连接哪个部分“怎样更改 对于我的代码 高效。。。。。。
后一篇: 在java中怎么将UTF编码转换为GB编码?