一、什么是抽象类
如果一个类(class)定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。使用abstract修饰的类就是抽象类。
注意:抽象类无法实例化。
abstract class Person { public abstract void hello();}
如上所述,如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法,把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的,所以,Person类也无法被实例化。编译器会告诉我们,无法编译Person类,因为它包含抽象方法。因此必须把Person类本身也声明为abstract,才能正确编译它。
Person p = new Person(); // 编译错误
无法实例化的抽象类有什么用?因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强行要求子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。如Person类定义了抽象方法hello(),那么在实现子类Student的时候,就必须覆写hello()方法:
public class Main {
public static void main(String[] args) {
Person p = new Student();
p.hello();
}
}
abstract class Person {
public abstract void hello();
}
class Student extends Person {
public void hello() {
System.out.println("Hello,Student!");
}
}
Java结果如下:
二、接口
在抽象类中,抽象方法本质上是在定义接口规范:即规定高层类的接口,从而保证所有子类都有相同的接口实现,这样,多态就能发挥出威力。如果一个抽象类没有字段,所有方法全部都是抽象方法:
abstract class Person {
public abstract void hello();
public abstract void bye();
}
就可以把该抽象类改写为接口:interface。在Java中,可以使用interface关键字声明一个接口:
interface Person {
void hello();
void bye();
}
所谓interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。因为接口定义的所有方法默认都是public abstract的,所以这两个修饰符不需要写出来(写不写效果都一样)。当一个class去具体实现一个接口interface时,需要使用implements关键字,举个栗子:
public class java2 {
public static void main(String[] args) {
Person p = new Student("Li Lei");
p.hello();
p.bye();
}
}
interface Person {
void hello();
void bye();
}
class Student implements Person {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void hello() {
System.out.println(this.name + " hello");
}
@Override
public void bye() {
System.out.println(this.name + " bye");
}
}
Java结果如下:
三、Python抽象类、接口
首先,大家必须明确的一点是:Python中没有抽象类、接口类型,Python是动态语言,定义接口只是人为规定,在编程过程中的自我约束!在其他的语言里,比如Java,继承类没有重写接口方法是会报错的,而在python则不会,就是因为Python没有这个类型。
发表评论 取消回复