子类为什么可以覆写父类的方法? class B extends A,A类方法被覆写(非抽象方法),在没之前,类B和类A应该没被写入内存里把?
new B()之后,生成一个包含类B和类A属性方法的内存地址,也就是父类和子类共用一个内存地址,所以才实现了覆写 是吗?
麻烦大神教导下 ------解决思路----------------------
小弟更想知道:当new子类后,不是返回一个地址指针吗?根据这个地址指针找到相应的内存,那么这个内存里面包含的是父类和子类所有的属性和方法吗???(或者是父类实例化后得到的地址和子类的属性和方法)
答: 1.子类NEW出来是的,,
2.父类NEW出来后就只有父类,它不可能会知道自己的子类是什么.
3.如果是class B extends A. 使用A a = new B() 这样父类实例化后得到的地址和子类的属性和方法.注意只是得到,但是父类不能访问子类新增加的成员和方法.
如果是这样的话,每次new一个子类对象,都开辟不同的内存,但内存里都有相同的父类属性和方法,不是重复了吗??
答:每次new一个子类对确实是都开辟不同的内存.但是成员都是分配在堆内存中的,堆内存中只有一个引用指向代码区的方法.
记住new出一个对象后才会在内存中分配空间,每个对象的成员都是不同,在内存中也会分配不同的空间,方法只有一种,该类的所有成员共享该方法.
为什么不能把父类提出来放到一个特意设定的代码区,然后它的每个子类的对象都可以引用它呢?
答:每一个子类new后,在子类的内存都会一个父类,每个子类都可以使用super()来访问父类的成员. 如果把父类放在特定的代码区每个子类都引用它的话,,,,, 你想想,,,要是每个子类在构造方法中都定义了自己父类成员变量不同的值该怎么办.
例如:
public class Test {
public static void main(String[] args) {
student s1 = new student(1, "s1", 20);
student s2 = new student(2, "s2", 21);
}
}
class Person {
int id ;
String name;
Person(int id, String name) {
this.id = id;
this.name = name;
}
}
class student extends Person {
int age;
student(int id, String name, int age) {
super(id,name);
this.age = age;
}