文章目录
9.1 抽象类和抽象方法
抽象方法:仅有声明而没有方法体
抽象类:(1)包含抽象方法的类必须被限定为抽象的(不需要所有方法都是抽象的)。抽象类可以没有抽象方法(为了让该类无法实例化)。(2)抽象类是普通的类与接口之间的一种中庸之道。抽象类是不完整的,因此无法实例化。如果导出类为所有抽象方法提供了定义,那么导出类可以实例化,否则导出类也是抽象类。
public interface A1 {
void a1();
}
public interface A2 extends A1 {
void a2();
}
abstract class B1 implements A2 {
public void a1() {
System.out.println("a1被实现了");
}
abstract public void b1();
}
class C1 extends B1 {
public void a2() {
System.out.println("a2被实现了");
}
public void b1() {
System.out.println("b1被实现了");
}
public static void main(String[] args) {
C1 b1 = new C1();
b1.a1();
b1.a2();
b1.b1();
}
}
9.2 接口
- interface关键字产生一个完全抽象的类,没有提供任何具体实现。接口中的方法默认是abstract和public的。
- 接口也可以包含域,但是这些域被隐含是static和final的。也是public的。
- 一个普通类可以通过implements关键字实现接口,必须实现所有的抽象方法。要实现一个接口时,接口中被定义的方法必须被定为public,否则在方法被继承过程中,其可访问权限被降低,编译器报错。
9.4 多重继承
一个具体类只能有一个父类,但是可以实现多个接口
具体类必须放到前面,后面是接口,否则会报错。
如果父类和接口有同名方法。因为子类需要实现该方法,因此调用的是实现的方法。
public class Man extends Person implements Eat, Fly {
public void eat() {}
public void fly() {}
}
9.5 通过继承来扩展接口
public interface A {
void a1();
void a2();
}
public interface B {
void b1();
}
public interface C extends A, B {
void c1();
}
public class implements C {
void a1() {}
void a2() {}
void b1() {}
void c1() {}
}
9.7 接口中的域
接口与中的任何域都自动是static和final的,所以接口是一种很便捷的用来创建常量组的工具,在Java SE5之前是产生枚举类型的唯一途径。
域自动是public的。
public interface Person {
int age = 200, height = 180;
void eat();
}
9.8 嵌套接口
接口可以嵌套在类或其他接口中。
接口中可以定义接口,默认且必须是公共的。
public interface bbb {
public interface bbbb {}
interface bbbb {}
}
类中可以定义接口,具有任何访问修饰符(接口也可以private)。
public class bbb {
public interface bbbb {}
interface bbbb {}
private interface bbbb {}
}
类中可以定义类
public class C {
private class c1 {
void f() {
System.out.println("c1被实现了");
}
}
private class c2 {
void f() {
System.out.println("c2被实现了");
}
}
public c1 getc1() {
return new c1();
}
public c2 getc2() {
return new c2();
}
}
public class D {
public static void main(String[] args) {
C c = new C();
//C.c1 a1 = c.getc1();
C.c2 a2 = c.getc2();
a2.f();
}
}
类在实现嵌套接口时不用实现其内部的接口
9.9 接口与工厂
生成遵循某个接口的对象的典型方法就是工厂方法设计模式。