java中的继承问题 10
1.如果父类是一个普通的类,子类(也是普通的类)继承了父类,可以不重写里面的方法,那么这样的继承还有意义吗?2.如果父类有一个方法(getconection),子类是不是...
1.如果父类是一 个普通的类,子类(也是普通的类)继承了父类,可以不重写里面的方法,那么这样的继承还有意义吗?2.如果父类有一个方法(getconection),子类是不是可以直接调用父类方法而不必new对象啊 (比如直接调用getconnection())3.为什么抽象类一定要实现(还有接口之类的)而继承则不一定要实现啊。4.有了继承为什么还需要接口啊,明明可以继承东西 了,为什么还要有接口啊,继承和接口不都是为了扩展功能吗?(最好举例说明更直观)
展开
展开全部
以下都把A作为父类,B作为子类。
1,一个一个说,如果任何A的方法(包括public和protected)都不重载,那么继承是毫无意义的。
A和B此时是等同的,任何使用B的地方都可以使用A,任何使用A的地方都可以使用B。继承就是为了发扬光大,扩展功能的。
2,如果A有一个getConnection方法,B可以不必重载这个方法,但是B可能会重载connect方法,对连接的这一行为加以重新定义。那么下面代码:
A a = new A()
B b = new B();
a.connect()和b.connect()的行为不同
但是a.getConnection()和b.getConnection()行为相同。对于对象方法(非static)必须通过new的对象来调用,不必new对象的说法是不对的,但是不必new父类的对象。
B b = new B(); b.connect();
继承是为了发扬光大,增加功能,同时还有一个明显的好处,就是上一代已经完成的功能,不必再重新实现一遍了,可以拿过来直接用。
继续说:
3,抽象类和接口,放在一起说:
首先是抽象类为啥一定要实现。凡是继承了某个抽象类的子类,如果自身不声明成也是抽象的话,就必须实现父类的所有抽象方法。这是语法的一个规定,抽象类不能new对象,不能new对象的东西,基本没啥用(你可能会说,我用static方法啊,静态方法是脱离了OO概念的,面向对象程序设计是提供一个舞台,各种对象在活动,你方唱罢我登场。static方法不需要对象,通常只用作一些工具类,比如math,可以说任何math对象的正弦函数实现都是一样的,只有满足这个条件,才能作为静态方法出现。)
因此作为抽象类的子类,有责任实现上一代的未竞事业。举个例子:
定义抽象类Bird,声明抽象方法jiao(),这个方法和具体是什么鸟有关(子类需要实现),并且和鸟的自身状态有关(对象方法,而不能是静态方法)。所以每个鸟的子类:Duck, Chicken
Goose都需要实现,哪怕只是一句:System.out.println("Ga Ga...");也是需要实现的。
java之所以有接口这个东西,很大一部分原因是java不支持多重继承,即一个类的的父类只能是一个,这样束缚了它的扩展性,好处是降低了复杂性。
应该这样理解接口,事物是复杂的,有主要属性,往往还有一些附加属性和方法。接口定义了一组行为集合,带有这类附加属性的类,往往在实现了主要属性的抽象方法后,还会实现附加的属性。
这里用我们最经常使用的String类做个例子:String类直接派生自Object类,即java的最顶层类,实现了对于字符序列的抽象。不过string还有一个很容易想到的附加属性,就是比较两个字符串的大小,这在排序中是很有用的。因为已经继承了Object类,无法再继承其他类,这就需要通过接口来实现:
public interface Comparable<T>
{
}
可以很轻易的想到:Double Integer还有好多类型都有相互比较的行为,这些类型之间或许有联系,不过大部分是没有什么必然联系。比如你定义Human类,Human的不同对象之间也有比较的行为,而且相当复杂,这些没有什么必然联系的类型却有同一种类似的行为——互相比较,这个用抽象类显然不合适,这里就是用接口最合适的地方。
抽象类集中了某一类东西的共同特征,接口却可以让他们分开——你自己愿意是什么就是什么,只要你遵循“契约”,你就可以拥有我的行为。
类似的例子还有:无论你是工人,农民,还是学生,或者什么人,都可以实现“驾驶”这一行为,
无论是Button,table,甚至布局,都可以实现一个onClickListener。
1,一个一个说,如果任何A的方法(包括public和protected)都不重载,那么继承是毫无意义的。
A和B此时是等同的,任何使用B的地方都可以使用A,任何使用A的地方都可以使用B。继承就是为了发扬光大,扩展功能的。
2,如果A有一个getConnection方法,B可以不必重载这个方法,但是B可能会重载connect方法,对连接的这一行为加以重新定义。那么下面代码:
A a = new A()
B b = new B();
a.connect()和b.connect()的行为不同
但是a.getConnection()和b.getConnection()行为相同。对于对象方法(非static)必须通过new的对象来调用,不必new对象的说法是不对的,但是不必new父类的对象。
B b = new B(); b.connect();
继承是为了发扬光大,增加功能,同时还有一个明显的好处,就是上一代已经完成的功能,不必再重新实现一遍了,可以拿过来直接用。
继续说:
3,抽象类和接口,放在一起说:
首先是抽象类为啥一定要实现。凡是继承了某个抽象类的子类,如果自身不声明成也是抽象的话,就必须实现父类的所有抽象方法。这是语法的一个规定,抽象类不能new对象,不能new对象的东西,基本没啥用(你可能会说,我用static方法啊,静态方法是脱离了OO概念的,面向对象程序设计是提供一个舞台,各种对象在活动,你方唱罢我登场。static方法不需要对象,通常只用作一些工具类,比如math,可以说任何math对象的正弦函数实现都是一样的,只有满足这个条件,才能作为静态方法出现。)
因此作为抽象类的子类,有责任实现上一代的未竞事业。举个例子:
定义抽象类Bird,声明抽象方法jiao(),这个方法和具体是什么鸟有关(子类需要实现),并且和鸟的自身状态有关(对象方法,而不能是静态方法)。所以每个鸟的子类:Duck, Chicken
Goose都需要实现,哪怕只是一句:System.out.println("Ga Ga...");也是需要实现的。
java之所以有接口这个东西,很大一部分原因是java不支持多重继承,即一个类的的父类只能是一个,这样束缚了它的扩展性,好处是降低了复杂性。
应该这样理解接口,事物是复杂的,有主要属性,往往还有一些附加属性和方法。接口定义了一组行为集合,带有这类附加属性的类,往往在实现了主要属性的抽象方法后,还会实现附加的属性。
这里用我们最经常使用的String类做个例子:String类直接派生自Object类,即java的最顶层类,实现了对于字符序列的抽象。不过string还有一个很容易想到的附加属性,就是比较两个字符串的大小,这在排序中是很有用的。因为已经继承了Object类,无法再继承其他类,这就需要通过接口来实现:
public interface Comparable<T>
{
}
可以很轻易的想到:Double Integer还有好多类型都有相互比较的行为,这些类型之间或许有联系,不过大部分是没有什么必然联系。比如你定义Human类,Human的不同对象之间也有比较的行为,而且相当复杂,这些没有什么必然联系的类型却有同一种类似的行为——互相比较,这个用抽象类显然不合适,这里就是用接口最合适的地方。
抽象类集中了某一类东西的共同特征,接口却可以让他们分开——你自己愿意是什么就是什么,只要你遵循“契约”,你就可以拥有我的行为。
类似的例子还有:无论你是工人,农民,还是学生,或者什么人,都可以实现“驾驶”这一行为,
无论是Button,table,甚至布局,都可以实现一个onClickListener。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询