在学习Java的时候,有一段时间对Java里的抽象类一直发怵(其实现在也还是发怵)。总觉得这个类很神秘,不像public的光明磊落,也不像private的犹抱琵琶半遮面,更不像protected的义气冲天。
今天我们就来会一会abstract---抽象类
在面向对象概念中,所有的对象都是通过类来描述的,但是反过来,不是所有的类都是都是用来描述对象的。如果一个类中没有包含足够的信息来描绘一个具体的对象,这个类就是抽象类
抽象类不能实例化对象,比如
会提示: 类是抽象的,不能被实例化
但是类的其它功能依然存在,比如成员变量、成员方法和构造方法的访问方式和普通类一样。
如下显示:
public abstract class Employee {private String name; private String address; private int number; public Employee(String name,String address,int number){ //构造方法 System.out.println("Construction an Employ"); this.name = name; this.address = address; this.number = number; }public double computePay(){
System.out.println("Inside Employee computePay"); return 0.0; }
有构造方法、类变量和普通方法(这里为什么要说普通方法呢,稍后我们再看)
因为抽象类不能被实例化,所以抽象类必须要被继承,才能被使用
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
尽管我们不能实例化抽象类的对象,但可以通过抽象类的子类来进行实例化,让子类的对象来来继承父类抽象类的各种方法、类变量和构造方法
如下:
public abstract class Employee {private String name; private String address; private int number; public Employee(){
System.out.println("Hello"); }public Employee(String name,String address,int number){ //构造方法 System.out.println("Construction an Employ"); this.name = name; this.address = address; this.number = number; }public double computePay(){
System.out.println("Inside Employee computePay"); return 0.0; }public void mailCheck(){
System.out.println("Mailing a check to " + this.name + " " + this.address); }public String toString(){return name + " " + address + " " + number; }public String getName() {return name; }public String getAddress() {return address; }public void setAddress(String newAddress) {this.address = newAddress; }public int getNumber() {
System.out.println("getName"); return number; }
然后我们创建一个子类
public class AbstractDemo extends Employee{public static void main(String[] args) {
Employee employee = new Employee("1","2",1) {@Override public double computePay() {return super.computePay(); }@Override public void mailCheck() {super.mailCheck(); }@Override public String toString() {return super.toString(); }@Override public String getName() {return super.getName(); }@Override public String getAddress() {return super.getAddress(); }@Override public void setAddress(String newAddress) {super.setAddress(newAddress); }@Override public int getNumber() {return super.getNumber(); }
}; employee.computePay(); employee.getAddress(); employee.getName(); employee.getNumber(); employee.mailCheck(); employee.setAddress("北京"); employee.toString(); }
在子类实例化父类后,可以调用父类中的方法,得出结果
Construction an Employ
Inside Employee computePay
getName
Mailing a check to 1 2
如果一个非抽象类中有了抽象方法,可以运行吗?
我们来看个例子
按照程序要求,是不可以的,如果类中出现抽象类,则该类必须要是抽象类
写完文章后,发现有一个地方写错了,大家有找到的吗?
哭了,我写完后发现有个地方写错了。