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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liwenbin0912 中级黑马   /  2014-7-17 19:42  /  1018 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package package0717;

public class ManyChildStateTest {
public static void main(String[] args) {
        ManyState ms = new ManyChildState();//:向上转型
        ms.eating();
        ms.sleeping();
       
   }
public void  getManyState(ManyState manyState ){
        ManyChildState mcd = (ManyChildState) manyState  ;//:向下转型
        //:父类:manyState
        //:子类:ManyChildState
        //:测试类:ManyChildStateTest
       
        }

}
谁能帮解释下向下转型     这个代码理解起来有点费劲  

7 个回复

倒序浏览
主函数创建的是父类引用子类的对象
需要调用子类特有方法时就需要将这个引用对象强制转换成子类对象
但是只能强制转换成原来被引用的子类
回复 使用道具 举报
David.L 发表于 2014-7-17 20:04
主函数创建的是父类引用子类的对象
需要调用子类特有方法时就需要将这个引用对象强制转换成子类对象
但是只 ...

我能理解强转,  但是我不了解那个强转的格式,   好像把对象当做参数往里边传   那个不太理解
回复 使用道具 举报
本帖最后由 David.L 于 2014-7-17 21:33 编辑
liwenbin0912 发表于 2014-7-17 21:11
我能理解强转,  但是我不了解那个强转的格式,   好像把对象当做参数往里边传   那个不太理解 ...

实际传的是对象地址吧
注意:
ManyState是类名
但manyState其实就像是变量名,你换成其他也可以,传对象的地址变量而已,不是传对象

换成public void  getManyState(int x){  这样你就理解了吧,int也是一个类吧,x是变量,只不过这里的类是ManyState
个人理解哈
回复 使用道具 举报 1 0
多看几遍吧 我们说来说去也不急视频中老师说的好
回复 使用道具 举报
格式不需要理解
回复 使用道具 举报
子类向父类转换,进行隐式转换;父类转子类,需要显式转换。
回复 使用道具 举报
本帖最后由 mytongyong 于 2014-7-18 07:20 编辑
  1. class father {
  2.         public int x;
  3.         public int y;

  4.         public void sayHello() {
  5.                 System.out.println("Hello:father");
  6.         }

  7.         public void testfather() {
  8.                 System.out.println("testfather");
  9.         }

  10. }

  11. class child extends father {
  12.         public int z;

  13.         @Override
  14.         public void sayHello() {
  15.                 // TODO Auto-generated method stub
  16.                 System.out.println("Hello:child");
  17.         }

  18.         public void testchild() {
  19.                 System.out.println("testchild");
  20.         }
  21. }

  22. public class fathertochild {

  23.         public static void main(String[] args) {
  24.                 father fat = new father();
  25.                 child chi = new child();
  26.                 // 子类传递给父类,实现多态
  27.                 fat = chi;
  28.                 // fat是指向father的引用,虽然我把chi的引用传给了fat,但fat本质上还是指向father类的
  29.                 // 因此fat无法获得chi的新内容
  30.                 // 这句编译报错
  31.                 // fat.z = 2;
  32.                 // 这就是fat在运行时候的多态,fat是指向father的引用,但在运行时候却指向了chi的方法
  33.                 // 这句输出Hello:child
  34.                 fat.sayHello();

  35.                 father fat1 = new father();
  36.                 child chi1 = new child();
  37.                 // 父类传递给子类,强制类型转换
  38.                 // 隐式转换报错
  39.                 // chi = fat1;
  40.                 // 下面这种强制转换的形式就相当于将一个指向child类的引用chi,强制的指向了被强制转换成child类的father类,chi里面有继承了father的
  41.                 // 方法,也有自己实现了的方法,而fat里面并没有实现继承的方法。
  42.                 // 强制转换编译器不报错,但是运行时会抛出异常
  43.                 // com.itheima.father cannot be cast to com.itheima.child,呵呵说的多明白
  44.                 chi1 = (child) fat1;
  45.                 // fat1并没有z这个变量,但编译器认为chi是child类,肯定有z,但是运行时找不到z,抛出异常
  46.                 // 看看下面这几句代码,把编译器骗的好惨,但实际上根本不可能运行的
  47.                 // chi.z = 2;
  48.                 // System.out.println(chi.z);

  49.                 // chi.sayHello();
  50.                 // chi.testchild();
  51.                 // chi.testfather();
  52.                 // 实际写代码的时候经常看到有人将Object这个父类变来变去,但要知道,Object是所有类的父类,
  53.                 // 所以说任何类型都可以赋值给Object
  54.                 Object obj = new child();
  55.                 father fat3 = (father) obj;
  56.                 // 依然输出Hello:chilid
  57.                 fat3.sayHello();
  58.                 // 下面这段代码依然会抛出类型无法转换异常
  59.                 // com.itheima.father cannot be cast to com.itheima.child
  60.                 Object obj1 = new father();
  61.                 child chi2 = (child) obj1;
  62.                 chi2.sayHello();
  63.                 // 所以说不要尝试将父类强制转换成子类,也就是所谓的向下转型,这样是不安全的。编译时可以通过,但运行时会发生类型转换错误。
  64.                 // 谁也不想在代码变得庞大和复杂以后去找这种小bug吧,呵呵。
  65.         }

  66. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马