拜托那个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对象的引用变量,至于内存方面谁用得多,这肯定是第三行代码占用内存大点咯.
Son son = (Son)father 是类型转换 把father转换成Son类型的 Son son = new Son(); 是引用 在堆里申请一段空间 将变量son 引用(指向 )那块内存;
我的理解: 1> Father father = null; 建立了一个Father引用变量.它里边的内容为空NULL 2> Son son = (Son)father ; 同上. 3>Son son = new Son(); 首先,建立一个Son对象,再建立一个son引用变量,把Son对象的地址.存放在son引用变量中.就让son引用变量指向Son对象.//引用变量和对象在内存里是两个存在不同地址的存在.好像在那本书上看过,对象都是存放在堆里的!我也是刚刚开始学,不知道对不对!个人看法.
大家都说了好多阿,我就不说了,然代码来说吧,呵呵! 跑一跑大概就知道区别了: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();所以关键是把握真正做事情的构造函数是谁的呵呵,写完收功……
19楼正解。 补充一下,首先分清什么是强转; 再搞清楚,对象与指向的关系 Father father = new Father()具体是一个什么过程请你搞清楚搞清楚了什么就明白了,
Father father = null,不是说这个father里面就什么都没有,其实是有东西的至少存在Father这个数据类型在里面,只是指这个father里面的对具体对象的引用为空
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的动态加载特性啊,呵呵!建议好好看看虚拟机的规范说明……
Son son = new Son(); 是new出一个新对象
去这个J2EE blog看看:http://www.3y11.com
这是有问题的,父类的引用可以指向子类的引用
一楼的回复说明了两种方式的技术名称,而三楼的说法也有歧义,两种方法生成的son,都是指向内存中的Son对象,并且都是null。
两种方式的区别是,第一种占用的内存会比第二种多一点点。
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对象的引用变量,至于内存方面谁用得多,这肯定是第三行代码占用内存大点咯.
还要分清引用和对象的区别。father、son都只是引用,不是对象。决定运行时方法动态调用的虚方法表不用去管它。在编译时,无论显式还是隐式转换,无论什么类型之间的转换,只要类型匹配就行编译器就不会报错。
而类型之间到底能不能转换是运行时反映出来的,转换成功就OK,否则就报错ClassCastException
第二句算是初始化一个son的对象
Son son = new Son(); 是引用 在堆里申请一段空间 将变量son 引用(指向 )那块内存;
1> Father father = null;
建立了一个Father引用变量.它里边的内容为空NULL
2> Son son = (Son)father ;
同上.
3>Son son = new Son();
首先,建立一个Son对象,再建立一个son引用变量,把Son对象的地址.存放在son引用变量中.就让son引用变量指向Son对象.//引用变量和对象在内存里是两个存在不同地址的存在.好像在那本书上看过,对象都是存放在堆里的!我也是刚刚开始学,不知道对不对!个人看法.
跑一跑大概就知道区别了: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();所以关键是把握真正做事情的构造函数是谁的呵呵,写完收功……
补充一下,首先分清什么是强转;
再搞清楚,对象与指向的关系 Father father = new Father()具体是一个什么过程请你搞清楚搞清楚了什么就明白了,
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的动态加载特性啊,呵呵!建议好好看看虚拟机的规范说明……
如果不是Father f=new Son();的话,如果你有100个Son,那么就要把beat()写100遍
beat(Son1 s1)
.
.
.
beat(Son100 s100)
那 (Son)Object 也可以了
实际上是不可以的