抽象类
- abstract class
- 抽象类无法被实例化
- 虽然抽象类无法实例化,但是抽象类有构造方法,该构造方法是给子类创建对象用的
- 抽象类中可以定义抽象方法。
抽象方法的语法:在方法的修饰符列表中添加abstract关键字,并且以“;”结束,不能带有“{}”。例如:public abstract void m1(); - 抽象类中不一定有抽象方法,但抽象方法必须出现在抽象类中。
- 一个非抽象的类继承抽象类,必须将抽象类中的抽象方法重写,实现。
- 抽象类无法被final修饰
例子
abstract class A{//定义一个抽象类
public void fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
接口
接口也是一种引用类型,可以等同看做类。
- 如何定义接口,语法:
[修饰符] interface 接口名{} - 接口中只能出现:常量,抽象方法
- 接口其实是一个特殊的抽象类,特殊在接口是完全抽象的
- 接口中没有构造方法,接口也无法被实例化
- 接口和接口之间可以多继承
- 一个类可以实现多个接口。(这里的”实现”可以等同看做“继承”)
- 一个非抽象的类实现接口,需要将接口中的所以方法“实现/重写/覆盖”
- 接口的作用
a) 可以使项目分层(分为Test主类和Impl实现类两层,中间用接口连接),所有层都面向接口开发,开发效率提高了。
b) 接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”,可以随意切换
c) 接口和抽象类都可以完成某个功能,优先选择接口。因为接口可以多实现,多继承,并且一个类除了实现接口之外,还可以去继承其他类。(保留了类的继承)
范例:
public interface A {
//常量:必须用public static final 修饰
public static final String name = "zhangsan";
public static final double PI = 3.14;
//public static final 可以省略的
byte MAX_VALUE =127;
//抽象方法用public abstract修饰
public abstract void m1();
//可以省略public abstract
void m2();
}
例子1:
CustomerService.java //定义接口
public interface CustomerService {
void logout();//抽象方法
}
----------------------------
Impl.java //实现接口的类
public class Impl implements CustomerService {
public void logout() { //重写
System.out.println("成功退出系统");
}
}
--------------------------
Test.java //主类调用接口
public class Test {
public static void main(String[] args) {
CustomerService cs = new Impl(); //多态(左边接口,右边实现类),面向接口去调用(使用接口中声明的方法,只关心接口中声明的方法);不关心底层对象(不关心Ipml类中的logout();具体怎么实现的)
而Impl对象中的logout();方法也是依赖接口实现的。所有,两者都依赖接口
cs.logout();
//编译时期静态绑定接口CustomerService中的logout();运行时期绑定接口的实现类Impl中的logout();
}
}
例子2:
/*Engine.java 接口(中间层:连接甲方和乙方)
汽车和发动机之间的接口
生产汽车的厂家面向接口生产
生产发动机的厂家面向接口生产*/
public interface Engine {
public abstract void start();
}
--------------------------------
//Honda.java 发动机Honda(乙方->实现接口)
public class Honda implements Engine {
public void start() {
System.out.println("Honda启动");
}
}
----------------------
//Yamaha.java 发动机Yamaha(乙方->实现接口)
public class Yamaha implements Engine {
public void start() {
System.out.println("Yamaha启动");
}
}
-------------------------
//Car.java 汽车(甲方->面向接口编程)
public class Car {
//面向接口编程,Engine
Engine e;
Car(Engine e){
this.e = e;
}
public void testEngine() {
e.start(); //面向接口调用
}
}
----------------------------
//Test.java 主类
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Yamaha y = new Yamaha(); //生产发动机
Honda h = new Honda();
Car c = new Car(y); //生产汽车
c.testEngine();
c.e = new Honda();
c.testEngine();
}
}
结果:
Yamaha启动
Honda启动