上一篇博文里总结了面向对象三大特性在Java中的体现,现在谈一谈Java中的抽象类,接口,内部类等特性。
一. 抽象类
public abstract class Shape {
public int shapeID = 0;
public abstract double getArea();
} Java中允许类、接口或成员方法具有抽象属性,而不允许成员域或构造方法具有抽象属性。类修饰词中含有abstract的类具有抽象属性,称为抽象类;接口总是具有抽象属性。如果成员方法的修饰词中含有abstract,则该成员方法具有抽象属性,称为抽象方法。抽象方法只能在抽象类或接口中定义。而抽象类中一般有至少一个抽象方法,所以总体上来讲,含有抽象方法的类叫做抽象类。抽象方法不含方法体,格式如下:
[方法修饰词列表] 返回类型 方法名(参数列表);抽象类可以具有构造方法,但不能直接生成实例,必须通过非抽象子类生成实例。如果抽象类的子类不是抽象类,则要求在子类的定义中必须覆盖父类(抽象类)的所有抽象方法。
二. 接口
Java不允许一个子类拥有多个直接父类,但允许一个类实现多个接口。接口定义的格式为: [接口修饰词列表] interface 接口名 [extends 接口名列表] { 接口体 }public interface Shape {
public static final double PI = 3.14159;
public abstract double getArea();
} 外部接口和外部类一样,一般都不具有protected和private属性接口本身具有抽象属性,所以abstract修饰词是不必要的。接口体内部不含构造方法,不能直接通过接口生成实例对象接口的所有成员域都具有public、static和final属性;接口的所有成员方法都具有public和abstract属性若实现接口的类不是抽象类,则需要在该类的类体中定义覆盖该接口中的所有成员方法。
三. 内部类
实名内部类
实名内部类的封装性修饰词增加了protected和private。可以根据情况选择。对于不具有静态属性的实名内部类,如果它的成员域具有静态属性,则必须同时具有final属性;不具有静态属性的实名内部类不能含有具有静态属性的方法。实名内部类实例对象的创建方法* 静态实名内部类的实例对象:
new 外部类名.实名内部类名(参数列表)
外部类表达式.new 实名内部类名(参数列表)
匿名内部类
匿名内部类不具有类名,不能具有抽象和静态属性,并且不能派生出子类。匿名内部类的定义格式是: new 父类型名(参数列表) { 类体 }举个例子比较容易理解:
abstract class ClassA {
int data;
public ClassA (int i) { data = i; }
public abstract void method();
}
public class ClassB {
public static void main(String[] args) {
ClassA a = new ClassA(3) {
public void method() {
System.out.println(data);
}
};
a.method();
}
}