一、抽象类是什么?
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
二、初始抽象类
2.1 基本语法
在 Java 语言中使用 abstract class 来定义抽象类。如下实例:
abstract class Employee {
//普通的成员属性
private String name;
private String address;
//构造方法
public Employee(String name, String address) {
this.name = name;
this.address = address;
}
//普通的成员方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
注意到该 Employee 类没有什么不同,尽管该类是抽象类,但是它仍然有 成员变量,成员方法和 构造方法
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
public static void main(String[] args) {
Employee employee = new Employee("zhangsan","shanxi");
}
代码可以编译通过吗?
我们可以发现抽象类是无法实例化对象的.
2.2 继承抽象类
1.抽象方法的权限
abstract class Shape {
abstract private void func();
}
抽象类要被继承,需要子类实现抽象方法,所以抽象方法的权限不能是private.
注意:抽象方法没有加访问限定符时,默认是public.
abstract class Shape {
abstract final void func();
}
抽象方法不能被final和static修饰,因为抽象方法要被子类重写
先写一个Shape抽象类
abstract class Shape {
//被abstract修饰的抽象方法,没有方法体
abstract public void draw();
abstract void calcArea();
}
抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
class Circle extends Shape {
private double r;
final private static double PI = 3.14;
public Circle(double r) {
this.r = r;
}
@Override
public void draw() {
System.out.println("画圆!");
}
@Override
void calcArea() {
System.out.println("面积为: "+PI*r*r);
}
}
public static void main(String[] args) {
Circle circle = new Circle(2);
circle.draw();
circle.calcArea();
}
实现父类的抽象方法后,即可正常实例化
class Rect extends Shape {
@Override
public void draw() {
}
}