对于java中继承机制应该怎样理解?

树成 2007-08-08 10:57:36
我们经常用到java的继承,那么我们要如何去理解它呢?也就是他是如何实现的?
如果我们写一个A类,写一个B类继承A类。
那么我们实例化A类的时候是如何实现继承的?我们都说B可以调用到A的公有和受保护的属性和方法,在外部可以通过B调用到A的公有的属性和方法。那么为什么可以这么调用呢?
我们可以理解为两种情况:

一种是实例化B的时候同时也实例化了A,这样所带来的问题就是,如果我这个B以上继承了很多父类的话,那么就要把它们通通实例化,显然是不行的,而且如果父类是抽象类的话,按照我们对java机制的了解,抽象类不能被实例,这样就相互矛盾了,不过也有猜测性解释,抽象类能通过实现子类来实例化,但是不能显示实例化,不过java似乎没有这种说法。

第二种就是简单的代码复制,当我B继承A的时候,我们把它理解为把A的代码全部复制到B来实例化,不过这个想法依然有挑战,如果全部复制的话,同名属性要如何处理?方法覆盖要如何处理?而且如果是代码复制,那么理所当然的私有方法也能够调用到,但是为什么不能被调用到呢?如果只是复制保护以上级别的属性或者方法的话,那么又可以利用到super关键字来访问到父类的公有方法间接访问到私有属性。

我有以上两种理解方式,不过都存在自身矛盾,那么java它是如何实现继承的呢,如果各位有自己的理解或者官方公认的解说请给与请教。
...全文
368 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zephyr_cc 2007-08-09
  • 打赏
  • 举报
回复
找个class文件,用javap -verbose 看看就知道了
抽象类,普通的类都有实例初始化方法,子类通过调用超类的<init>方法来实例初始化超类.
虚拟机是和.class文件打交道的,并不是和我们平时写的.java文件交互.
虚拟机会从.class文件中抽取信息,并按照.class文件中的指令集操作
树成 2007-08-09
  • 打赏
  • 举报
回复
我个人偏向于第二种说法。
南瓜·先生 2007-08-09
  • 打赏
  • 举报
回复
同意 zephyr_cc() 的说法
继承的时候肯定要将继承链上的类都实例化的,普通类的话就是构造器被子类调用,隐式或显式,抽象类的话没有构造器,怎么实例化的我也不清楚,但是当子类实例化之后是可以直接调到父类(抽象类)的实例域的,这说明父类也被实例化了
eecomputer 2007-08-09
  • 打赏
  • 举报
回复
这个只了解就可以了吧, 其内部机制可以不管嘛,只要能编出程序解决问题就可以了
zdjray 2007-08-09
  • 打赏
  • 举报
回复
我个人的理解是部分代码的拷贝

被覆盖了的和丢失了的信息不再在新生成的类中延续
而正如事情常常发生的一样,很少会极端的处理(如简单的拷贝)
然而在底层实现中,应该就没有实例化这些概念了

lalakid 2007-08-09
  • 打赏
  • 举报
回复
楼主,你研究一下JAVA的编译器和虚拟机吧
rorey_008 2007-08-09
  • 打赏
  • 举报
回复
1. 抽象类也是类,他有实例初始化方法.同样可以被子类隐式或显示调用.
但不能使用new操作符(为什么?规定...为了区别类,接口,为了满足又想实现一些公有实例域的初始化,而又不想创建该实例的需要)
2. 当创建一个子类实例时,从Object到子类的实例初始化方法都要被调用的
zephyr_cc 2007-08-09
  • 打赏
  • 举报
回复
楼主的第一种说法基本上是正确的.
1. 抽象类也是类,他有实例初始化方法.同样可以被子类隐式或显示调用.
但不能使用new操作符(为什么?规定...为了区别类,接口,为了满足又想实现一些公有实例域的初始化,而又不想创建该实例的需要)
2. 当创建一个子类实例时,从Object到子类的实例初始化方法都要被调用的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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