智渔课堂官方免费教程十六:Java面向对象之抽象类

时间:2023-01-19 19:23:43

抽象类

使用关键字abstract声明的类,就是抽象类。
语法格式:[public] abstract class 类名{}

抽象类不能被实例化(创建对象),但是可以声明引用;
抽象类不能使用final修饰,一旦使用final修饰,表示这个抽象类将不能被继承,而抽象类又不能被实例化,这样创建出来的这个抽象类就没有任何意义了。所以,java规定抽象类不能使用关键字final修饰,否则会出现编译错误
抽象类中可以声明抽象方法和普通方法,普通类中不能包含抽象方法;

抽象方法

加了abstract声明的方法,而且不能有方法体,使用英文格式的分号结束。
语法格式:[访问修饰符]  abstract  返回值类型  方法名([参数列表]); 
抽象方法不能被private、final、static修饰
抽象类中的抽象方法不能省略关键字abstract 
在子类中必须实现父类中的抽象方法,除非子类也是一个抽象类。
实例:
package abstracts;
/**
* 创建抽象类Person
* @author 学霸联盟 - 赵灿
*/
public abstract class Person {
// 抽象类中可以有变量,声明一个变量age
public int age;

// 抽象类中可以有构造方法
public Person() {
}

// 抽象类中可以有普通方法,声明一个普通方法eat
void eat() {
System.out.println("吃");
}

/*
* 抽象类中可以有抽象方法,普通类中不能含有抽象方法
* 作为人类需要工作,但不同的人有不同的工作,现在还不知道具体是什么工作
* 所以此处声明一个抽象的方法,只是规定了子类中必须要实现工作的方法
* 具体如何工作由子类自己去实现
* 抽象方法不能使用static或final修饰
*/
public abstract void work();
}

package abstracts;
/**
* 如果子类也是抽象类,则可以不用重写父类中的抽象方法
* @author 学霸联盟 - 赵灿
*/
public abstract class YellowRace extends Person {
//这里可以不实现父类中的抽象方法
}

package abstracts;
/**
* 创建开发者类Developer,继承Person类
* @author 学霸联盟 - 赵灿
*/
public class Developer extends Person {
// 必须实现父类中的抽象方法
@Override
public void work() {
// 本类中并没有声明变量age,所以此处的age是从父类中继承的
this.age = 18;
System.out.println("编写代码");
}
}

package abstracts;
/**
* 创建测试类Test
* @author 学霸联盟 - 赵灿
*/
public class Test {
public static void main(String[] args) {
// 父类引用指向子类对象
Person p = new Developer();
// 调用父类中的eat方法
p.eat();
// 这里将会执行子类中重写的work方法
p.work();
}
}
运行结果:

编写代码

小结:
抽象类的优点:可以包含抽象方法,从而规定子类中必须有哪些方法
抽象类的缺点:java只支持单根继承