A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一木榜公 于 2013-7-7 17:56 编辑
  1. class A
  2. {
  3.    public void func1()
  4.   {
  5.      System.out.println("A ^^^func1");
  6.   }
  7.    public void func2()
  8.    {
  9.        System.out.println("A ^^^func2");
  10.    }
  11. }
  12. class B extends A
  13. {
  14.      public void func1()
  15.     {
  16.           System.out.println("B^^^^^^func1");
  17.      }
  18.     public void func3()
  19.    {
  20.          System.out.println("B^^^^^^func3");
  21.     }
  22. }
  23. class DuoTaiTest1
  24. {
  25.          public static void main(String[] args)
  26.         {

  27.                 A a = new B();

  28.                 B b = (A)a;
  29.          }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

6 个回复

倒序浏览

主方法写错了吧
public static void main(String[] args)

        {



                A a = new B();//定义了一个父类A的引用型变量指向了子类B的一个对象



                B b = (B)a; //将引用变量a强制转换为子类b的引用变量。

         }

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 一木榜公 于 2013-7-7 00:10 编辑


谢谢你的回答!
还要点疑问:  B b = (B)a; //将引用变量a强制转换为子类b的引用变量。

你的意思是,引用变量a与b都是B类引用变量,那么a.func3();  也可以调用了?
回复 使用道具 举报
一木榜公 发表于 2013-7-7 00:08
谢谢你的回答!
还要点疑问:  B b = (B)a; //将引用变量a强制转换为子类b的引用变量。

如果是A a = new B()的话,a.func3()会编译错误,提示找不到符号
因为在A父类中没有func3方法,func3()是子类特有的方法。

如果要调用func3()方法,应该向下转型就行了
B b = (B)a  向下转型就能调用b.func3()方法了。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报

//a.func3();可以改成b.func3() 添加在此处就行了。多态视频上...

本帖最后由 张站华 于 2013-7-7 08:01 编辑
  1. class DuoTaiTest1
  2. {
  3.          public static void main(String[] args)
  4.         {

  5.                 A a = new B();
  6.                 B b = (A)a;
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 草帽 于 2013-7-7 11:32 编辑

楼主问题中我想并不只是强制类型转换的问题而且有多态的问题。涉及到动态绑定(池绑定)的问题,动态绑定就是在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用期对应的方法。
程序中的方法都存于方法区,当在执行的时候new的哪个对象就调用谁覆写后的方法。
也就是在对象(堆内存)的内部有一个方法的指针来指向方法,但当nuw出对象后该指针就随之变化指向覆写后的方法。也就是动态绑定,只有在运行的时候才能确定所调用的方法。
((用池解释就是,在编译时刻,会生成一张虚拟表,来记录所有覆盖的方法,没有被覆盖的方法是不会记录到这张表的。若一个父类引用调用了没有覆盖的子类方法,那么是不符合该表的,那么编译时刻就会报错。在执行程序的时候,虚拟机会去这张虚拟表中找覆盖的方法,比如引用中实际上存的是一个子类对象引用,那么就会去找子类中的相应的覆盖的方法来执行。))



无标题.png (19.37 KB, 下载次数: 0)

无标题.png
回复 使用道具 举报
草帽 发表于 2013-7-7 11:30
楼主问题中我想并不只是强制类型转换的问题而且有多态的问题。涉及到动态绑定(池绑定)的问题,动态绑定就 ...

:handshake解释的很清楚,谢了!看来得补一下: 动态绑定和池绑定的知识
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马