Java 抽象类

  • 一、抽象类的概念
  • 二、抽象类的使用
  • 1.抽象类和抽象方法的格式
  • 2.抽象类和抽象方法的使用
  • 3.抽象类的意义
  • 4.抽象类的使用实例

一、抽象类的概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

二、抽象类的使用

1.抽象类和抽象方法的格式

抽象的关键字是abstract

抽象类: 加上abstract关键字修饰
抽象方法: 加上abstract关键字修饰去掉大括号

public abstract class Animal {
    //抽象方法
    public abstract void eat();
    public abstract void sleep();

    //成员方法
    public void methodTest(){
    }
}

【注意】

1.抽象方法一定在抽象类中抽象类不一定有抽象方法 2.抽象类仍然可以有成员变量、成员方法、构造方法

2.抽象类和抽象方法的使用

要想使用抽象类和抽象方法必须具备继承关系
定义一个抽象类Person

给 Person类 添加属性和方法

public abstract class Person{
    //抽象类可以拥有成员属性、成员方法、构造方法
    String name;
    String sex;
    //定义两个抽象方法
    public abstract void eat();
    public abstract void sleep();
}

Second
定义一个继承 Person类 的 Student类 (学生类)

学生类作为抽象Person的子类,必须实现(重写)Person类的所有抽象方法

public class Student extends Person{
    @Override
    public void eat() {
        System.out.println("学生吃饭了");
    }
    @Override
    public void sleep() {
        System.out.println("学生睡觉了");
    }
}

Third
定义一个 Test类,创建子类对象并使用

public class Test{
    public static void main(String[] args) {
    Student s = new Student();
    s.eat();
    s.sleep();
    }
}

运行结果:

java抽象基类 java抽象类使用_抽象类


【注意】

1.抽象类可以具有所有普通类具拥有的东西 2.抽象方法没有大括号
3.抽象类不能创建对象 4.抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类 5.抽象类的子类必须重写父类的所有的抽象方法子类是抽象类除外
6.抽象类的构造方法是提供给子类初始化父类成员使用的


看到这里也许你会感到抽象类多此一举,那么请继续往下看


3.抽象类的意义

抽象类约束了继承它的子类,必须实现某一种或多种功能
放在现实生活中可以将抽象类理解为一种规范

举个例子:
就像手机一样,它有最基本的打电话和发短信的功能。这就可以衍生出一个抽象类。抽象类中需要定义打电话和发短信的抽象方法,虽然抽象类不必关心具体实现,但是保证了所有手机(子类)都必须实现打电话和发短信的功能。

4.抽象类的使用实例

定义抽象Person类

添加属性和方法

public abstract class Person{
    String name;
    String sex;
    //Person类吃饭的抽象方法
    public abstract void eat();
    //Person类睡觉的抽象方法
    public abstract void sleep();
}

定义抽象Student类

继承 Person抽象类

public abstract class Student extends Person{
	//这里只实现了Person类的eat(),因为抽象子类对抽象父类得抽象方法实现是没有要求的
    @Override
    public void eat() {
        System.out.println("学生吃饭了");
    }
    //Student类学习的抽象方法
    public abstract void study();
}

【注意】

抽象子类是否实现抽象父类的抽象方法随意
注意这个抽象类只实现了吃饭的抽象方法。如果其它类继承Student类,必须实现Student类没有实现的父类抽象方法以及Student类的抽象方法

定义两个Student的子类(GoodStudent和BadStudent类)

继承 Student抽象类

public class GoodStudent extends Student {
 
    static{
        System.out.println("我是好学生");
    }
    
    //实现Person类的sleep方法
    @Override
    public void sleep() {
        System.out.println("好学生睡觉了");
    }
    
    //实现Student类的study方法
    @Override
    public void study() {
        System.out.println("好学生在学习");
    }
    
}
public class BadStudent extends Student {

    static{
        System.out.println("我是坏学生");
    }
    
    //重写Student类eat方法
    @Override
    public void eat(){
        System.out.println("我最能吃");
    }
    
    //实现Person类的sleep方法
    @Override
    public void sleep() {
        System.out.println("坏学生没睡觉");
    }
    
    //实现Student类的study方法
    @Override
    public void study() {
        System.out.println("坏学生没学习");
    }
    
}

GoodStudent和BadStudent类要实现所有没实现过的抽象方法已经实现过的也可以根据需要重写抽象方法

编写测试类,查看程序执行结果

public class Test{
    public static void main(String[] args) {
        //创建好学生对象
        GoodStudent goodStudent = new GoodStudent();
        goodStudent.eat();
        goodStudent.study();
        goodStudent.sleep();
        System.out.println("==============");
        //创建坏学生对象
        BadStudent badStudent = new BadStudent();
        badStudent.eat();
        badStudent.study();
        badStudent.sleep();
    }
}

运行结果

java抽象基类 java抽象类使用_面向对象编程_02