问题描述
由于是初学者,所以有些表述可能有误,都只是自己的一些理解。我是纯初学者,看过两个星期的C++,之前也学过C。感觉看C++的时候,更容易去理解C++中的面向对象技术的实现,但看JAVA的时候,可能隔着一层虚拟机,有些实现很难理解。第一个问题:我了解到一个对象里面,隐含了一个引用this,可以用this来特别地引用本对象的成员或者函数,然后还有一个super关键字,书上说这个关键字不是一个引用,但怎么看都感觉这个super是一个指向本对象的父类类型的引用。我想问这个super到底是什么,如果是一个变量,他属于什么类型的,在内存中如何存在?我为什么想知道这个问题的答案呢,这个源于多态。当我new一个子类对象,并用一个父类引用指向该对象的时候,那么可以根据这个引用来调用在子类中定义并覆盖的具有相同函数签名的函数。百度一下,有人说这个是因为对象中包含一个函数列表(在C++中叫做虚函数列表),这个列表就是一个指针数组,指向了各个可以被覆盖的函数的地址(C++中对应虚函数)。在调用对象的方法时,根据该对象包含的函数列表来寻找对应函数签名的函数,进而调用。他们的描述中,一般是这样的:函数列表从上往下的顺序与定义时候一样,先放父类中的函数,再放子类的函数;如果子类有覆盖父类的某个函数,则函数列表中,被覆盖的函数的位置就如同覆盖一样,放在父类被覆盖的函数应该放置的位置。也就是说子类中的函数列表中不包括父类中被覆盖的函数地址。按照这种说法,用super关键字如何找到父类中被覆盖的那个方法地址呢?所以我感觉不单纯是这种函数列表的形式。这种形式是C++中的,C++中的虚函数被子类覆盖了的话,就是真正的被覆盖了,子类对象无法调用父类对象的被覆盖的方法。(当然,很多时候可能并没有必要通过子类对象来调用父类对象中被覆盖的方法,但这里我只是想知道一些可能的实现机制)Java中的函数列表是由虚拟机来加载控制的吗?关于这些,我想有一个详细的了解。第二个问题:代码复用可以通过组合和继承两种方式。继承的话可以通过动态绑定实现多态,从而提高代码的可扩展性。组合相当于一个类包含了另一个类,在这一点上和继承很像。在构造一个组合而成的类的时候,相当于构造了一个大的对象,这个对象内部包含一个小对象的引用,这个引用指向的小对象也被构造出来。相比较组合的类的这个构造以及初始化过程。继承的子类在构造的时候,是什么样的方式呢?是不是申请一整块内存,然后通过调用父类和子类的构造函数给内存中的各个变量赋值吗?继承的子类在初始化的时候是不是一次性分配一个连续内存,然后通过不同层次的构造函数逐一初始化。而组合的好像是每一层有一次内存分配,一步一步执行的。也就是说子类在构造的时候,虽然构造函数是逐层调用,但内存分配却只有一次。我不知道我说清楚了没有......第三个问题:继承和组合,我也许没有说清楚,说白了,我其实是想知道一个类B继承另一个类A的时候,到底做了什么事情?应该不是单纯地把人家的代码拿过来赋值就行了。直觉上觉得是一种链接的技术。比如类A在一个文件中,类B在另外一个文件中,编译后运行的时候,虚拟机要讲两个文件都加载,得到两个文件的信息才能创建一个类B的对象吧?如果是如此的话,这个创建的过程是什么呢?因为两个类的代码不在一起,他们如何联系起来以至于形成这种继承的层次关系的?通过什么来联系呢?联系起来之后,又是通过什么机制来实现多态或者动态绑定的呢。类B中到底包含哪些变量,这些变量的组织关系是什么样的。初学JAVA一个月不到,也是刚刚踏足编程领域。但是真的是想涉足这个领域,很多东西很模糊,所以可能也没有描述清楚。但感觉就是和继承、多态、对象内存的分配有关的。真心希望有人解答,越系统越好,或者提供链接,感激不尽!
解决方案
解决方案二:
有什么书也行,讲这方面的,适合初学者看的书。
解决方案三:
字写得太长了,看来楼主是挺会思考的,这是好事。不过也容易钻牛角尖。初学,会用起来就行了,用过一段时间之后,再深究原理。关于面向对象内存布局,建议参考《深度探索C++对象模型》前几章。"传到授业解惑",这句话写得太大了,传道授业,那是老师一辈子的事,试问网上的朋友谁能做到?初学,看经典书就对了,百度找不到准备的答案,第一次就要把知识概念学对,不然后面更麻烦。关键在于坚持。
解决方案四:
引用2楼stupid_boy2007的回复:
字写得太长了,看来楼主是挺会思考的,这是好事。不过也容易钻牛角尖。初学,会用起来就行了,用过一段时间之后,再深究原理。关于面向对象内存布局,建议参考《深度探索C++对象模型》前几章。"传到授业解惑",这句话写得太大了,传道授业,那是老师一辈子的事,试问网上的朋友谁能做到?初学,看经典书就对了,百度找不到准备的答案,第一次就要把知识概念学对,不然后面更麻烦。关键在于坚持。
恩恩,我是在看一些书,但我可能是有点钻牛角尖,有些问题,积压在心里,就不舒服。也是现在迫切需要快速掌握东西,所以才会很着急地想要快速了解一些问题,目前处于想转行的阶段。非常感谢你推荐的书,我会下载下来好好看下的。
解决方案五:
引用2楼stupid_boy2007的回复:
字写得太长了,看来楼主是挺会思考的,这是好事。不过也容易钻牛角尖。初学,会用起来就行了,用过一段时间之后,再深究原理。关于面向对象内存布局,建议参考《深度探索C++对象模型》前几章。"传到授业解惑",这句话写得太大了,传道授业,那是老师一辈子的事,试问网上的朋友谁能做到?初学,看经典书就对了,百度找不到准备的答案,第一次就要把知识概念学对,不然后面更麻烦。关键在于坚持。
哦,不过,这个是C++的呀。应该和JAVA不一样的,不过还是很感谢,我也会下载下来,等以后没这么迫切了再看也行的。
解决方案六:
引用2楼stupid_boy2007的回复:
字写得太长了,看来楼主是挺会思考的,这是好事。不过也容易钻牛角尖。初学,会用起来就行了,用过一段时间之后,再深究原理。关于面向对象内存布局,建议参考《深度探索C++对象模型》前几章。"传到授业解惑",这句话写得太大了,传道授业,那是老师一辈子的事,试问网上的朋友谁能做到?初学,看经典书就对了,百度找不到准备的答案,第一次就要把知识概念学对,不然后面更麻烦。关键在于坚持。
略微瞄了一眼《深度探索C++对象模型》,感觉还是很有用的。虽然只是C++的,但肯定有类似的地方。不过...对我而言,这本书是以后看的,目前看太费劲了..感谢兄弟。我其实需要的是通俗的简单概括就行啦,让我知道他是这么干的,但又不用太细太细,我了解一个大概就OK。现在看的太细太细,会让我无力乏味...我慢慢来吧。
解决方案七:
就回答一点、我觉得、你把this就理解成一个引用变量、或者是一个方法的隐藏的变量、方法调用的时候虚拟机自动把对应对象的引用赋值给了this变量、从而使这个方法内部能调用this指向的那个对象中的成员变量和方法、其他的我觉得目前阶段没必要深究、