JAVA 多态、final关键字、抽象类和方法、 day10

1、继承的弊端:打破了封装性。使用final关键字规避问题

2、final关键字

特点:final修饰的类不能被继承,即没有子类(public final class A)

            final修饰的方法,不能被子类重写,只能被继承(final void function(){})

            final修饰的变量(成员变量和局部变量),是常量,成员变量在声明时必须指定该常量的值,局部变量可以先定义后赋值(final修饰的变量统一用大写来表示)(public static final int SUM)

注意:静态属性 /成员属性可以在 `静态代码块 /构造代码块 / 构造方法` 之所以可以先定义,后初始化,是因为这些方法都是系统自己调用的.但是不能在我们自己编写的 `静态方法 /对象方法`中进行初始化.因为程序无法确定我们自己编写的方法何时会被调用.

3、抽象类

定义:

当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的.针对这一问题, Java允许在定义方法时不写方法体,不包含方法体的方法称为抽象方法.抽象方法必须使用 abstract 关键字来修饰

注意:抽象方法一定要在抽象类中,抽象类中可以没有抽象方法;抽象类是不可以被实例化的,因为抽象类中有可能包含有抽象方法,抽象方法没有方法体,不能被调用。如果想调用抽象类中的方法,需创建一个子类,在子类中将抽象类中的抽象方法进行实现。如果子类没有复写父类的全部抽象方法,则子类也必须定义为抽象类

抽象类的特点:

3.1、抽象类一定是父类,但不一定是顶层父类

3.2、抽象类可以有父类

3.3、抽象类可以有构造方法,但是这个类不能创建对象。因为抽象类一定有子类,而创建子类对象的时候,在子类的构造方法中有super语句会找自己父类的构造方法进行初始 化动作。所以抽象类的构造方法是用来给子类进行初始化的.

3.4、abstract不能与private同使用,父类中私有的成员变量和方法子类是不知道的,因此使用private 和abstract关键字一起修饰方法,导致子类根本无法知道父类中有这个抽象方法,从而子类无法实现重写

static:如果使用static和abstract关键字一起修饰抽象方法,导致这个方法使用类名直接调用,从而无需创建对象, 而抽象方法是没有具体的方法实现体的.因此调用抽象方法是没有任何意义的

final :final修饰的方法子类是无法重写的,而abstract修饰的抽象方法,目的就是为了要求子类进行复写


4、接口:如果一个抽象类中所有的方法都是抽象的,可以定义为接口

注意:接口定义的方法和变量都包含一些默认的修饰符,接口中定义的方法默认使用 “public abstract”来修饰,即抽象方法.接口中变量默认使用 “public static final”来修饰.使用类名直接访问. 接口中的变量,都是常量。因此接口中的变量名一般都会全部大写。默认修饰符可以省略不写.

由于接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口中的方法.此时需要定义一个类,并使用 implements 关键字实现接口中所有的方法.

注意 : 一个类在继承另一个类的同时还可以实现接口,此时 extends 关键字必须位于 implements 关键字之前.


5、接口与多态: 接口类型可以存放任何实现了该接口类的对象

      eg:InterfanceDemo  a=new Cat();

             a.run();

6、类是单继承,接口可以多实现。接口不是类,它的出现仅仅是给描述这个事物体系增加额外的扩展功能。因此在接口中是没有构造方法的。也就是说接口是不能new对象的.

7、当一个类实现接口时,如果这个类是抽象类,则实现接口中的部分方法即可.否则需要实现接口中的所有方法.

8、当用户需要使用一个接口中的部分方法,或者个别方法时,那么就要求定义这个接口的人,给这个接口定义一个实现类,然后将接口中的方法全部进行空实现(方法体什么都不写)。而当外界需要使用接口中的方法时,不要直接去实现接口,而去继承这个空方法体的实现类,最后复写需要使用的方法即可。这种设计模式称为适配器设计模式.

9、适配器设计模式:

在设计接口的时候,如果接口中的方法过多,这时需要给接口定一个实现类,这个实现类称为适配器类,这个类中的方法都是空实现,方法体中没有任何代码。这时这个适配器类需要定义成抽象类。因为创建适配器类的对象,调用方法 `毫无意义`.

适配器类主要的作用: 从接口 过渡到 真实类



你可能感兴趣的:(JAVA 多态、final关键字、抽象类和方法、 day10)