黑马程序员技术交流社区

标题: 一道地址指向的问题 [打印本页]

作者: 在乎..    时间: 2013-7-12 19:00
标题: 一道地址指向的问题
本帖最后由 在乎.. 于 2013-7-14 14:57 编辑
  1. class A {
  2.                  void fun1() {
  3.                        System.out.println(fun2());
  4.                  }
  5.   
  6.                  int fun2() {
  7.                          return 123;
  8.                  }
  9.          }
  10.   
  11.           public class B extends A {
  12.                  int fun2() {
  13.                           return 456;
  14.                   }
  15.   
  16.                  public static void main(String args[]) {
  17.                          B b = new B();
  18.                          b.fun1();   //456  这我知道,是B重写fun2()的缘故吧
  19.                          A a = b;
  20.                          a.fun1();   //456   但这a 指向A类去了,为什么还会使用子类的呢?
  21.                  }
  22.          }
复制代码

作者: ㄗs:/|丶hearts    时间: 2013-7-12 19:46
子类覆盖了父类的方法,运行时参考的是对象所属的类中是否有调用的方法,a=b,a中存放的是new B()的引用,会调用B中的方法
作者: chslzj    时间: 2013-7-13 08:30
本帖最后由 chslzj 于 2013-7-13 08:32 编辑

对象还是同一个对象,A a=b;这句没有改变b对象,只是把a 指向了b对象,但是这里的a,只能使用A里面声明的方法,不能使用在B里面声明的特有的方法
作者: chslzj    时间: 2013-7-13 08:39
  1. /**
  2. *
  3. */
  4. package com.itheima.test;

  5. /**
  6. * @author Administrator
  7. *
  8. */

  9. class A{
  10.         void fun1(){
  11.                 System.out.println(fun2());
  12.         }
  13.         int fun2(){
  14.                 return 123;
  15.         }
  16. }
  17. class B extends A{
  18.         /* (non-Javadoc)
  19.          * @see com.itheima.test.A#fun2()
  20.          */
  21.         @Override
  22.         int fun2() {
  23.                 // TODO Auto-generated method stub
  24.                 return 456;
  25.         }
  26.         int fun3(){
  27.                 return 3;
  28.         }
  29. }

  30. public class ExtendsTest {
  31.         public static void main(String[] args) {
  32.                 B b=new B();
  33.                 b.fun1();
  34.                 b.fun3();
  35.                 A a=b;
  36.                 a.fun1();
  37.                 a.fun2();
  38.                 //a.fun3();不能调用
  39.         }
  40. }
复制代码
这是我的测试代码
作者: zhou5852    时间: 2013-7-13 09:36
这个是java 当时设计思想而定的,我推荐那本书 有个地方叫 find the right method  里就有,而且在里面也讲述了这个问题,如果真的是调用B中的方法,那对于将来的编程拓展是个很大的问题。很难想象 A中的实现过程 为什么要调用子类的实现方法呢?这也是为了安全的角度,万一子类来个System.exit(0); 那虚拟机不是挂掉了。。。我感觉 为什么当时只设计了  super this 关键字 而没设计lower 关键字。。。。。
作者: 在乎..    时间: 2013-7-13 11:00
chslzj 发表于 2013-7-13 08:39
这是我的测试代码

是不是只能够使用A中的方法,而A的方法内部与B的方法有关联的也可以调用,但不能显式使用B类,这又是为什么?既然是B对象了不能使用B的方法吗?
作者: chslzj    时间: 2013-7-13 12:33
在乎.. 发表于 2013-7-13 11:00
是不是只能够使用A中的方法,而A的方法内部与B的方法有关联的也可以调用,但不能显式使用B类,这又是为什 ...

在对象a里面,因为定义是类A,在A的字节码内容里面没有子类B特有的方法的定义,对象a只能使用类A的方法,在类A里面写的代码不能有B的方法在里面,但是你可以在B方法内部重写方法,使其包含B特有的方法;
既然是B对象了不能使用B的方法吗?对于这个问题,因为你把它定义成A了,A哪里有B的特有方法啊

下面是测试代码
  1. /**
  2. *
  3. */
  4. package com.itheima.test;

  5. /**
  6. * @author Administrator
  7. *
  8. */

  9. class A{
  10.         void fun1(){
  11.                 System.out.println(fun2());
  12.         }
  13.         int fun2(){
  14.                 return 123;
  15.         }
  16. }
  17. class B extends A{

  18.         /* (non-Javadoc)
  19.          * @see com.itheima.test.A#fun1()
  20.          */
  21.         @Override
  22.         //这里我们重写了fun1方法,使其包含了B类特有的fun3方法
  23.         void fun1() {
  24.                 // TODO Auto-generated method stub
  25.                 System.out.println(fun3());
  26.         }
  27.         /* (non-Javadoc)
  28.          * @see com.itheima.test.A#fun2()
  29.          */
  30.         @Override
  31.         int fun2() {
  32.                 // TODO Auto-generated method stub
  33.                 return 456;
  34.         }
  35.         int fun3(){
  36.                 return 3;
  37.         }
  38. }

  39. public class ExtendsTest {
  40.         public static void main(String[] args) {
  41.                 B b=new B();
  42.                 b.fun1();
  43.                 b.fun3();
  44.                 A a=b;
  45.                 a.fun1();
  46.                 a.fun2();
  47.                 //a.fun3();不能调用
  48.         }
  49. }
复制代码

作者: 于世德    时间: 2013-7-13 12:39
为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。当你向一个对象发送消息时,该对象就能够知道对这条消息应该做些什么。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2