抽象类
概念
Java中可以定义被abstract关键字修饰的方法,这种方法只有声明,没有方法体,叫做抽象方法.
Java中可以定义被abstract关键字修饰的类,被abstract关键字修饰的类叫做抽象类,抽象类中的方法不做限制,全为普通方法、全为抽象方法、抽象方法与普通方法并存
- 如果一个类含有抽象方法,那么它一定是抽象类
- 抽象类中的方法实现交给子类来完成
一个子类继承了一个抽象父类,有两种方案
- 变成抽象子类,“躺平”,也不实现,继续抽象
- 实现抽象子类中的所有抽象方法,“父债子偿”
语法格式
abstract class 类名{}
修饰符 abstract 返回值类型 方法名(参数列表);
示例
```java package cn.tedu.oop;
public class AbstractDemo { public static void main(String[] args) {
}
}
//被abstract修饰的类为抽象类,若一个类中包含抽象方法,那么这个类必须被声明为一个抽象类 abstract class Car{ public void start(){ System.out.println(“启动发动机”); }
public void stop(){
System.out.println("熄火了");
}
/*
被abstract修饰的方法是抽象方法,抽象方法没有方法体
添加抽象方法后,抽象方法所在类必须为抽象类
*/
public abstract void run();
public abstract void run1();
}
/ 当一个子类继承抽象的父类后有两种解决方法 1.变成抽象子类,”躺平“,也不实现,继续抽象 2.实现抽象子类中的所有抽象方法,”父债子偿“ / abstract class BMW extends Car{
}
class TOYOTA extends Car{ @Override public void run(){ System.out.println(“跑起来了”); }
@Override
public void run1() {
System.out.println("快的要起飞了");
}
}
<a name="q8y9n"></a>
## 注意事项
_抽象类有构造方法,但抽象类不可实例化<br />创建构造函数的意义:不为了自己使用,而是为了子类创建对象时使用_
<a name="TtztB"></a>
### 示例
<a name="JHnzV"></a>
#### 抽象类中构造函数的使用
```java
package cn.tedu.oop;
/**
* 用于测试抽象类中构造函数的使用
*/
public class AbstractDemo2 {
public static void main(String[] args) {
/*
Biological b = new Biological();
无法创建父类的对象---报错
*/
Human h = new Human();
}
}
/*
抽象类有构造方法,但抽象类不可实例化
创建构造函数的意义:不为了自己使用,而是为了子类创建对象时使用
*/
abstract class Biological{
public Biological() {
System.out.println("生物类的无参构造");
}
}
class Human extends Biological{
public Human() {
super();
System.out.println("人类类的无参构造");
}
}
抽象类中成员变量的使用
package cn.tedu.oop;
public class AbstractDemo3 {
public static void main(String[] args) {
}
}
/*
如果父类中都是普通方法,那为什么要定义成抽象类?
因为抽象类不可以被实例化,如果不想让别人创建本类
就可以把普通类定义成抽象类
抽象类中可以定义抽象方法,也可以全都为抽象方法
*/
abstract class Fruit{
/*
抽象类中可以创建成员变量,可以创建成员常量
*/
int sum = 100;
final String name = "水果";
/*
抽象类中可以定义普通方法,也可以全都是普通方法
*/
public void clean(){
System.out.println("水果要洗洗再吃");
}
public abstract void grow();
public abstract void eat();
}
class Apple extends Fruit{
@Override
public void grow() {
System.out.println("苹果成熟需要时间");
}
@Override
public void eat() {
System.out.println("苹果可以削皮再吃");
}
}