java问题3

来源:百度知道 编辑:UC知道 时间:2024/06/01 06:55:04
class A {}
class B extends A {}
A a = new A();
A b = new B();//1
B c = new B();//2
B d = new A();//3为什么这样会出错?

1和2有什么区别?在什么情况下用1,什么情况下用2?
谢谢!

A是父类,B是A的子类。

所以你 A b = new B()是没有问题的。
其实就相当于B e = new B(), 然后A b = e。

但是如果B d = new A();就有问题了。
这就相当于A f = new A(),然后 B d = f。

==做个比喻==
A是动物类,B是兔子类。
你说兔子是动物当然对,但如果你说动物是兔子就有问题了。

所以你要强制类型转换:B d = (B) new A();
这就是说兔子类的动物是兔子,就对啦。

至于1和2的区别呢。
1主要为了实现多态。就是比如你要做件衣服,要用动物皮毛,那那个东西首先要满足动物,然后你再选择是什么动物的皮毛。比如兔子毛……
(这个比喻比较残忍……)
2是最常用的new对象。

A b = new B();//1
面向父类编程,主要是为了实现多态;被子类重写的父类的方法,
B c = new B();//2
当想调用B中新增加的变量或者方法时,
B d = (B)new A();
要强制类型转换

A是父类,B是子类
A b = new B();//这实例变量是父类A, 而对象是子类B
B c = new B();//这实例变量,对象都是子类B
B d = new A();//而这实例变量是子类,肯定不能对象为父类
------
Object 对象你应该知道的吧,他是一切对象的父类,所以他能接受任何对象 Object o = new B();Object o = new A();//这两个都是对的

A b = new B();
B c = new B();
这个都没有问题,b,c是两个同的对象,你也可以把b看成是A的对象,c是B的对象。

先说3为什么是错的吧,请牢记住这句话:“子类不能引用父类的实例”。
但Java里有很多类似的话,单纯记很容易记混,所以还是理解的记忆比较好。打个比方便于记忆:
A —— 动物 ;B —— 狗