请问
class abc{
...
}
class def{
...
public abc test(){
}
}
和
class def extends abc{
...
public test(){
}
}
有什么区别?他们各自是什么用途?实现什么样的功能?
还有就是
函数调用的时候
class def {
...
public test(){
}
}abc t = new def();
这样调用使t有了什么不同于
abc t = new abc();
的属性???
我知道问题很初级,劳烦各位大师细心讲解。多谢多谢!!!
class abc{
...
}
class def{
...
public abc test(){
}
}
和
class def extends abc{
...
public test(){
}
}
有什么区别?他们各自是什么用途?实现什么样的功能?
还有就是
函数调用的时候
class def {
...
public test(){
}
}abc t = new def();
这样调用使t有了什么不同于
abc t = new abc();
的属性???
我知道问题很初级,劳烦各位大师细心讲解。多谢多谢!!!
is-a 关系用继承来表达;has-a关系用组合来表达2,abc t = new def();属向上转型
has-a 关系:汽车has-a 轮子,计算机has-a主板你把上面例子里的is-a和has-a两边的东西看作是class就好理解了
这样调用使t有了什么不同于
abc t = new abc();
的属性???
=============
前面的t的t.test方法调用的是在def中定义的test()
后一个t的t.test方法调用的是在abc中定义的test()
直接写成def t = new def();不就行了。一定是有区别,而且我觉得是让t有了abc的属性。
=============================
单独来看这句话实在没什么用,也没什么必要。
代码中的每句话都是有上下文,你这里没什么上下文,讨论起来也没什么意义。可以假设有个方法是
void f(abc x){
...
}
这个时候你就可以直接调用f(t)了
当然,如果你写成def t = new def();通过f((abc)t)调用也是可以的。
你如果是从某本书上摘录的上述代码段,那他一定是像说明向上转型这个问题,或者说多态性这个问题。
接着上面的,如果我abc派生出来有n个类,我没必要给这个n个类挨个构造以这n个类本身为参数的f()方法,只需要一个以基类为参数的方法就足够了。
一定是有区别,而且我觉得是让t有了abc的属性。
=====================================
t是指向你new出来的def对象的引用,而def由abc派生而来,t当然有abc的属性啦。即使是写成def t = new def();t也是有abc的属性的。
class def {
...
public test(){
}
}abc t = new def();
这样还和你说的一样吗?如果不同你可以给我讲讲不同吗?
=================
可能是我们对你说的“属性”这个词理解有偏差吧。我理解的这个属性没有细化到你说的方法上去。
例如:圆类继承了形状类,我在圆类里覆盖了形状的paint方法,但我说圆有形状的属性应该没错吧?不过这个不重要,如果按照你说的属性(指你定义的abc类中的方法和def类中的方法)来,abc t = new def();后,t里面是没有abc的属性的。abc t = new def();
相当于
def d=new def();
abc t=(abc)d;