在 Java 中抽象类的语法格式如下:
<abstract>class<class_name> {
<abstract><type><method_name>(parameter-iist);
}
其中,abstract 表示该类或该方法是抽象的;class_name 表示抽象类的名称;method_name 表示抽象方法名称,parameter-list 表示方法参数列表。
抽象方法没有方法体
抽象方法必须存在于抽象类中
子类重写父类时,必须重写父类所有的抽象方法。
抽象类和抽象方法都要使用 abstract 关键字声明。
抽象类不能实例化,也就是不能使用 new 关键字创建对象。(其实是可以的,只不过没意义,例子里就是这样写的)
例子:使用长方形类继承了形状类,又用菱形继承了长方形类,寻思写复杂点,多练几遍
package test;
public class Abstract {
//定义形状抽象类
public abstract class Shape {
public int width; // 长度
public int height; // 高度,不是宽度。
public Shape(int width, int height) {
this.width = width;
this.height = height;
}
// 定义抽象方法,计算面积area,定义抽象类周长length
public abstract double area();
}
//又定义抽象长方形类,继承形状类
public abstract class Square extends Shape{
public Square (int width,int height){
super(width, height );
}
@Override
public double area() { //重写父类抽象方法
return width*height;
}
public abstract double length();
}
//定义菱形类,继承长方形类
public class Diamond extends Square{
public Diamond(int width,int height){
super(width, height );
}
@Override
public double area() {
return width*height*0.5;
}
@Override
public double length() {
return width*2+height*2; //公式貌似不对,但不要在意这些细节哈哈
}
}
public static void main(String args[]){
Abstract.Diamond d =new Abstract ().new Diamond (1,3);//长方形的
System.out.println ( d.area () );
System.out.println ( d.length () );
Abstract.Square s =new Abstract ().new Square (2,4) { //菱形的
@Override
public double length() {
return width*2+height*2;
}
};
System.out.println ( s.area() );
System.out.println ( s.length () );
}
}
输出如下:
1.5
8.0
12.0
之前main方法我是这么写的:
public static void main(String args[]){
Diamond d =new Diamond (1,3);//长方形的
System.out.println ( d.area () );
System.out.println ( d.length () );
}
然后报错:
Error:(49, 20) java: /D:/Abstract.java:49: 无法从静态上下文中引用非静态变量 this
问题在于我把 class Diamond 放到了 public class Abstract 内部,导致Diamond 成了Abstract 的非静态内部类,属于Abstract 的一个成员,在静态方法main中不能访问非静态的成员,也就不能直接new Diamond(),只能通过外部类的对象访问,like this:
Abstract.Diamond d =new Abstract ().new Diamond (1,3);
注意:在使用 abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。