面相对象继承问题,新手求助

yishenqian 2017-08-13 11:57:54

如图所示,为啥输出结果是0
0
222
我怎么觉得是22
22
222啊为啥前面两个会是0呢?
求大神解答
...全文
195 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由自在_Yu 2017-08-14
  • 打赏
  • 举报
回复
public class Testa {
	public static void main(String[] args) {
		new Derived();
		System.out.println("****************************");
		Derived d = new Derived();
		d.display();
	}
}
class Base{
	public int i = 2;
	 public Base(){
		 System.out.println("-----1----i:"+i);
		 display();
	 }
	 public void display(){
		 System.out.println("-----4----i:"+i);
		 System.out.println(i);
	 }
}

class Derived extends Base{
	private int i = 22;
	
	public Derived(){
		System.out.println("-----2----i:"+i);
		i = 222;
	}
	public void display(){
		System.out.println("-----3----i:"+i);
		System.out.println(i);
	}
}
这样就看出来执行过程了,创建new Derived();时, 结果: -----1----i:2 -----3----i:0 0 -----2----i:22 会先执行父类的构造方法,public Base();这里调用display();是子类Derived的方法, 因为这个方法时子类中重写了,所以会执行子类的display();然后才会执行子类的构造方法。 至于Derived d = new Derived();是和new Derived();一样的 -----1----i:2 -----3----i:0 0 -----2----i:22 -----3----i:222 222 执行public Derived();之后,i=222,然后执行d.display(); 就是子类Derived的display方法
yishenqian 2017-08-14
  • 打赏
  • 举报
回复
可以和我说一遍执行过程么
李德胜1995 2017-08-14
  • 打赏
  • 举报
回复
new Drived()执行时先调用父类的构造器,Base构造器调用的display()方法被子类Drived重写了,所以执行到子类的display方法,System.out.println(i);打印的是子类的实例成员i,private int i=22还没执行,所以i是初始值0....可以尝试把private int i=22;注释掉,System.out.println(i);打印的是父类的实例成员i,private int i=2;已经执行了,可以打印出2来。。。
设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相 关的对象,以适当的粒度将它们归类,再定义类的接口和继承层次,建立对象之间的基本关 系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。 你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下 子就得到复用性和灵活性好的设计,即使不是不可能的至少也是非常困难的。一个设计在最 终完成之前常要被复用好几次,而且每一次都有所修改。 有经验的面向对象设计者的确能做出良好的设计,而新手则面对众多选择无从下手,总 是求助于以前使用过的非面向对象技术。新手需要花费较长时间领会良好的面向对象设计是 怎么回事。有经验的设计者显然知道一些新手所不知道的东西,这又是什么呢? 内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用过的解 决方案。当找到一个好的解决方案,他们会一遍又一遍地使用。这些经验是他们成为内行的 部分原因。因此,你会在许多面向对象系统中看到类和相互通信的对象( c o m m u n i c a t i n g o b j e c t)的重复模式。这些模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复 用性更好。它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。 一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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