接口(interface)
1.接口: 本质就是契约、规范、标准
2.接口关键字:interface
3.接口内部结构的说明:
可以声明:
属性:必须使用public staic final 修饰
方法: jdk8之前:声明抽象方法,修饰为public abstract
jdk8:声明静态方法、默认方法
jdk9:声明私有方法
不可以声明:构造器、代码块
4.接口与类的关系:实现关系
5.格式:class A extends super A implements B,C{}
1 | interface Flyable { |
常见实现方式:
1 | public class USBTest { |
6.说明
- 类可以实现多个接口
- 类针对于接口的多实现,一定程度上就弥补了类的单继承性和局限性
- 类必须将实现的接口中的所有抽象方法重写,方可实例化。否则类必须得声明为抽象类
- 重写的方法的访问级别不小于原方法
7.接口和接口关系:继承关系,且可以多继承
8.接口的多态性: 接口名 变量名 = new 实现类对象
9.区分抽象类和接口
共性:都可以声明抽象方法,都不能实例化
不同:抽象类一定有构造器,接口没有构造器
类与类直接继承关系,类与接口之间是实现关系,接口与接口直接是多继承关系
10.jdk8之后引入了default方法,引用了静态和default方法
- 接口类声明的静态方法,只能由接口
- 接口中声明的默认方法可以被实现类继承,实现类在没有重写此方法的情况下,默认调用接口中声明的方法。
- 类实现了两个接口,而两个接口中定义了同名同参数的默认方法。如果实现类没有重写此两个接口的方法,则会报错接口冲突
- 子类(或实现类)继承了父类并实现了接口。父类和接口中声明了同名同参数的方法。子类(或实现类)在类没有重写的情况下,默认调用的是父类的方法。
- 实现类继承了两个接口的两个同名方法。指定调用方法可采用”接口.super.方法()”
内部类
定义:将一个类A定义在另一个类B里面,类A为内部类,类B为外部类
为什么需要内部类:当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个完整的结构B又只为外部事物A提供服务,不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类
分类:
成员内部类:直接声明在外部类里面
使用static修饰: 静态的成员内部类
不使用static修饰:非静态的成员内部类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64public class PersonTest {
public static void main(String[] args) {
//1.创建Person的静态成员内部类的实例
Person.Dog dog = new Person.Dog();
dog.eat();//chien manger
//2.创建Person的非静态成员内部类的实例
Person p1 = new Person();
Person.Bird bird = p1.new Bird();
bird.eat();//Bird manger
bird.show("YY");//age1, nameYY, this.nameTTN, person.nameTom
bird.show1();
}
}
public class Person {
String name = "Tom";
int age = 1;
//静态成员内部类
static class Dog{
public void eat(){
System.out.println("chien manger");
}
}
//非静态成员内部类
class Bird {
String name="TTN";
public void eat(){
System.out.println("Bird manger");
}
public void show(String name){
System.out.println("age"+age);
System.out.println("name"+name);
System.out.println("this.name"+this.name);
System.out.println("person.name"+Person.this.name);
}
public void show1(){
eat();
this.eat();
Person.this.eat();
}
}
public void eat(){
System.out.println("人吃饭");
}
//局部内部类
public void method(){
class InnerClass1{
}
}
public Person(){
class InnerClass1{
}
}
{
class InnerClass1{
}
}
}
局部内部类:声明在方法内、构造器内、代码块内的内部内
匿名成员内部类
非匿名成员内部类
关于成员内部类的理解
从类的角度看:
内部可以声明属性、方法、构造器、代码块、内部类等结构
此内部类可以声明父类、可以实现接口
可以使用final修饰
可以使用abstract修饰
从外部成员的角度来看
- 在内部可以调用外部类的结构。比如属性、方法
- 除了使用public、缺省权限修饰之外。还可以使用private、protected
- 可以使用static
Ex
1 | public class OuterClass { |
常见问题
1.接口与抽象类的区别
2.接口是否可继承接口,抽象类是否可实现接口?抽象类是否可以继承实现类?
是;是;是;
3.接口可以有自己属性吗?
可以。必须是public static final
4.访问接口的默认方法如何使用?
使用实现类的对象进行调用。而且实现还可以重写此默认方法。