面向对象第五天---三大特性之多态之接口

一、什么是接口

1、接口时一套标准化的协议(必须要配套使用)。

2、接口的作用是:做数据交换

3、接口的关键字是:interface

语法: [访问修饰符] 关键字interface 接口名{

接口里面的属性都是 pubic static final 默认修饰的常量

接口里面的方法默认都是 public 抽象关键字abstract 修饰的方法();

}


使用:格式如:public class 类名 implements 接口名1,接口名2{};

4、接口是让别的类用来调用的,所以通常接口的访问修饰符是public。接口如果不写访问修饰符,其默认是public

5、接口是抽象访问和常量值定义的集合(接口中的方法必须是抽象方法,接口定义的属性必须是常量)

(1)接口中的方法默认访问修饰符是public,并且是通过abstract进行修饰的抽象方法

(2)接口中属性是公共静态的常量,即接口中定义的属性都会默认加上 public stati final 作为前缀

6、接口可以看作特殊的抽象类,只不过这个抽象类中全部都是公共的静态常量,都是公共的抽象方法,比抽象类更加标准

7、jdk1.8之后的版本接口里面是允许定义static修饰的方法、允许定义default修饰的方法

8、一个类可以实现多个接口,若两个接口里有default修饰的相同方法名的方法,此时实现类必须得覆写default修饰的方法


二、接口的特性

1、实现接口的类必须实现接口中的抽象方法

2、多个类可以实现同一个接口

3、实现了接口的类可以被继承

4、接口和接口之间是可以多继承的。

5、接口和实现类的多态性:
6、接口和抽象类都遵循开闭原则(对修改关闭,对扩展开放)

三、接口和抽象类的区别

1、相同点:

(1)接口和抽象类都不能直接实例化,抽象类如果需要实例需要被继承,之后通过抽象类的引用指向子类的实例对象(变相的创建了实例对象)

(2)抽象类里的抽象方法必须全部被子类实现,如果子类不能全部实现父类的抽象方法,那么该子类只能是抽象类;一个类实现接口的时候,如果不能全部实现接口中的方法,那么这个类只能是抽象类。

(3)接口和抽象类都是用来抽象具体对象的,但是接口的抽象级别更高

(4)接口和抽象类都遵循开闭原则(对修改关闭,对扩展开放)

2、不同点:

(1)抽象类要被子类继承;接口要被类实现

(2)抽象类中可以有非抽象方法;接口中除了static和default修饰的方法,其他全为抽象方法

(3)抽象类中可以有普通成员变量;接口中只能定义公共静态常量

(4)抽象类是重构的结果;接口是设计的结果

(5)抽象类只可单继承;接口可以多继承

(6)抽象类可以有构造方法;接口不可以有构造方法


四、接口回调

1、接口回调是在开发中一种常用的设计手段,也可以当作一个处理问题的模型。运行接口的实现类实例的对象可以用接口类型的引用接收,调用时,用接口类型的引用名.方法名可以调用实现类中覆写过的接口中的方法。这种方式叫做接口回调。

2、应用场景:分层间的互相协作

五、内部类

1、Java中支持一个类在一个类的内部再定义一个类,我们称定义在一个类中的类为内部类或成员内部类(Inner Class)。

2、成员内部类

(1)成员内部类可以访问外部类的所有成员变量和方法

(2)内部类属于类,需要通过 类名.内部类 的方式得到这个类。

(3)成员内部类的创建方式

创建外部类的实例对象-->通过外部类访问内部类创建内部的实例对象

InnerClass outClass = new InnerClass();

InnerClass.InnerClass1 b = outClass.new InnerClass1();

其中new InnerClass1() 是outClass类中的构造方法

(4)成员内部类是依附于外部类而存在的。如果要创建成员内部类对象,则必须得有一个外部类对象。

(5)成员内部类属于外部类的成员,可以用priate修饰,但是只能在外部类内部进行访问。修饰符对成员内部类的作用与普通的成员方法作用范围相同。


3、局部内部类

(1)定义在一个方法或者一个作用域里面的类,它和成员内部类的区别是:局部内部类的访问权限仅限于方法或者作用域内

(2)局部内部类的访问修饰符不能是public、protected、default、private 修饰的,也不能用static进行修饰

(3)局部内部类创建对象时,要放在局部内部类加载完之后(因为代码的执行时从上到下的)

4、匿名内部类(重点:必须掌握)

(1)匿名内部类使用最多的场景时做事件监听,使用匿名内部类可以使我们的代码可维护性更高

(2)匿名内部类没有引用指向,和匿名对象一样只能使用一次

(3)可以实现抽象类里的抽象方法

(4)接口也可以使用匿名内部类的方式去实现

(5)匿名内部类被我们大量使用在多线程中,因为我们线程实现的方式有继承Thread类和实现Runnable接口两种

(6)格式: new 类名/接口/抽象类(){

}

(7)本质:匿名内部类会隐式的继承一个类或者实现一个接口,或者说,匿名内部类是一个继承了该类或者实现了该类接口的子类匿名对象。

5、静态内部类(重点:必须掌握)

(1)静态内部类不依赖外部类

(2)静态内部类创建对象

外部类.静态内部类 引用名 = new 静态内部列构造器();

(3)静态内部类中不能使用外部类中非static修饰的成员变量和方法。

原文地址:https://www.cnblogs.com/JQbiu/p/10801899.html