JavaSE之面向对象之继承、多态、抽象类、接口


一、继承

(一)、继承的概述

继承是面向对象的三大特征之一,可以使得子类具有父类的方法和属性,还可以在子类中重新定义,追加属性和方法。

继承的格式

● 格式:public class 子类名extends父类名{}

●范例:public class Zi extends Fu{}

●Fu:是父类,也被称为基类和超类。

●Zi:是子类,也被称为派生类。

父类:

子类:

当在测试类里面通过子类调用show 方法时报错,因为show方法在父类,此时我们可以通过子类继承父类来调用show方法。继承以后再调用就不会报错了。

继承前:

继承后:

继承中子类的特点:

●子类可以有父类的内容。

●子类还可以有自己特有的内容。

(二)、继承的好处和弊端

继承好处:

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

●提高了代码的维护性(如果方法的代码需要修改,修改一处即可)。

继承弊端:

●继承让类与类之间产生了关系,类的耦合性增强了,当父类变化时,子类也不得不跟着变化,消弱了子类的独立性。

什么时候使用继承?

●继承体现的关系:is a .

●假设法;我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说他们存在继承关系,这个时候就可以考虑用继承来实现,否则不能乱用继承。

●举例:水果和苹果,动物和猫。

(三)、继承中变量的访问特点

 在子类中访问一个变量时:

●子类局部范围找

●子类成员范围找

●父类成员范围找

●如果都没有就报错

(四)、super关键字

super关键字的用法和this关键字的使用方法相似

●this:代表本内对象的引用。

●super:代表父类存储空间的标识(可以理解为父类对象的引用)

 (五)、继承中构造方法的访问特点

子类中所有的构造方法都会默认访问父类中无参的构造方法,为什么呢?

●因为子类会继承父类中的数据,可能还会使用父类中的数据,所以,子类初始化之前,一定要先完成父类数据的初始化

●每一个子类构造方法的第一条语句默认都是:super()

如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

●通过使用super关键字去 显示的调用父类的带参构造方法。  

●在父类中自己提供一个无参的构造方法。

(六)、继承中成员访问的特点

通过子类对象访问一个方法:

●先在子类成员范围找

●再父类成员范围找

●如果都没有就报错

(七)、方法重写

方法重写:

●子类中出现了和父类中一摸一样的方法声明

方法重写的应用:

●当子类需要父类的功能,而功能主体子类有自己特有额内容时,可以重写父类中 的方法,这样,既沿袭了父类中的功能,又定义了子类特有的内容。

●@Override可以帮我们检查重写方法的方法声明的准正确性

方法重写注意事项:

●私有方法不能被重写(父类私有的成员(被private修饰)子类是不能继承的)。

●子类 方法访问权限不能更低(publi > 默认 > 私有)

(八)、继承的注意事项

●Java中类只支持单继承,不支持多继承。

●Java中类支持多层继承。

(九)、权限修饰符

1.final

final  关键字是最终的意思,可以修饰成员方法,成员变量,类

final 修饰的特点:

●修饰方法:表明该方法是最终方法,不能被重写。

●修饰变量:表明该变量是常量,布恩那个再次被赋值。

●修饰类:表明该类是最终类,不能被继承。

final修饰局部变量:

●变量是基本类型:final修饰指的是基本类型的数据值不能发生改变。

●变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的。

2.static

static 关键字是静态的意思,可以修饰成员方法,成员变量。

static修饰的特点:

●被类的所有对象共享

               这也是我们判断是否使用静态关键字的条件。

●可以通过类名调用

                当然,也可以通过对象名调用。推荐使用类名调用。

static 访问的特点:

静态的成员方法只能访问静态成员

二、多态

(一)多态的概述

同一个对象,在不同时刻表现出来的不同形态

举例:猫

我们可以说猫是猫:猫cat = new猫()。

我们也可以说猫是动物:动物animal = new 猫()

这里在不同时刻表现出来的不同形态,这就是多态

多态的前提和体现

●有继承/实现关系

●有方法重写

●有父类引用指向子类对象

(二)多态中成员访问特点

●成员变量:编译看左边,执行看左边。

●成员方法:编译看左边,执行看右边。

为什么成员方法和成员变量不一样呢?

●因为成员方法有重写,而成员变量没有

(三)多态的好处和弊端

●多态的好处:提高了程序的扩展性

                    具体体现:定义方法的时候,使用父类型作为参数,将来使用的时候,使用具体的子类形参与操作

●多态的弊端:不能使用子类的特有功能。

(四)多态中的转型

首先给出三个类:

动物类:

猫类:

测试类:

●向上转型:从子到父,父类引用指向子类对象

●向下转型:从父到子,父类引用转为子类对象

三、抽象类

抽象类的概述:

在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

抽象类的特点:

●抽象类和抽象方法必须使用abstract关键字修饰。

         public abstract class 类名{}

         public abstract void eat();

●抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。

●抽象类不能实例化

          抽象类如何实例化呢?

            参照多态的方式,通过子类对象实例化,这叫抽象类多态。

●抽象类中的子类

              要么重写抽象类中的所有方法

              要么是抽象类

抽象类的成员特点:

●成员变量:可以是变量,也可以是常量;

●构造方法:有构造方法,但是不能实例化

      那么构造方法的作用是什么呢?

               用于子类访问父类数据的初始化

●成员方法:可以有抽象方法,限制子类必须完成某些动作。

                     也可以有非抽象方法,提高代码的复用性。

四、接口

(一)接口的概述

接口就是一种公共的规范标准,只要符合规范标准,大家都可以使用

Java中的接口更多的体现在对行为的抽象。

(二)接口的特点

●接口用关键字interface修饰

            public interface 接口名{}

●类实现接口用implements表示

            public class类名implements 接口名{}

●接口不能实例化

             接口如何实例化呢?

                    参照多态的方式,通过实现类对象实例化,这叫接口多态。

             多态的形式:具体类多态,抽象类多态,接口多态

             多态的前提:有继承或者实现关系,有方法重写,有父(类/接口)引用指向(子/实现)类对象。

●接口的实现类

            要么重写接口中的所有抽象方法,要么是抽象类。

(三)接口的成员特点

●成员变量:只能是常量;

                     默认修饰符:public static final

●构造方法:接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在的。      

                     一个类如果没有父类,默认继承Object类

●成员方法:知识抽象的方法

                    默认修饰符:public abstract

(四)类和接口的关系

●类和类的关系

            继承关系,只能单继承,但是可以多层继承

●类和接口的关系

            实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。

●接口和接口的关系

            继承关系,可以单继承,也可以多继承

(五)抽象类和接口的区别

●成员区别

            抽象类                      变量,常量;有构造方法,有抽象方法,也有非抽象方法

            接口                          常量;抽象方法

●关系区别

             类与类                       继承,单继承

             类与接口                   实现,可以单实现,也可以多实现

             接口与接口                继承,单继承,多继承

●设计理念区别

             抽象类                        对类抽象,包括属性,行为

             接口                            对行为抽象,主要是行为

       

猜你喜欢

转载自blog.csdn.net/m0_62764440/article/details/121625964