java内存继承
① java继承中子父类的关系及内存结构是怎样的,父类中this表示子类对象,this.属性怎么表示父类的属性
只有非静态、非终态的方法才有覆盖和多态一说,静态方法、终态方法和属性不存在覆盖和多态,this出现在哪个类中就输出哪个类的属性。
② java 中子类继承父类的字段时,占用的是同一块内存还是父类和子类对象分别占用各自的一块内存,请高人详答
java语言中的对象采用的堆和栈的形式来存放,例如 Father f = new Father();f存放在栈中,其实只是一个堆内存的地址,真正地对象保存在此地址所指向的堆内存中。
所以你的答案就显而易见了,Father f = new Father(); Child c = new Child();这里Father是父类,Child是子类,f和c是两个不同的内存地址,他们的对象保存的地方也不同,所以他们的字段也不会再同一片内存区域。
如果父类中有个字段a,子类继承了父类的这个字段a,其实就是子类的那个内存区域里面也会有一个a字段,父类的内存区域中也有a字段,他们两个没有什么关系。
③ 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 static 与继承的执行顺序
看完下面的代码你就明白了……
class Test0 {
public static String staticField = "父类-静态变量";
public String field = "父类-普通变量";
public Test0() {
System.out.println("父类-构造器");
}
static {
System.out.println(staticField);
System.out.println("父类-静态初始化块");
}
{
System.out.println(field);
System.out.println("父类-初始化块");
}
}
public class Test1 extends Test0{
public static String staticField = "子类*静态变量";
public String field = "子类*普通变量";
static {
System.out.println(staticField);
System.out.println("子类*静态初始化块");
}
{
System.out.println(field);
System.out.println("子类*初始化块");
}
public Test1() {
System.out.println("子类*子类构造器");
}
public static void main(String args[]) {
System.out.println("main方法");
Test1 test1 = new Test1();
}
}
输出结果为:
父类-静态变量
父类-静态初始化块
子类*静态变量
子类*静态初始化块
main方法
父类-普通变量
父类-初始化块
父类-构造器
子类*普通变量
子类*初始化块
子类*子类构造器
⑤ java继承类的内存关系
这个问题你可以通过javap命令反编译发现,在child对象所占的内存中存放的是实际的变量而非
对parent对象的引用。