子类为什么可以覆写父类的方法?

沧龙 2014-08-29 09:05:59
class B extends A,A类方法被覆写(非抽象方法),在没之前,类B和类A应该没被写入内存里把?
new B()之后,生成一个包含类B和类A属性方法的内存地址,也就是父类和子类共用一个内存地址,所以才实现了覆写 是吗?
麻烦大神教导下
...全文
497 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wensshq 2014-09-03
  • 打赏
  • 举报
回复
引用 4 楼 u013663381 的回复:
[quote=引用 2 楼 u011726984 的回复:] 楼主表达的有点不清楚。简单回答下: 如果这个类B继承自类A,则类B自动拥有父类的所有方法除了构造方法。当new一个B类对象时,这个对象指向堆的类B,但类A又同时拥有自己的对象引用指向自身,且类B包含类A。 而所谓的覆盖方法指的是,子类中定义与父类同名且参数类型和个数都相同的方法。都涉及到多态。
小弟更想知道:当new子类后,不是返回一个地址指针吗?根据这个地址指针找到相应的内存,那么这个内存里面包含的是父类和子类所有的属性和方法吗???(或者是父类实例化后得到的地址和子类的属性和方法) 如果是这样的话,每次new一个子类对象,都开辟不同的内存,但内存里都有相同的父类属性和方法,不是重复了吗?? 为什么不能把父类提出来放到一个特意设定的代码区,然后它的每个子类的对象都可以引用它呢? [/quote] 小弟更想知道:当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; } }
一大三千 2014-08-31
  • 打赏
  • 举报
回复
引用 4 楼 u013663381 的回复:
[quote=引用 2 楼 u011726984 的回复:] 楼主表达的有点不清楚。简单回答下: 如果这个类B继承自类A,则类B自动拥有父类的所有方法除了构造方法。当new一个B类对象时,这个对象指向堆的类B,但类A又同时拥有自己的对象引用指向自身,且类B包含类A。 而所谓的覆盖方法指的是,子类中定义与父类同名且参数类型和个数都相同的方法。都涉及到多态。
小弟更想知道:当new子类后,不是返回一个地址指针吗?根据这个地址指针找到相应的内存,那么这个内存里面包含的是父类和子类所有的属性和方法吗???(或者是父类实例化后得到的地址和子类的属性和方法) 如果是这样的话,每次new一个子类对象,都开辟不同的内存,但内存里都有相同的父类属性和方法,不是重复了吗?? 为什么不能把父类提出来放到一个特意设定的代码区,然后它的每个子类的对象都可以引用它呢? [/quote] 第一个问题和第二个问题答案是肯定的。第三个问题,new一个子类对象,确实开辟了内存,但在main方法执行后,这些对象将被释放,对应的内存也会被垃圾回收机制回收的,不存在你说的那个问题。而代码区是存放代码的。
si_info 2014-08-30
  • 打赏
  • 举报
回复
在B类的构造函数第一行,会有默认的super();继承A类的所有属性和方法
沧龙 2014-08-30
  • 打赏
  • 举报
回复
引用 2 楼 u011726984 的回复:
楼主表达的有点不清楚。简单回答下: 如果这个类B继承自类A,则类B自动拥有父类的所有方法除了构造方法。当new一个B类对象时,这个对象指向堆的类B,但类A又同时拥有自己的对象引用指向自身,且类B包含类A。 而所谓的覆盖方法指的是,子类中定义与父类同名且参数类型和个数都相同的方法。都涉及到多态。
小弟更想知道:当new子类后,不是返回一个地址指针吗?根据这个地址指针找到相应的内存,那么这个内存里面包含的是父类和子类所有的属性和方法吗???(或者是父类实例化后得到的地址和子类的属性和方法) 如果是这样的话,每次new一个子类对象,都开辟不同的内存,但内存里都有相同的父类属性和方法,不是重复了吗?? 为什么不能把父类提出来放到一个特意设定的代码区,然后它的每个子类的对象都可以引用它呢?
wensshq 2014-08-29
  • 打赏
  • 举报
回复
B类继承A类,,new 出来一个B类,B类自动会拥有父类的成员包话方法,, new B()之后,才会在内存中分配地址,生成一个B类的对象其中包括了一个A类的对象(内部只有成员和方法的引用), 方法是静态的概念是只一段代码存在代码区。分配的内存有一个引用指向方法。 但调用方法时,会根据传递的实参调用相应的方法,,内存中指向方法的引用会相应的实参指向对应的方法。所以就实现了方法的复用。就是多态的概念。
一大三千 2014-08-29
  • 打赏
  • 举报
回复
楼主表达的有点不清楚。简单回答下: 如果这个类B继承自类A,则类B自动拥有父类的所有方法除了构造方法。当new一个B类对象时,这个对象指向堆的类B,但类A又同时拥有自己的对象引用指向自身,且类B包含类A。 而所谓的覆盖方法指的是,子类中定义与父类同名且参数类型和个数都相同的方法。都涉及到多态。

62,620

社区成员

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

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