继承,接口,多态与泛型

类的继承是一种非常重要的概念,简单来说,就是基于某个父类,对其进行扩展,得到一个新的子类。这种方法可以复用一些已经定义完善的类,不仅提高了软件的可维护性和可扩展性,也减少了软件的开发周期。
继承中子类可以继承父类原有的属性和方法,也可以增加父类没有的属性和方法,但是不允许删减父类中存在的属性或者方法,这是不符合LSP原则也就是可替换原则的。
就例如平行四边形类可以继承四边形的类,因为平行四边形是一种特殊的四边形,简单来说,四边形可以做到的在平行四边形中都应该能够做到,它将四边形具有的所有属性和方法都保留了下来。
但是如果是正方形类想继承长方形类,很显然这是不正确的,从以下几点就可以看出。
根据LSP原则中子类和父类规约的规定:
1.子类的规约的前置条件不能比父类强。
2.子类规约的后置条件不能比父类弱。
3.子类的RI不能比父类的弱。所以只能逆变。
从这个角度来讲,正方形的规约显然是不满足以上的,首先,正方形的前置条件只是长和宽大于0,不比父类强,但是正方形的后置条件变成了输出的长=宽,这显然是不符合父类的后置条件的。
在Java中,我们一般使用extends关键字来让子类继承父类。

class hell{
 public void p1() {
  
 }
 public void p2() {
  
 }
 public void p3() {
  System.out.print("aa");
 }
}

然后我们就能使用extends来继承hell类。

public class hello extends hell{
 public hello() {
  super();
  super.p3();
 }
 public void p1() {
  
 }
 public void p2() {
  
 }
 public void p3() {
  
 }
 public static void main(String args[]) {
  hello a=new hello();
  a.p3();
 }
}

在子类中,还有一种特殊的继承方法,也就是重写,很简单,也就是一种子类和父类的成员方法返回值,方法名,参数个数,参数类型均完全相同,但是方法的实现内容不同的继承方式。
需要注意的是,子类对父类方法的重写是不能缩小修饰权限的,也就是说,如果父类中的方法是protected,那么子类中的方法只能改成protected或者public,不能是private。
然后就要说说Object这个类了,因为在Java中,Object类是特殊的,它是所有类的父类,用户创建一个类的时候,默认都素从Object类继承而来的,而Object类中很常用而且基础的方法就是equals()和toString()和hashCode()方法,任何类都可以重写Object类中的方法。
就例如自定义的类中的equals()方法,很多情况下,在自定义的类中使用equals()方法来比较两个对象的时候,将返回false,因为equal()方法的默认实现是比较两个对象的地址,而不是比较对象的内容,所以我们需要重写equals()方法。
如果我们想要以不同的方式来实例化的对象,那么我们就需要使用多个同名的构造方法,那么我们就需要用到方法重载。
方法重载就是指同一个类中存在多个同名的方法,只需要保证这些方法的参数个数或类型不同。
编译器在编译这些方法的时候是利用方法名,方法参数的类型,方法参数的个数,方法参数的顺序来确定类中的方法是否唯一的。
而且在Java中,定义不定长参数的方法也是可以作为重载的方法的。

Java中要求程序有良好的扩展性,而且要求对所有的类对象进行通用的处理,那么我们就要用到多态,来使得一个类在不同的时期表现不同。多态的方法一般有三种:
1.子类型多态。
2.重载。
3.参数化多态
以上内容在前几次的博客中已经详细解释过了,这里不做赘述。

在Java中,有时候我们对于某些对象,没有办法使用具体的语言进行描述,就像一个图形类,我们不知道它有几条边,几个角,那么我们就只能使用抽象类来定义它。
对于抽象类,abstract 是定义抽象类的关键字,使用这个关键字定义的方法就叫做抽象方法,拥有这个方法的抽象类必须被继承,否则它没有任何意义。只要在一个类中有一个抽象方法,那么这个类就叫做抽象类。
这个方法也有一个坏处,即继承抽象类的所有子类都需要重写父类中的抽象方法,这样会导致很多的代码冗余,而且Java中不允许继承多个父类,为了让不需要该方法的子类不继承该方法,我们可以使用接口。
接口就是一种纯粹的抽象类,其中所有的方法都没有实体,我们只需要将某些不常用的抽象方法封装到一个接口中,使得需要这个方法的子类来实现接口。
接口使用interface定义,而且在接口中,方法必须被定义为public或abstract形式,否则编译器不认可。一个类实现一个接口,我们使用的是implements关键字。
接口也是Java中绕过多重继承的一个解决方法,因为Java中是允许多个接口的同时继承的,只要将所有继承的接口都放在implements后面且用逗号隔开。

class 类名 implements 接口1,接口2,接口3....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值