抽象类
抽象类的作用与C++类似,不能实例化。只能通过子类继承,再进行实例化。一般是为了确定一种统一的抽象格式。
// 定义的抽象类
abstract class AbsClass{
abstract void myName(); // 一个抽象方法
void print(){
System.out.println("play method !");
}
}
// 继承并实现抽象方法
class myClass1 extends AbsClass{
void myName(){
System.out.println("class1");
}
}
class myClass1 extends AbsClass{
void myName(){
System.out.println("class2");
}
}
class Test{
// 实例化
myClass1 c1;
myClass1 c2;
// 测试
public static void main(){
c1.myName();
c1.print();
c2.myName();
c2.print();
}
}
接口
接口是一种方法的抽象,而不是类。
interface Method1{
abstract void print();
}
interface Method2{
abstract void show();
}
// 同时实现两个方法
class myClass1 implements Method1,Method2{
void print(){
System.out.println("print class 1");
}
void show(){
System.out.println("show class 1");
}
}
class myClass2 implements Method1,Method2{
void print(){
System.out.println("print class 2");
}
void show(){
System.out.println("show class 2");
}
}
class Test{
myClass1 c1;
myClass2 c2;
public static void main(){
c1.print();
c1.show();
c2.print();
c2.show();
}
}
二者的区别与联系
举一个很经典的例子,也在其他教程中非常常见的例子。假设有一个抽象类,表示门
abstract class Door{
public abstract void open();
public abstract void close();
}
现在,假设我们要实现一个防盗门的实例,仅需要继承并且实现这个抽象类即可:
class AntiTheftDoor extends Door{
public void open(){
// 一些实现方法
}
public void close(){
// 一些实现方法
}
/*
···一些其他属性
*/
}
如果使用接口的话,可以这样定义:
interface Door{
public abstract void open();
public abstract void close();
}
之后进行方法的实现:
class AntiTheftDoor implements Door{
public void open(){
// 一些实现方法
}
public void close(){
// 一些实现方法
}
/*
···一些其他属性
*/
}
如果我们想要一个门添加报警的方法,有下面几个选项:
- 直接在抽象类中声明一个报警方法,但是不是所有的门都需要这个方法。
- 在方法中添加一个报警功能,但是不是所有有报警功能的东西都是门,比如说放到警报。
正确的实现方法应该这样:
// 门的抽象类
abstract class Door{
public abstract void open();
public abstract void close();
}
// 报警的抽象方法
interface Alarm{
void alarm();
}
class AntiTheiftDoor extends Door implements Alarm{
public void open(){
// 一些实现方法
}
public void close(){
// 一些实现方法
}
void alarm(){
// 一些实现方法
}
}