java在创建继承的类的对象时 内存到底是什么样子
发布网友
发布时间:2022-05-23 06:28
我来回答
共2个回答
热心网友
时间:2023-10-15 15:35
如果在创建类的时候没有声明要继承的类 那么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种情况。
热心网友
时间:2023-10-15 15:35
还是一个对象 。。。。因为类定义会拷贝 ~
java的类在刚定义好还没有new的时候它在内存中存放在什么地方
这个时候JVM会把你那个类的class加载到内存当中.加载完了.JVM会看你的代码有没有错.没有错的话.JAVA的解释器就会去一行行的读你的代码.当然,这个时候读的代码是声明属性和构造函数等代码.这个时候他通过你的声明属性代码和构造函数就可以知道给你分配多少内存空间,并且也知道给他们初始值.这个是普通情况...
java 中子类继承父类的字段时,占用的是同一块内存还是父类和子类对象...
java语言中的对象采用的堆和栈的形式来存放,例如 Father f = new Father();f存放在栈中,其实只是一个堆内存的地址,真正地对象保存在此地址所指向的堆内存中。所以你的答案就显而易见了,Father f = new Father(); Child c = new Child();这里Father是父类,Child是子类,f和c是两个不...
Java创建一个类的对象对象,在方法里new和在类里new区别
区别在于 1。在方法里new在调用该方法时才会new出新对象,对内存来说是有好处的,er在类里就new的话,实例化类的时候, Face就会被创建,如果一直不用的话,占用内存空间。2.按照标准的bean的写法,一般在方法里进行类的属性的赋值。3.应该都不会报错的吧。
写java时 在什么样的情况下,需要使用到继承?
可以从面向对象的思想进行考虑。封装,继承,多态是面向对象的三大要素。1.就像你说的父类更通用子类更具体,解决代码重用,去除代码冗余。2.是为了多态服务。里氏替换原则:只要程序里的出现的父类类型都可以用这个父类的子类进行替换。这样就大大提高了程序的健壮性和灵活性。3.在协同开发的时候类库具体...
JOL:Java 对象内存布局
首先,Java对象在堆内存中被分为三个部分:对象头、实例数据和对齐填充。对象头包含了Mark Word和Class Pointer,而数组对象则会多出一个长度字段。Mark Word存储对象的运行时数据,包括哈希码、年龄、锁状态、线程持有锁、偏向线程ID和偏向时间戳等信息。其大小取决于虚拟机位数,32位和64位的虚拟机(...
java内存模型的java对象的内存分配
创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间” 。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java 数据要保存在堆栈里— — 特别是对象句柄(也称对象的引用),但Java对象并不放到其中。(3) 堆(heap...
Java子类继承父类时也继承父类的静态函数吗
但对于静态成员,不管在编译时还是运行时,父类对象都不能调用子类特有的静态方法;而子类可以继承父类非private的static成员,子类也有自己特有静态方法,但这个名字和父类一样.也就是说其实子类同时有两个静态方法;但这两个方法不在同一区域内,所以不存在同名的冲突。只是子类的静态方法屏蔽了父类的静态...
java新建对象的问题
3、初始化代码块 给对象分配内存空间 调用初始化代码块(在每一次创建对象时都会调用一次,其内部的变量属于局部变量)实例变量初始化 调用构造方法完成对象的创建 调用本类初始化代码块在递归构造父类对象以后 4、静态初始化代码块和被static修饰的属性 在类加载时对象创建之前调用静态初始化代码块 静态...
Java中子类继承了父类的私有属性及方法吗?
但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的...
java类和对象的关系是什么?
类和对象的关系是:类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。类与对象的关系就如模具和铸件的关系类的实例化结果就是对象,而对一类对象的抽象就是类,类...