文章目录
抽象类和接口
抽象类
抽象类的概念
Java使用类实例化对象来描述现实生活中的实体,不过,不是所有的类都能描述实体的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类(准确来说,我们可以将这样的类设计成抽象类)。
以画图形为例,有如下代码:
//Shape.java
public class Shape {
public void draw() {
System.out.println("画一个图形");
}
}
//Pentagram.java
public class Pentagram extends Shape {
@Override
public void draw() {
System.out.println("五角星☆");
}
}
//Rotundity.java
public class Rotundity extends Shape {
@Override
public void draw() {
System.out.println("圆形⭕");
}
}
我们在实现Shape
类的draw
方法时,由于Shape
是一个宽泛的概念,不是一个具体的图形,所以我们实际上是没办法实现的,上代码中的实现也没有实际的意义,因此,我们可以将Shape
类设计成抽象类,而对于Shape
类中的draw
方法,我们可以将它设计成抽象方法.
抽象类的语法
Java中,被 abstract
修饰的类称为抽象类,抽象类中被 abstract
修饰的方法称作抽象方法。
抽象方法不用给出具体的实现。(这是强制的,不能给出方法体)
将上面的Shape
类设计成抽象类,draw
方法设计成抽象方法:
//Shape.java
public abstract class Shape {
public abstract void draw();
}
注意: 抽象类也是类,抽象类也可以有普通的成员方法、成员变量或构造方法。
抽象类与普通类的区别是抽象类有abstract
修饰,且可以存在抽象方法(不存在也可以)。
抽象类的特性
-
抽象类不能实例化对象
public class Test { public static void main(String[] args) { Shape shape = new Shape();//实例化抽象类,报错 } }
抽象类虽然不能实例化,但是抽象类的引用可以引用其子类的对象
//Shape.java
public abstract class Shape {
public abstract void draw();
}
//Pentagram.java
public class Pentagram extends Shape {
@Override
public void draw() {
System.out.println("五角星☆");
}
}
//Rotundity.java
public class Rotundity extends Shape {
@Override
public void draw() {
System.out.println("圆形⭕");
}
}
//Test.java
public class Test {
public static void func(Shape shape) {
shape.draw();
}
public static void main(String[] args) {
Pentagram pentagram = new Pentagram();
Rotundity rotundity = new Rotundity();
Shape[] shapes = {
pentagram, rotundity};
//向上转型
for(Shape shape : shapes){
func(shape);
}
}
}
-
抽象类必须被继承,且继承抽象类的子类必须重写抽象类中的抽象方法,如果不想重写抽象方法,需要加
abstract
修饰。不过,一旦这个类被一个普通的类继承,则此普通类必须重写所有的抽象方法。public abstract class Test { public abstract void func1()