抽象类和接口
/**
* 约束
* 只能单继承(本质是类)
*/
abstract class AbstractClass {
int a=10;
//只有方法名没有方法体
//抽象方法只能写在抽象类中
public abstract void run();
//普通有方法体的方法也可写在抽象类中
public void work(){
System.out.println("普通方法");
}
}
/**
* 接口本质是契约,只有规范,无实现
* 可以多继承
*/
interface InterfaceTest {
//public static final被省略
boolean judge = false;
//默认public abstract
void fly();
}
class Bird extends AbstractClass implements InterfaceTest {
@Override
public void run() {
System.out.println("跑");
}
@Override
public void fly() {
System.out.println("飞");
}
}
public class Main{
public static void main(String[] args) {
Bird bird = new Bird();
bird.run();
bird.fly();
bird.a=100;
System.out.println(bird.a);
//抽象类和接口new对象相当于匿名内部类继承并实现了抽象方法
AbstractClass ac=new AbstractClass() {
@Override
public void run() {
}
};
InterfaceTest it=new InterfaceTest() {
@Override
public void fly() {
}
};
}
}
结果
跑
飞
100
抽象类(abstract class)和接口(interface)有什么异同?
抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是 private、默认、protected、public 的,而接口中的成员全都是 public 的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。