7.继承和抽象类

一:继承


(1)继承概念


多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

 类与类之间的继承格式: class 子类名 extends 父类名


父类也叫基类超类子类也叫派生类


(2)继承的特点


1. Java中继承只支持单继承,不支持多继承。即一个子类只能有一个父类,但是父类可以有多个子类


2. 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。


3.▲ 问题:对于private修饰的父类成员,子类会不会继承?

扫描二维码关注公众号,回复: 2913121 查看本文章

官网解释:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html


A subclass inherites all of the public and protected members of 
its  parent,no maatter what package ths subclass is in.If the subclass is 
in the same package as its parent,it also inherits the package-private members 
of the parent.
You can use the inherited members as is,replace them,hide them,or
supplement them with new members.
A subclass does not inherit the private members of its parent class.
However,if the superclass has public or protected methods for accessing its 
private fields,these can also be used by the subclass.
A nested class has access to all the private members of its enclosing 
class-both fields and methods.Therefore,a public or protected nested class inherited 
by a subclass has indirect access to all of the private members of the superclass.


总结:1.子类如果和父类同一个包,那么子类也会继承父类的private修饰的成员


2.要访问private修饰的父类成员,可以通过public或protected修饰的方法,对private变量提供类似get方法


3.子类不继承父类的private修饰的成员 。注意一个是package-private 和private


(3)继承的好处


1 .提高了代码的复用性。 多个类相同的成员可以放到同一个类中

2. 提高了代码的维护性。  如果功能的代码需要修改,修改一处即可

3. 让类与类之间产生了关系,是多态的前提。


(4)子类方法中访问一个变量


在子类方法中访问一个变量:
 1. 首先在子类局部范围找
 2.然后在子类成员范围找
 3. 最后在父类成员范围找(肯定不能访问到父类局部范围)
 4. 如果还是没有就报错。(不考虑父亲的父亲…)


(5)方法重写


方法重写:子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写。

注意:

1. 父类中私有方法不能被重写

2. 子类重写父类方法时,访问权限不能更低

访问权限高到低:public | protected | 默认(friendly) | private

如:父类public,子类也只能是public

3. 父类静态方法,子类也必须通过静态方法进行重写


二:抽象类


(1)如何使用抽象类?

  在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承和多态处理。根据继承和多态原理,继承树越是在上方的类越抽象

         例如:鸽子类继承鸟类,鸟类继承动物类等。


  在多态机制中,并不需要父类初始化对象,需要的只是子类对象,所以在java语言中,设置抽象类不可以实例化对象,例如图形类不能抽象出任何一种具体图形,但是他的子类却可以。


(2)抽象类的语法格式如下:


         publicabstract class Test{

                   abstractvoid testAbstract();

  }


参数说明:abstract为定义抽象类的关键字

  使用abstract关键字定义的类为抽象类,而使用这个关键字定义的方法为抽象方法。

 (3)抽象方法


 抽象方法:没有方法体,这个方法本身没有任何意义,除非他被重写。


承载这个抽象方法的抽象类就必须被继承,实际上抽象类除了被继承之外没有任何意义。


注意抽象类被继承后必须重写抽象类中的所有抽象方法,并定义方法体。


(4)举例说明:


 

      继承抽象类的所有子类必须将抽象类中的抽象方法进行重写。这样在多态机制中,可以将父类修改为抽象类,

将draw()方法设置为抽象方法,然后每个子类都要重写这个方法。


    但这又会出现程序中会有太多冗余代码的问题,同时这样的父类局限性很大,也许某个不需要draw()方法的子类也不得不从写draw()方法;

    如果将draw()方法放置在另一个类中,让那些需要draw()方法的类继承该类,而不需要draw()方法的类继承

图形类。可是所有的子类都需要图形类,因为这些类是从图形类中被导出的,同时某些类还需要draw()方法,而java语言

规定,类不能同时继承多个父类,也就是java只支持单继承,面临这种问题,接口的概念就出现了。





猜你喜欢

转载自blog.csdn.net/RachelHYC/article/details/79144413