特点:
(1)抽象类和抽象方法否需要使用abstract关键字修饰。
- 抽象类:abstract class 类名 {}
- 抽象方法:abstract public 返回值类型 方法名 (参数列表){ }
(2)抽象类和抽象方法的关系
- 抽象方法必须存在于抽象类中
- 抽象类中可以没有抽象方法
(3)抽象类不可以创建对象
- 可以由子类来继承抽象类,从而创建对象
- 抽象类是用于被继承的类
(4)抽象类和其子类的关系
- 抽象类的子类只有在全部重写完抽象方法之后才是一个普通类
- 如果子类没有重写完抽象方法,那么这个子类也是一个抽象类,需要用abstract修饰
代码如下:
package com.bxw.demo.abstract_;
// 创建一个抽象类
public class AbstractClassTest {
public static void main(String[] args) {
// 创建对象
// new AbstractClass() 抽象类是无法创建对象的(匿名内部类除外)
// 不完全重写的子类也是一个抽象类,因此也无法创建对象
// 完全继承的子类可以创建对象,并给抽象类的普通成员变量赋值
Zi2 zi2 = new Zi2("小白",23); // 直接赋值
// 输出
System.out.println(zi2);
// 单个输出
System.out.println(zi2.getName() + "-----" + zi2.getAge());
}
}
abstract class AbstractClass{
// 抽象类中可以定义成员变量
private int age;
private String name;
// 抽象类中的抽象方法必须使用abstract修饰
// 抽象类中的抽象方法不能有方法体
abstract public void test1();
abstract public void test2();
// 抽象类中也可以有构造方法
// 用于子类对父类的成员变量赋值
public AbstractClass(){}
public AbstractClass(String name, int age){
this.name = name;
this.age = age;
}
// 创建get、set公共访问方式
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 重写toString方法,用来输出对象
@Override
public String toString() {
return "AbstractClass{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
// 创建一个子类继承抽象类(不完全重写抽象方法)
abstract class Zi extends AbstractClass { // 不完全重写抽象方法,那么这个子类还是一个抽象类
@Override
public void test1() {
}
}
// 创建一个子类继承抽象类(完全重写抽象方法)
class Zi2 extends AbstractClass{
@Override
public void test1() {
}
@Override
public void test2() {
}
public Zi2() {
}
// 创建构造方法,为父类成员变量赋值
public Zi2(String name, int age) {
super(name, age);
}
}
总结:
(1)抽象类中的抽象方法不可以有方法体
(2)抽象类中可以创建普通方法
(3)抽象类中可以有成员变量