初学须知之Java的抽象类与接口
抽象类
1.抽象类的定义
抽象类用来描述事物的一般行为和状态,然后由子类去实现这些行为或状态,以适应对象的多样性。
抽象类要用abstract修饰符修饰,定义格式如下:
abstract class 类名称{
成员变量的定义;
方法名(){...} //此处定义的是具体的方法
abstract 方法名(); //定义的是抽象方法,没有方法体,具体的实现方式由子类来定义
}
【说明】
(1)抽象类中可以包含抽象方法和具体方法,抽象方法在定义时,在方法头后直接加分号,没有大括号括住的方法体。
(2)抽象类不能实例化对象。
(3)抽象类只能单继承。
(4)所有的抽象方法都必须存在于抽象类当中。
2.抽象类的应用
【例1】 定义一个代表“形状”的抽象类,其中包括求形状面积的抽象方法。继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存入一个数组中,访问数组元素将各类图形的面积输出。
abstract class Shape { //定义了一个抽象类Shape
abstract public double getArea(); //定义一个抽象方法getArea
}
class Triangle extends Shape{ //定义了一个三角形类,并继承抽象类
private double a,b,c; //定义三角形三边
Triangle(double x,double y,double z){
a=x;
b=y;
c=z;
}
public double getArea(){ //对抽象方法的实现
double p=(a+b+c)/2;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
}
class Rectangle extends Shape{
private double a,b;
Rectangle(double x,double y){
a=x;
b=y;
}
public double getArea(){
return (a*b);
}
}
class Circle extends Shape{
private double radius;
Circle(double x){
radius=x;
}
public double getArea(){
return (3.14*radius*radius);
}
}
public class Ex8_1{
public static void main(String[] args) {
Shape[] s=new Shape[3]; //创建3个Shape类的数组
s[0]=new Triangle(3,4,5);
s[1]=new Rectangle(6,7);
s[2]=new Circle(2.5);
for (int i = 0; i < 3; i++) {
System.out.println(s[i].getArea());
}
}
}
【说明】子类继承抽象类后,必须实现抽象类中的抽象方法。此外,虽然抽象类不能实例化对象,但可以创建数组。
【例2】关于抽象类中的构造方法的分析
abstract class Father{
Father(){
System.out.println("父类"); //抽象类的构造方法
}
}
class Son extends Father{
Son(){
System.out.println("子类");
}
}
public class Test {
public static void main(String[] args) {
Son s=new Son();
}
}
输出结果:
父类
子类
【说明】可以看到,在创建子类的对象时,系统自动调用了父类的构造方法,然后再调用子类自身的构造方法。由此可以总结:虽然抽象类不能实例化对象,但可以有构造方法,而抽象类的构造方法仅在子类对象创建时调用。
接口
Java中不支持多继承,而是通过接口来实现比多重继承更强的功能。
1.接口的定义
接口由常量和抽象方法组成,由关键字interface引导接口定义。语法如下:
[public] interface 接口名 [extends 父类名列表]{
常量类型 常量名=常量值; //默认的是public static final
方法返回值类型 方法名(形参表); //默认的是public abstract
}
需要注意以下几点:
-
接口中,只有常量和抽象方法,它们的默认类型分别是:public static final和public abstract,在定义接口时,这些修饰符可以省略。
-
接口也具有继承性,一个接口可以继承多个父接口,父接口用逗号隔开。
-
接口是抽象类的特殊化(可以这么理解),故接口也不能创建对象。
2.接口的实现
一个类要实现某个接口,就必须实现接口中所有的方法。有关接口的实现,需要注意以下几点:
-
一个类可以实现多个接口,在类的声明部分,用关键字implements来声明该类要实现那些接口。
-
接口的默认访问权限为public,在实现时方法头要加上public.
抽象类与接口的区别
1.从语法层面上比较
| 比较点 | 抽象类 | 接口 |
|---|---|---|
| 关键字 | abstract class | interface |
| 属性 | 无限制 | 必须是public、static、final的 |
| 方法 | 普通方法、抽象方法 | 抽象方法,且必须是public的 |
| 继承/实现 | 只能被类或抽象类继承 | 既可以被接口继承,也可以被类或抽象类实现 |
| 多重继承 | 不支持 | 可以继承多个父接口 |
| 子类中的声明 | 用extents关键字 | 用implements关键字 |
2.从含义上理解
-
抽象类是子类的固有属性,是具有该行为的一类物质的基本特点。抽象类与子类的关系是“is a”。
-
接口是该物质所具有的某个性质。接口与子类的关系是“like a”。
内嵌类
内嵌类也就是类里再嵌套类,因此,内嵌类也称为内部类或潜逃类,而包含内嵌类的类称为外层类。内嵌类与外层类在逻辑上是所属关系,内嵌类的使用要依托外层类。内嵌类的作用是用来实现没有通用意义的功能逻辑。内嵌类在初级阶段还用不上,所以在这里就不过多讲解。
内嵌类根据有无关键字static可分为成员类和静态内嵌类。此外,还有方法内嵌类和匿名内嵌类。

浙公网安备 33010602011771号