接口(interface)
一种公共的规范标准
只要符合规范标准,大家都可以通用
Java中的接口:体现在对行为的抽象
特点
- 接口用关键字interface修饰
public interface Speak {
void speak(String name,String age);
}
- 类实现接口用implements表示
public class Player implements Speak{
@Override
public void speak(String name, String age) {
}
}
- 接口不能实例化
- 参照多态的方式通过实现类对象实例化(接口多态)
- 接口的实现类
- 要么重写接口中所有的抽象方法
- 要么是抽象类
接口的成员特点
- 成员变量(常量)
- public static final(默认)
- 构造方法(无)
- 因为接口主要是对行为进行抽象的,是没有具体存在
- 一个类如果没有父类,默认继承Object类
- 成员方法(只能是抽象方法)
- 默认修饰符 public abstract
类和接口的关系
- 类与类
- 继承关系,只能单继承,但可以多层继承
- 类与接口
- 实现关系,可以单实现也可以多实现,还可以在继承一个类的同时实现多个接口
- 接口与接口
- 继承关系,可以单继承,也可以多继承
设计理念区别
- 抽象类:对类抽象(属性、行为)
- 接口:对行为抽象(主要是行为)
匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
匿名内部类不能是抽象类。
匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以初始化块,可以通过初始化块来完成构造器需要完成的工作。
- 实例1:不使用匿名内部类来实现抽象方法
public abstract class Person {
public abstract void eat();
}
class Child extends Person {
public void eat() {
System.out.println("eat something");
}
}
public class Demo {
public static void main(String[] args) {
Person p = new Child();
p.eat();
}
}
- 实例2:匿名内部类的基本实现
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
- 实例3:在接口上使用匿名内部类
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
- 实例4:Thread类的匿名内部类实现
public class Demo {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
t.start();
}
}
- 实例5:Runnable接口的匿名内部类实现
public class Demo {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}