抽象类 abstract
抽象方法:如果一个方法是不完整的,即没有方法体。那么,它就是抽象方法。
抽象类:用 abstract 关键字修饰的类就是抽象类。
- 包含抽象方法的类,一定是抽象类;但抽象类的方法不一定是抽象方法。
- 抽象类不能实例化,即不能创建对象。
- 抽象类可以被子类继承,也是采用关键字 extends
- 抽象类中如果有抽象方法,子类必须重写抽象方法。因此 abstract 不能和 final 同时使用。
// 抽象类
abstract class Abs {
// 抽象方法
public abstract void test(int a);
}
class ChildAbs extends Abs {
// 重写抽象方法
public void test(int a) {
// todo
}
}
接口 interface
接口:可以理解为一套规则,或基本的规范(契约)。
- 接口的属性必须是固定值,且不能修改,属性应该是静态的。
- 接口的方法和属性必须是公共的,方法应该是抽象的,即没有方法体。接口中允许存在默认方法。
- 接口和类是两个层面的概念。
- 接口负责制定规范,接口之间可以继承 extends ,属于多继承。
- 而类需要遵循接口规范,即类实现接口。采用关键字 implements。一个类可以同时实现多个接口。
- 接口不能直接实例化。
interface USBInterface {}
// 接口继承
interface USBSupply extends USBInterface {
public void powerSupply();
}
interface USBReceive extends USBInterface {
public void powerReceive();
}
// 类实现接口
// Computer 是 USBSupply 的实现
class Computer implements USBSupply {
// 电脑中提供了两个接口
public USBReceive usb1;
public USBReceive usb2;
public void powerSupply() {
System.out.println("电脑提供能源");
usb1.powerReceive(); // 调用接口的实现的方法
usb2.powerReceive();
}
}
// 类实现接口
// Light 是 USBReceive 的实现
class Light implements USBReceive {
public void powerReceive() {
System.out.println("电灯接收能源");
}
}
// 接口类型的变量,被它的实现类的对象赋值时,可以调用实现类的方法。
Computer computer = new Computer();
Light l1 = new Light();
USBReceive l2 = new Light(); // 也可以这样写
computer.usb1 = l1;
computer.usb2 = l2;
computer.powerSupply();
匿名类
- 如果一个抽象类的子类的类名不重要,就可以省去子类名和继承操作,好像在 new 抽象类一样。这是基于抽象类的匿名子类的实例化方式。
- 如果一个接口的实现的类名不重要,就可以省去类名和实现操作,好像在 new 接口一样。这是基于接口的匿名实现类的实例化方式。
// 抽象类
abstract class Per {
public abstract String name();
}
class Me {
public static void sayHello(Per p) {
System.out.println("Hello " + p.name());
}
}
// 接口
interface Fly {
public void fy();
}
基于抽象类的匿名子类
Me.sayHello(new Per() {
@Override
public String name() {
return "jack";
}
});
基于接口的匿名实现类
new Fly() {
// 重写接口的方法
public void fy() {
System.out.println("test fy");
}
}.fy();