继承和多态

重点
  • 继承的实现
  • 子类实例化
  • 方法重写
难点
  • 方法重写
  • 向上转型
  • 向下转型
  • 多态的应用

1.1继承的作用
继承是面向对象的 三大特征之一,继承可以解决编程中代码冗余的问题,使实现代码重用的重要手段之一。
Java中 只支持单继承,即每个类只能有一个直接父类
语法:
[访问修饰符] class <SubClass> extends <SuperClass>{
}
  • 访问修饰符如果是Public,那么该类在整个项目可见。
  • 不写访问修饰符,则该类只在当前包可见。
在Java中,子类可以从父类中继承以下内容:
  • 可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一包里。
  • 可以继承默认访问修饰符修饰的属性和方法,但是子类和父类必须在同一包里。
  • 无法继承父类的构造方法。
2.1使用super关键字调用父类成员
super关键字和this关键字的作用类似,都是将被屏蔽了的成员变量、成员方法变得可见、可用,也就是说,用来引用被屏蔽的成员变量或方法。不过,super是用在子类中,目的只有一个,就是访问直接父类中被屏蔽的内容,进一步提高代码的重用性和灵活性。super关键字不仅可以访问父类的构造方法,还可以访问父类的成员,包括父类的属性、一般方法等。
语法:
访问父类构造方法:super(参数)
访问父类属性/方法:super.<父类属性/方法>
具有访问权限的限制,如无法通过super访问private成员。
2.1.2实例化子类对象
在Java中,一个类的构造方法在如下两种情况中总是会执行:
  • 创建该类的对象(实例化)。
  • 创建该类的子类的对象(子类的实例化)。因此,子类在实例化时,会首先执行其父类的构造方法,然后才执行子类的构造方法。子类继承父类时构造方法的调用规则如下:
  1. 如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,是否写"super();"语句,效果是一样的。
  2. 如果子类的构造方法中通过super显式调用父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类无参构造方法。
  3. 如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则。
特别需要注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
2.1.3Object类
Object类是所有类的父类。在Java中,所有的Java类都直接或间接地继承了java.lang.Object类中。所有对象都继承这个类中的方法。
Object类的部分方法:
toString()  返回当前对象本身的有关信息,按字符串对象返回
equals()比较来两个对象是否是同一对象,若是,返回true
clone()生成当前对象的一个副本,并返回
hashCode()返回该对象的哈希代码值
getClass() 获取当前对象所属的类信息,返回Class对象

2.2继承中方法重写
如果从父类继承的方法不能满足子类的需求,可以在子类中对父类的同名方法进行重写(覆盖),
方法重写必须满足如下要求。
  • 重写方法和被重写方法必须有相同的方法名。
  • 重写方法和被重写方法必须具有相同的参数列表。
  • 重写方法的返回值类型必须和被重写方法的返回值类型相同。
  • 重写方法不能缩小被重写方法的访问权限。
重载和重写有什么区别和联系?
  • 重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型无关。
  • 重写涉及的是子类和父类之间的同名方法,要求方法名相同、参数列表相同、返回值类型相同。
3.1实现多态的表现形式
Java面向对象还有一个重要的特性: 多态
3.1.1认识多态
根据作用到的不同对象类型,响应不同的操作。方法重写是实现多态的基础。
3.1.2向上转型
子类到父类的转换称为向上转型
语法:
<父类性> <引用变量名>=new <子类型>();
子类转换成父类时的规则:
  • 将一个父类中的引用指向一个子类对象,称为向上转型,自动进行类型转换。
  • 此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。
  • 此时通过父类引用变量无法调用子类特有的方法。
3.1.3向下转型
当向上转型发生后,将无法调用子类特有的方法。但是如果需要调用子类特有的方法时,可以通过把父类再转换为子类来实现。
语法:
<子类型><引用变量名>=(<子类型>)<父类型的引用变量>;
3.1.4instanceof运算符
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常。通常和强制类型转换结合使用。
3.2多态的应用
  • 可替换性:多态对已存在的代码具有可替换性。
  • 可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
  • 接口性:多态是父类向子类提供了一个共同的接口,由子类来完善或者覆盖来实现的。
  • 灵活性:多态在应用中体现了灵活多样的操作,提高了使用效率。
  • 简化性:多态简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个优点尤为突出和重要。
3.2.1在多态的程序设计中,一般有以下两种主要形式。
  1. 使用父类作为方法的形参
  2. 使用父类作为方法的返回值
总结
  • 继承是Java中实现代码重用的重要手段之一。Java中只支持单继承,即一个类只能有一个直接父类。Object类是所有Java类的祖先。
  • 在子类中可以根据实际需求对从父类继承的方法进行重新编写,称为方法的重写或覆盖。
  • 子类中重写的方法和父类中被重写的方法必须具有相同的方法名、参数列表,返回值类型必须和被重写方法的返回值类型形同。
  • 在实例化子类时,会首先执行其父类的构造方法,然后再执行子类的构造方法。
  • 通过super关键字可以访问父类的成员。
  • 通过多态可以减少类中的代码量,可以提高代码的可扩展性和可维护性。继承是多态的基础,没有继承旧没有多态。
  • 多态的应用中,可以使用父类作为方法的形参,还可以作为方法的返回值。
  • 把子类转换为父类,称为向上转型,自动进行类型转换,把父类转换为子类,称为向下转型,必须进行强制类型转换。
  • 向上转型后,通过父类引用变量调用的方法是子类覆盖或继承父类的方法,通过父类引用变量无法调用子类特有的方法。
  • 向下转型后,可以访问子类特有的方法,必须转换为父类指向的真实子类类型,否则将出现类型转换异常ClassCastException。
  • instanceof运算符用于判断一个对象是否属于一个类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值