| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5968 人关注过本帖
标题:子类实例化父类时之不解
只看楼主 加入收藏
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 

要想弄懂这个问题,要好好研究一下class文件的结构,JAVA虚拟机规范里面有讲,但是偶还没有细致的研究过。。调用super()方法是来确保父类在子类中的成员能得到初始化,当存在多态的时候子类的this和夫类的this应该是做了某一种关联,因为this是一个常量,所以是不能改变它的值的,当有多态的时候,子类和夫类的this都是关联到了子类对象。。所以super()的时候可以其实用的还是夫类的this,因为只有夫类的this,夫类才可以访问,而子类的this夫类构造器里是无法访问的。。并且不知道大家有没有发现当存在多态的时候,类加载机制都会发生变化,并不是我们所说的当用到的时候才加载到内存,当存在多态的时候,编译器会做一定的优化,这样以来当程序启动的时候设计到多态的夫类和子类就已经加载到内存中了,并不是等用到的时候才加载。。


最后再说说我对JAVA的理解,其实我觉得你以后想底层的话,可以先学编译原理什么的,然后在学JVM具体怎么实现的。当然这还要有点汇编(以前我觉得我学习汇编都没有什么用,只从我看了JVM指令后,我才发现汇编的用处,JVM到最后都是解释为了汇编指令,然后再是机器指令)。不过我觉得学JAVA其实就好建造楼房,那些砖头都已经生产好了,我们所需要做的就是用砖头建造楼房,而不是建造砖头,而学习如何建造楼房的问题就设计到了真正一个架构师的灵魂:设计模式。这才是关键,可以说不学设计模式,写出来的代码只有功能,没有什么性能。当然还要要学点DDD什么的。这也是偶的一点看法。。。不对的地方请多包含。。

[此贴子已经被作者于2007-8-28 14:36:15编辑过]

2007-08-28 14:21
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
我本来不想说了,但是看到andywu兄弟学习的热情,确实值得佩服。。遇到问题的这种追求本源的精神,确实很好。。不过andywu兄弟如果一时将搞不懂也没什么,也许你过段时间回来想,一下子心里明白了好多。。
2007-08-28 14:27
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 

[CODE]class Father {

public Father() {
this("@@@");
//callFather();
System.out.println(this.getClass() + " +super");
}

public Father(String s) {
System.out.println(this.getClass() + " +@@@");
}

/* public void callFather() {
System.out.println("call father!");
System.out.println(this + " +callFather");
}*/
}
class Son extends Father {

public Son() {
super();
System.out.println(this.getClass() + " +this");
}
public Son(String str){
super(str);
System.out.println("Son"+str);
}

public void callFather() {
System.out.println("call son!");
System.out.println(this + " +callSon");
}
}
public class Init {
public static void main(String[] args) {
Father father = new Son();
//Father father=new Father();
System.out.println(father.getClass() + " +new");
//System.out.println(f + " +new");
}
}[/CODE]

打印结果
class Son +@@@
class Son +super
class Son +this
class Son +new

貌似this都是子类的。
但是如果this是子类的话,this("@@@");却是调用的父类的构造函数。。。

也被搞混了。学深了再理解吧。。。先照版主说的两个this有联系理解吧。。。

2007-08-28 14:48
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
class Father {

public Father() {
this("@@@");
//callFather();
System.out.println(this.getClass() + " +super");
}

public Father(String s) {
System.out.println(this.getClass() + " +@@@");
}

/* public void callFather() {
System.out.println("call father!");
System.out.println(Father.this + " +callFather");//这个地方的this实际上是夫类的,只不过多态使得两个this关联到子类对象。如果改为Son.this就不能访问。
}*/
}
class Son extends Father {

public Son() {
super();
System.out.println(this.getClass() + " +this");
}
public Son(String str){
super(str);
System.out.println("Son"+str);
}

public void callFather() {
System.out.println("call son!");
System.out.println(Son.this + " +callSon");//这个this是son的,和夫类的this都关联到了子类对象,如果是Father.this是不能访问的。
}
}
public class Init {
public static void main(String[] args) {
Father father = new Son();
//Father father=new Father();
System.out.println(father.getClass() + " +new");
//System.out.println(f + " +new");
}
}

[此贴子已经被作者于2007-8-28 14:54:54编辑过]

2007-08-28 14:53
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
以下是引用huwangvs在2007-8-28 14:48:16的发言:

[CODE]class Father {

public Father() {
this("@@@");
//callFather();
System.out.println(this.getClass() + " +super");
}

public Father(String s) {
System.out.println(this.getClass() + " +@@@");
}

/* public void callFather() {
System.out.println("call father!");
System.out.println(this + " +callFather");
}*/
}
class Son extends Father {

public Son() {
super();
System.out.println(this.getClass() + " +this");
}
public Son(String str){
super(str);
System.out.println("Son"+str);
}

public void callFather() {
System.out.println("call son!");
System.out.println(this + " +callSon");
}
}
public class Init {
public static void main(String[] args) {
Father father = new Son();
//Father father=new Father();
System.out.println(father.getClass() + " +new");
//System.out.println(f + " +new");
}
}[/CODE]

打印结果
class Son +@@@
class Son +super
class Son +this
class Son +new

貌似this都是子类的。
但是如果this是子类的话,this("@@@");却是调用的父类的构造函数。。。

也被搞混了。学深了再理解吧。。。先照版主说的两个this有联系理解吧。。。

对,理解就行了,只要不妨碍我们写程序就行哈哈。。有时候理解的越深对于写程序越没有好处。哈哈。。

2007-08-28 15:02
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
顺便问下。所谓的设计模式是否是类的设计之类??
我写程序感觉很乱啊,可以说没思路。计算器,画板什么的都能写出来,就是感觉没条理。。。
想不出像书上那样好的类的设计,像什么时候设计成抽象类,什么时候用静态的。。。。
痛苦中。。。
2007-08-28 15:31
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
所谓设计模式就是如何处理你的类之间的关系,如果用已经存在的代码来扩展功能(当然这种扩展不能影响客户端的代码)。。用设计模式的好处我觉得最主要是使的系统维护性,可扩展性更好,当客户要求变化的时候,只修改一小点代码,就可以让系统发生大的变化,当然要想到这一步是很漫长的,设计模式也不能专门的学习,要在项目中总结经验,毕竟设计模式也是前辈们总结出来的经验。。想抽象类以及接口都是用来实现面向接口编程的。。当做项目时一般先制定一写接口,然后用类去实现接口,这样接口和实现分离,等要扩展的时候接口没有变,但是实现类可以变。。建议兄弟看看GOF的23中设计模式,我也正在看呢。看了觉得思路上可以清晰好多。。至少不像以前写完程序以后,连自己都觉得自己写的烂,没有扩充的余地,只有功能没有性能。。。
2007-08-28 15:38
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 

当然这仅仅是我的一点点理解,也许有错误,只是和你分享一下,huwangvs兄弟可以的批评的接受。呵呵。。

2007-08-28 15:39
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 

现在就这种感觉,功能是实现。。就是感觉程序写得太次了。。。。层次设计得太烂了。有些功能还实现得特复杂。。。
再看书上的程序。。简直没法比。。汗。。。
GOF的23中设计模式 全名叫什么???

2007-08-28 15:50
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
全称应该是《设计模式》不过是C++语言写的。。如果你学过C++的话,可以看。。如果没有学过,那就看JAVA与模式。。阎宏出的。。
2007-08-28 15:57
快速回复:子类实例化父类时之不解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045054 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved