又来问关于继承的小白问题了

mybeta 2013-07-30 04:13:47


public class A {

public void print() {
System.out.println(this);

p();
}

private void p() {
System.out.println(this);
}

}






public class B extends A {
public static void main(String[] args) {
A b = new B();
b.print();
}
}






结果:
B@a90653
B@a90653
也就是打印的都是B对象,求详细解释?
...全文
299 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
owen1759 2013-08-09
  • 打赏
  • 举报
回复
按照我对于继承的理解,应该是这样的(个人理解哈,有错请指出): ------------------ A类 field1->内存区1 field2->内存区2 method1->内存区3 method2->内存区4 然后你B类继承A类,修改了field1字段、method2方法,新增了method3方法,变成这样了 B类 field1->内存区5 field2->内存区2 method1->内存区3 method2->内存区6 method3->内存区7 然后你执行了A b = new B();那么b实例就变成这样 b实例 field1->内存区5 field2->内存区2 method1->内存区3 method2->内存区6 method3->内存区7(无法访问) 这时候你再调用b.method2()是运行的哪段程序?内存区6呗 ------------------ 当然,我参考了一些其他语言的原理,至于java是不是这样实现的我也不清楚,但是这样的解释是可以说得通的
owen1759 2013-08-09
  • 打赏
  • 举报
回复
你要明白,this指的是什么,它指的并不是这个class自身,它不是一个固定的值,this的含义是“当前的实例” 那么什么是当前的实例呢?例如你调用b.print();当前实例就是b,而b是B类的实例,即使你把它赋值给一个A类的变量了,它还是B类实例。 如果抛开OOP不讲,你可以把x.fun(y)理解成对于函数签名fun(this,param)的调用fun(x,y) 也就是说,this实际上也是个隐含的传参,传的是点前面的东西 ====== 另外你想想另一个情况,如果你自己建了个类A的对象a,里面toString()返回"12345" 那么,你调用system.out.println(a)时候,调用的是哪个签名?显然是Object的那个对吧? 那么也就是你等同于写了 Object a = new A(); system.out.println(a); 你应该知道system.out.println(Object)是会调用toString()的,那么等价于: Object a = new A(); String str = a.toString(); system.out.println(str); 输出的是什么?想都不用想显然是"12345" 这时候你是不是应该震惊呢? 其实你再回头看看,这和你的代码几乎是同一个道理
sunyiz 2013-08-02
  • 打赏
  • 举报
回复
引用 5 楼 mybeta 的回复:
[quote=引用 1 楼 ziweixinghello 的回复:] 此处用了三个点,但考了一个,主要来迷惑你,看你的基础了 第一,子类没有方法,调用父类的 第二,A b = new B(); 这句虽然对象b为A类型,但是真实建立的是B类,所以传递的this是B类型的,所以打印为B 第三,A b = new B();,这个 是多态,编程经常用到,为了易于扩展,好处是添加新代码时改动代码较少
我在这里有疑惑的是创建子类对象的时候,不是会建立父类对象嘛,然后在父类的方法里打印this,打印出来的结果是子类对象的值 [/quote] 谁说会建立父类对象的…… 只是会调用父类的构造而已 new 的什么类,就是什么类的对象 至于你是 A a = new B(); B a = new B(); 都一样, 他们的区别是:“指向对象的引用不同” 父类引用可以指向子类对象
ziweixinghello 2013-08-02
  • 打赏
  • 举报
回复
引用 5 楼 mybeta 的回复:
[quote=引用 1 楼 ziweixinghello 的回复:] 此处用了三个点,但考了一个,主要来迷惑你,看你的基础了 第一,子类没有方法,调用父类的 第二,A b = new B(); 这句虽然对象b为A类型,但是真实建立的是B类,所以传递的this是B类型的,所以打印为B 第三,A b = new B();,这个 是多态,编程经常用到,为了易于扩展,好处是添加新代码时改动代码较少
我在这里有疑惑的是创建子类对象的时候,不是会建立父类对象嘛,然后在父类的方法里打印this,打印出来的结果是子类对象的值 [/quote]子类对象建立了就不会再建父类对象了,个人觉得是【父类指向子类对象】
ncist_jianeng 2013-08-01
  • 打赏
  • 举报
回复
那是this的问题,谁调用就输出谁
摆烂办不到 2013-08-01
  • 打赏
  • 举报
回复
A a = new B(); 堆内存那块始终是B对象 this的指向当然是a所指向的B那块的地址呢
mybeta 2013-08-01
  • 打赏
  • 举报
回复
引用 3 楼 FirstHelloWorld 的回复:
B类继承A类时一并将A类的print和p方法都继承了过来; B类相当用于

public class B {
    public static void main(String[] args) {
        A b = new B();
        b.print();
    }
   public void print() {
        System.out.println(this);
         
        p();
    }
     
    private void p() {
        System.out.println(this);
    }


}
方法执行过程中都是同一个B对象; 结果相同
那个p()方法是private的,我就是不明白这个this为什么会打印子类对象的值
mybeta 2013-08-01
  • 打赏
  • 举报
回复
引用 1 楼 ziweixinghello 的回复:
此处用了三个点,但考了一个,主要来迷惑你,看你的基础了 第一,子类没有方法,调用父类的 第二,A b = new B(); 这句虽然对象b为A类型,但是真实建立的是B类,所以传递的this是B类型的,所以打印为B 第三,A b = new B();,这个 是多态,编程经常用到,为了易于扩展,好处是添加新代码时改动代码较少
我在这里有疑惑的是创建子类对象的时候,不是会建立父类对象嘛,然后在父类的方法里打印this,打印出来的结果是子类对象的值
zhangxm2015 2013-07-30
  • 打赏
  • 举报
回复
A b = new B();
这句应为
B b = new B();
zhangxm2015 2013-07-30
  • 打赏
  • 举报
回复
B类继承A类时一并将A类的print和p方法都继承了过来; B类相当用于

public class B {
    public static void main(String[] args) {
        A b = new B();
        b.print();
    }
   public void print() {
        System.out.println(this);
         
        p();
    }
     
    private void p() {
        System.out.println(this);
    }


}
方法执行过程中都是同一个B对象; 结果相同
S117 2013-07-30
  • 打赏
  • 举报
回复
去了解下什么叫后期绑定
ziweixinghello 2013-07-30
  • 打赏
  • 举报
回复
此处用了三个点,但考了一个,主要来迷惑你,看你的基础了 第一,子类没有方法,调用父类的 第二,A b = new B(); 这句虽然对象b为A类型,但是真实建立的是B类,所以传递的this是B类型的,所以打印为B 第三,A b = new B();,这个 是多态,编程经常用到,为了易于扩展,好处是添加新代码时改动代码较少

62,614

社区成员

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

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