导航:首页 > 编程语言 > java继承内存

java继承内存

发布时间:2022-08-26 17:42:13

java继承中子父类的关系及内存结构是怎样的,父类中this表示子类对象,this.属性怎么表示父类的属性

因为子类的方法覆盖了父类的了,就是说我继承了你的,但是先你的不好,改了,所以用子类的

⑵ java在创建继承的类的对象时 内存到底是什么样子

如果在创建类的时候没有声明要继承的类 那么java就默认 把它继承Object类
public class A{
/*Code*/
}

public class A extends java.lang.Object{
/*Code*/
}
以上两种的等价的public class Test // 从Object类继承
{
public static void main(String[] args)
{
System.out.println(new Test().toString());
}
}
从上面的代码可以看出,实际上,Test类的父类就是Object,因此,在Test中可以使用Object类的public或protected资源,如toString方法。那么Java编译器和JVM到底是如何做的呢?
了解这个原因其实并不需要知道JVM的实现细节。只要思考一下对于这种虚拟机程序的原理即可。一般对于这种靠虚拟机运行的语言(如Java、C#等)会有两种方法处理默认继承问题。
1、在编译源代码时,当遇到没有父类的类时,编译器会将其指定一个默认的父类(一般为Object),而虚拟机在处理到这个类时,由于这个类已经有一个默认的父类了,因此,VM仍然会按着常规的方法来处理每一个类。对于这种情况,从编译后的二进制角度来看,所有的类都会有一个父类。
2、编译器仍然按着实际代码进行编译,并不会做额外的处理。如果一个类没有显式地继承于其他的类,编译后的代码仍然没有父类。然后由虚拟机运行二进制代码时,当遇到没有父类的类时,就会自动将这个类看成是Object类的子类(一般这类语言的默认父类都是Object)。
从上面两种情况可以看出,第1种情况是在编译器上做的文章,也就是说,当没有父类时,由编译器在编译时自动为其指定一个父类。第2种情况是在虚拟机上做文章,也就是这个默认的父类是由虚拟机来添加的。那么Java是属性哪一种情况呢?其实这个答案很好得出。只需要随便找一个反编译工具,并.class文件进行反编译即可得知编译器是如何编译的。就以上面代码为例,如果是第1种情况,就算Test没有父类,但由于编译器已经为Test自动添加了一个Object父类,因此,在反编译后得到的源代码中的Test类是从Object类继承的。如果没是这种情况,那么就是第2种情况。

⑶ java中的类不继承Serialiable,进行内存管理,会不会出问题

这个有时候会出问题的,比如启动有时就会报出错误,所以最好还是加上!只是一个实现序列化

⑷ java课程分享Java内存模型原理

这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对 Java 内存模型体系产生一个相对清晰的理解,知其然知其所以然。

内存模型产生背景

在介绍 Java 内存模型之前,java课程http://www.kmbdqn.com/认为应该先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。

物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机的解决方案对虚拟机的实现有相当的参考意义。

物理机的并发问题

硬件的效率问题

计算机处理器处理绝大多数运行任务都不可能只靠处理器“计算”就能完成,处理器至少需要与内存交互,如读取运算数据、存储运算结果,这个 I/O 操作很难消除(无法仅靠寄存器完成所有运算任务)。

由于计算机的存储设备与处理器的运算速度有几个数量级的差距,为了避免处理器等待缓慢的内存完成读写操作,现代计算机系统通过加入一层读写速度尽可能接近处理器运算速度的高速缓存。

缓存作为内存和处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中。

缓存一致性问题

基于高速缓存的存储系统交互很好的解决了处理器与内存速度的矛盾,但是也为计算机系统带来更高的复杂度,因为引入了一个新问题:缓存一致性。

在多处理器的系统中(或者单处理器多核的系统),每个处理器(每个核)都有自己的高速缓存,而它们有共享同一主内存(Main Memory)。

当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。

为此,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议进行操作,来维护缓存的一致性。


⑸ java继承类的内存关系

这个问题你可以通过javap命令反编译发现,在child对象所占的内存中存放的是实际的变量而非

对parent对象的引用。

⑹ java 中子类继承父类的字段时,占用的是同一块内存还是父类和子类对象分别占用各自的一块内存,请高人详答

java语言中的对象采用的堆和栈的形式来存放,例如 Father f = new Father();f存放在栈中,其实只是一个堆内存的地址,真正地对象保存在此地址所指向的堆内存中。
所以你的答案就显而易见了,Father f = new Father(); Child c = new Child();这里Father是父类,Child是子类,f和c是两个不同的内存地址,他们的对象保存的地方也不同,所以他们的字段也不会再同一片内存区域。
如果父类中有个字段a,子类继承了父类的这个字段a,其实就是子类的那个内存区域里面也会有一个a字段,父类的内存区域中也有a字段,他们两个没有什么关系。

⑺ java中子类对象和父类对象的内存模型图

左边是栈空间,右边是堆空间,栈空间的变量t储存着一个指向堆空间某个对象的地址

⑻ java 继承问题 public class Z extens X{ Y y=new Y

随手写的代码吧,关键字也能错。
我觉得你的问题应该是问java类初始化的执行顺序。

java类初始化的顺序是:
1.静态属性
2.静态自由块
3.属性
4.自由块
6.构造方法
再加上继承关系,初始化的顺序是:
1.父类:静态属性
2.父类:静态自由块
3.子类:静态属性
4.子类:静态自由块
5.父类:属性
6.父类:自由块
7.父类:构造方法
8.子类:属性
9.子类:自由块
10.子类:构造方法

⑼ 为什么Java类只能继承一个父类

有取必有舍。Java认为多重继承不是一个很重要并且不是没有就不行的特性,但是他带来的危害却大于他的好处,所以舍弃。同理对于指针、内存管理都一样道理。
我同意有些人的回答说Java不信任程序员。正因如此,所以Java没有指针、不需要内存管理、也没有多重继承。但是,程序员可以说是最不值得信任的一群群体,不然为何需要专门的测试人员?所有语言都在一定程度不信任程序员,只是看程度如何而已。如果信任程序员的能力,应该去使用汇编语言、如果信任程序员的能力和水平,应该让程序员自己查BUG测试。
Java相比C++选择对程序员的给予更低信任度而换取更高的代码安全性。即Java选择了舍弃更多的功能或性能而选择更高的保险性罢了。
---------------------------用Java实现多重继承的方式-----------------------------
而对于多重继承的实现方式。其实并不应该像很多人说的那样使用实现多个接口实现的。如果这样,将产生大量的“CTRL C+CTRL V”,当你发现你大量的CTRL C+CTRL+V时,就几乎可以断定。你的代码写得不好了。
“实现上的继承就跟过度使用goto语句一样,使程序拧巴和脆弱。结果就是,面向对象系统通常遭受复杂和缺乏复用的痛苦。”— John Ousterhout( Tcl and Tk 的创始人) Scripting, IEEE Computer, March 1998“面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而其还有整个丛林。”— Joe Armstrong(Erlang语言发明人)以下就以大猩猩的例子举例实现多重继承。现有抽象对象猩猩和对象大猩猩、拿着香蕉的大猩猩、拿着苹果的大猩猩、拿着香蕉和苹果的大猩猩,四个对象。继承关系图如下:(word作图,某些箭头不规范,请见谅)
并且再考虑有一个人类的类。里面有一个方法:“喂猩猩”,参数是“猩猩”类型。注:猩猩是抽象类。
Version 1 --------使用组合+继承
这样,既实现了多继承、也实现了多态——无论是大猩猩,还是拿着香蕉和苹果的大猩猩都能传递参数给人类的“喂猩猩的方法”了。
但这样还有一个问题,假如我还需要在大猩猩的层面扩充继承的更多数量的类如继承“野生动物”。而在人类的方法新增远离野生动物的方法:
Version2----------接口+组合
这就是我们说的用接口实现多重继承。是因为这样可以把子类利用多态赋给多个父类(接口),而把主要的方法使用组合封装起来而避免多次实现接口的方法。需要多少钟父类型,就在顶层增加接口实现。注:本初的猩猩类依旧可以设计为“类”即最顶层可以考虑拥有一个(抽象)类,也可以全部都是设计为接口,具体看业务需求和复杂度而定。
以上是参加完Oracle 新员工培训后所思所得,有错请评论指出。

⑽ 谢谢大虾指点,,java中继承的子类中能重写父类中的构造方法吗求举例子并画出内存分析图。。十分感谢

这个是绝对不可能的。

构造子类的时候,首先调用的是父类的构造。所以重写是不可能的。

但是有一个偏门可以走。

譬如
public class A {
protected int name ;
public A(){
this.name = "Parent";
}}

public class B extends A{

public B(){
super();
super.name = "Son";//不能实现重写,但是可以把父类构造函数里面的语句在这里重新构造从//而实现重写
xxxxxx//子类方法
}

}

阅读全文

与java继承内存相关的资料

热点内容
脉脉app干什么用的 浏览:357
拽姐是哪个app 浏览:858
云服务器删除了还有吗 浏览:232
macbook可以用单片机嘛 浏览:307
南阳php招聘 浏览:814
去哪里找按摩师很漂亮的app 浏览:818
86x99用简便算法计算 浏览:830
php截图flash 浏览:274
卸载联想app哪个好 浏览:720
php文字转图片 浏览:332
豆客后台怎么加密码 浏览:575
jpg转换pdf破解版 浏览:978
php基础书籍推荐 浏览:778
服务器与外网不通如何验证 浏览:353
电子版是不是就是文件夹 浏览:51
游戏属性文件加密 浏览:464
如何让安卓手机桌面图标下移 浏览:530
ubuntuphp5环境搭建 浏览:101
赌瘾解压视频 浏览:919
晋城移动dns服务器地址 浏览:296