Son 是子类,Father是父类请问:
    Father father = null;
    Son son = (Son)father ;

  Son son = new Son();
有什么区别 ?

解决方案 »

  1.   

    Son   son   =   (Son)father   ;是强制类型转换
    Son   son   =   new   Son(); 是new出一个新对象
    去这个J2EE blog看看:http://www.3y11.com
      

  2.   

    第一个son是一个指向null的 Son型引用,第二个son是指向一个Son对象的Son型引用。over。
      

  3.   

      Son   son   =   (Son)father   ; 
    这是有问题的,父类的引用可以指向子类的引用
      

  4.   

      楼上,父类转子类,并且是显式转换,并没有问题,只是用法上需要多注意而已。
      一楼的回复说明了两种方式的技术名称,而三楼的说法也有歧义,两种方法生成的son,都是指向内存中的Son对象,并且都是null。
      两种方式的区别是,第一种占用的内存会比第二种多一点点。
      
      

  5.   

    拜托那个5楼的.你自已在这方面的理解都成问题..还好意思批别人..难道别人出这个题就按你那个区别去回答吗?况且你那个回答也是错误的.我来回答一下.我不敢说我回答全对..但至少对一半.
            Father   father   =   null; 
            Son   son   =   (Son)father   ; 
    和 
      Son   son   =   new   Son(); 首先:father只是一个Father的null引用变量;
    那么第二句:Son son=(Son)father;//虽然它把father变量强制转换为Son对象的引用,那么son完全等于father都是空引用.
    至于第三句:Son   son   =   new   Son(); //它先在内存的堆里构造了一个Son对象实例.然后son变量就指向刚构造的对象.他们的区别是:第二行是空引用变量,第三行是指向son对象的引用变量,至于内存方面谁用得多,这肯定是第三行代码占用内存大点咯.
      

  6.   

    多态问题确实很困扰初学者重要的是要分清编译时和运行时之间的区别。
    还要分清引用和对象的区别。father、son都只是引用,不是对象。决定运行时方法动态调用的虚方法表不用去管它。在编译时,无论显式还是隐式转换,无论什么类型之间的转换,只要类型匹配就行编译器就不会报错。
    而类型之间到底能不能转换是运行时反映出来的,转换成功就OK,否则就报错ClassCastException
      

  7.   

    father是一个空对象 son怎么能引用呢。
    第二句算是初始化一个son的对象
      

  8.   

    Son       son       =       (Son)father     是类型转换   把father转换成Son类型的
    Son       son       =       new       Son(); 是引用  在堆里申请一段空间  将变量son 引用(指向 )那块内存;
      

  9.   

    我的理解:
    1> Father   father   =   null; 
       建立了一个Father引用变量.它里边的内容为空NULL
    2> Son   son   =   (Son)father   ; 
       同上.
    3>Son   son   =   new   Son(); 
       首先,建立一个Son对象,再建立一个son引用变量,把Son对象的地址.存放在son引用变量中.就让son引用变量指向Son对象.//引用变量和对象在内存里是两个存在不同地址的存在.好像在那本书上看过,对象都是存放在堆里的!我也是刚刚开始学,不知道对不对!个人看法.
      

  10.   

    大家都说了好多阿,我就不说了,然代码来说吧,呵呵!
    跑一跑大概就知道区别了:public class Test {
        public static void main(String[] args){
    Father father = new Father();
    Son son1 = (Son)father;    //此处抛出运行时异常ClassCastException,编译可以通过
    son1.say();
    Son son2 = new Son("Mike");
    son2.say();
        }
    }class Father{
    }class Son extends Father{
        private String name;
        public Son(String name){this.name=name;}
        public void say(){
    System.out.println("hello");
        }
    }
    结论:
    1.Java允许从父类向子类强制转换,编译器开绿灯
    2.注意Java程序没有那么智能,不会自动帮你添加属性
    3.你的Father如果是null的话,就无所谓了,因为根本就没有分配内存,甚至都没有导入类文件,你只要用java -verbose Test来运行就能看到。只要把握住一点,是用了谁的构造函数来构造的,才会享有谁的属性。更多的人喜欢这么写Father son = new Son();所以关键是把握真正做事情的构造函数是谁的呵呵,写完收功……
      

  11.   

    19楼正解。
    补充一下,首先分清什么是强转;
    再搞清楚,对象与指向的关系 Father father = new Father()具体是一个什么过程请你搞清楚搞清楚了什么就明白了,
      

  12.   

    Father father = null,不是说这个father里面就什么都没有,其实是有东西的至少存在Father这个数据类型在里面,只是指这个father里面的对具体对象的引用为空
      

  13.   

    22楼的朋友?
    Father father = null;
    其实要说什么都没有也对,因为连Father这个Class都没有被虚拟机加载进来,除了一个名字,真的什么都没有哦!
    很容易证明的:    Father father = null;
        System.out.println(“Nothing”);
        father = new Father();
    java -verbose Test.class运行屏幕输出结果如下——
        [Loaded Test from file:/D:/]
        Nothing
       [Loaded Father from file:/D:/]

    由此可见在father为null的情况下,虚拟机连Father这个class都没有load进来,怎么会知道它有哪些属性呢,这充分说明了Java的动态加载特性啊,呵呵!建议好好看看虚拟机的规范说明……
      

  14.   

    beat(Father f)
    如果不是Father f=new Son();的话,如果你有100个Son,那么就要把beat()写100遍
    beat(Son1 s1)
    .
    .
    .
    beat(Son100 s100)
      

  15.   

    (Son)father   可以的话
    那 (Son)Object 也可以了
    实际上是不可以的