抽象函数 java

Python015

抽象函数 java,第1张

1、抽象

当想要通过共通接口来操作一组classes时,便可撰写abstract class。子类中所有与“抽象类所声明的标记式”相符的函数,都会通过动态绑定的机制来调用。

有一组类他们拥有一系列相似的行为特征,它们拥有一些共同的函数,我们就把这些共同特征抽取出来放到抽象类中,抽象类为所有的子类提供“共同的接口”。

建立抽象类的唯一理由是:

各子型别都可以以以不同方式来表现此一共同接口。达到多态性的目的。

注意点:

* 抽象函数只能在抽象类中出现(即,一个普通的类中,不能声明抽象函数,一旦声明,要将该class用abstract做饰词,否则编译出错)

* 抽象类不能被实例化。否则编译出错。

* 只有当子类实现了抽象类中定义的所有函数,该子类才可被实例化。否则,该子类便也是个抽象类。

* 也可以将一般的类(不含任何抽象函数的类)声明为abstract。表明不允许该类产生任何实例。

2、接口

完全抽象的class,不带半点实现内容。interface相当于是在类之间建立起的一个协议。

interface使得我们可以撰写出“可被向上转型为多个基本型别”的class,达到C++多重继承的变形。

注意点:

* 默认interface是friendly,可通过加上关键字public成为public。

* interface中定义的函数默认是public的,因为它提供共同接口,需要可以被外界访问。为了增强程序可读性,可显式声明为public。

* 当实现某个interface,用关键字implement。

实现类中袭承自interface的函数必须都要定义为public。一定要显式写明是public,默认就变成friendly,减低了访问权限,这在Java编译器中是不允许的。

3、区别和联系

异:

* 抽象类用于支持多态性,接口用来支持“多继承”变形—— 一个class可向上转型为多个基本型别。

* 抽象类中函数既可是抽象的,也可是包含实现细节的。接口只能表示形式,其中函数必定都是抽象的。

* 抽象函数中可定义变量。接口只能定义 static/final 的成员变量。

同:

- 抽象类和接口都不能被实例化。

抽象类不能被实例化,所以你说的“当我执行Animal类中的Crazy函数时候”,这句话本身就是错的。再有,抽象方法在抽象类里的写法不是你这样的。应该是abstract void Cry()而不是你写的abstract void Cry{}

另外,抽象类只能被子类继承,由子类将抽象类中的抽象方法重写。而只能实例化子类,当然调用的自然是对应子类重写的Cry方法。如:

class Pig extends Animal {

void cry {

System.out.println("Pig cry")

}

}

class Dog extends Animal {

void cry {

System.out.println("Dog cry")

}

}

public class Test {

public static void main(String args[]) {

Pig p = new Pig()

Dog d = new Dog()

p.cry()

d.cry()

}

}