Java 语言提供了两种类,分别为具体类和抽象类。
一、定义抽象类和抽象方法
定义抽象类的时候需要用到关键字 abstract,放在 class 关键字前,如下。
abstract class 类名 { }
抽象类跟普通的类定义相比,就是在原来的基础上,加上一个abstract关键字。
抽象类是它的所有子类的公共属性的集合。
那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。
abstract class A{//定义一个抽象类 public void fun(){//普通方法 System.out.println("存在方法体的方法"); } public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰 }
二、抽象类和抽象方法的特征
1.抽象类是不能实例化的,尝试通过 new 关键字实例化的话,编译器会报错,提示“类是抽象的,不能实例化”。
2.子类可以通过 extends 关键字来继承抽象类。
3.抽象类里可以没有抽象方法,但是有抽象方法的类一定是抽象类。
4.如果一个子类继承了抽象类,那么,抽象类中的所有的抽象方法必须被子类复写。如果在子类中不复写该抽象方法,那么必须将此方法声明为抽象方法。
5.抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
6.抽象类和抽象方法不能被final修饰,因为抽象类就是用来被继承的,而final修饰后的类,不能被继承,两者有冲突。
7.抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
8.子类(如果不是抽象类)则必须覆写(@Override)抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);
三、抽象类和抽象方法的实例
1.首先创建一个表示图形的抽象类 Shape,代码如下:
public abstract class Shape { public int width; // 几何图形的长 public int height; // 几何图形的宽 public Shape(int width, int height) { this.width = width; this.height = height; } public abstract double area(); // 定义抽象方法,计算面积 }
2.定义一个正方形类,该类继承自形状类 Shape,并重写了 area( ) 抽象方法。正方形类的代码如下:
public class Square extends Shape { public Square(int width, int height) { super(width, height); } // 重写父类中的抽象方法,实现计算正方形面积的功能 @Override public double area() { return width * height; } }
3.定义一个三角形类,该类与正方形类一样,需要继承形状类 Shape,并重写父类中的抽象方法 area()。三角形类的代码实现如下:
public class Triangle extends Shape { public Triangle(int width, int height) { super(width, height); } // 重写父类中的抽象方法,实现计算三角形面积的功能 @Override public double area() { return 0.5 * width * height; } }
4.最后创建一个测试类,分别创建正方形类和三角形类的对象,并调用各类中的 area() 方法,打印出不同形状的几何图形的面积。测试类的代码如下:
public class ShapeTest { public static void main(String[] args) { Square square = new Square(5, 4); // 创建正方形类对象 System.out.println("正方形的面积为:" + square.area()); Triangle triangle = new Triangle(2, 5); // 创建三角形类对象 System.out.println("三角形的面积为:" + triangle.area()); } }
5.运行该程序,输出的结果如下:
正方形的面积为:20.0 三角形的面积为:5.0