特点:
(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方法,用来输出对象@Overridepublic String toString() {return "AbstractClass{" +"age=" + age +", name='" + name + '\'' +'}';}}// 创建一个子类继承抽象类(不完全重写抽象方法)abstract class Zi extends AbstractClass { // 不完全重写抽象方法,那么这个子类还是一个抽象类@Overridepublic void test1() {}}// 创建一个子类继承抽象类(完全重写抽象方法)class Zi2 extends AbstractClass{@Overridepublic void test1() {}@Overridepublic void test2() {}public Zi2() {}// 创建构造方法,为父类成员变量赋值public Zi2(String name, int age) {super(name, age);}}
总结:
(1)抽象类中的抽象方法不可以有方法体
(2)抽象类中可以创建普通方法
(3)抽象类中可以有成员变量
