抽象类定义
抽象类
- 抽象类表示一个抽象概念
- 抽象类不能产生实例化对象,必须通过子类实例化。因此抽象类必须有子类的出现。
- 抽象类能够明确的定义子类需要覆写的方法。
- 抽象类使用 abstract 关键字声明。
- 抽象类中具有抽象方法,抽象方法同样需要用 abstract 关键字声明。该方法只有声明,没有方法体(所以子类必须覆写抽象类中的抽象方法,并且抽象类的子类不能为抽象类)
- 抽象类可以具有构造方法用来初始化抽象类的属性
- 抽象类不能用 final 关键字定义,因为其必须具有子类,否则无法实例化。
例如:
图形类(Shape),是一个抽象的概念,我们无法具象化该图形的面积等,所以它的成员函数 area()为空。
而继承它的子类(矩形、圆、三角形、椭圆)就可以覆写 area() 成员方法。
import java.util.Scanner;
abstract class Shape{ // 图形类
abstract public String area(); // 该成员方法只有方法声明,没有方法体
}
class Circle extends Shape{ // 圆类
final private static double pi = 3.14;
private double r;
public String perimeter(){
System.out.print("请输入圆的半径: ");
Scanner sca = new Scanner(System.in);
this.r = sca.nextDouble();
return "圆的周长为:" + (2 * pi * r);
}
public String area(){
System.out.print("请输入圆的半径: ");
Scanner sca = new Scanner(System.in);
this.r = sca.nextDouble();
return "圆的面积为: " + (2 * pi * r * r);
}
}
public class JavaDemo {
public static void main(String[] args) {
Circle cir = new Circle();
System.out.println(cir.perimeter());
System.out.println(cir.area());
}
}
// 运行结果
请输入圆的半径: 33
圆的周长为:207.24
请输入圆的半径: 33
圆的面积为: 6838.92
Process finished with exit code 0
抽象内部类
如果抽象类只有 1 个子类,则可以将该子类封装为 抽象内部类,从而为用户隐藏这个无需知道的类。
package com.itheima;
abstract class A //抽象类
{
abstract public void printData();//abstract修饰的方法为抽象方法,无需实现方法体.但是必须被子类覆写
static private class B extends A //需要在抽象类里隐藏的内部类
{
public void printData()
{
int data = 12;
System.out.println("B Data:"+ data); //打印内部类的Data值
}
}
static public A getInstance() //获取实例
{
return new B(); //通过静态方法来获取要隐藏的静态抽象内部类 (静态方法里只能使用静态变量)
}
}
public class JavaDemo {
public static void main(String[] args) {
A a = A.getInstance();
a.printData(); //等价于: A.getInstance().printData();
}
}
// 运行结果
B Data:12
Process finished with exit code 0
抽象类缺点:
由于Java的单继承,每个类只能从一个抽象类继承,没有接口灵活。