java入门(二十四) | OOP(十一)之抽象类

java入门(二十四) | OOP(十一)之抽象类

抽象类

1.1 概念

Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。
该没有方法体的方法我们称之为抽象方法。
含有抽象方法的类我们称之为抽象类。
抽象类可以理解为是一个只有方法声明没有方法体的特殊类。

abstract 修饰符 返回值 方法名(参数列表);

抽象的 class Animal{
    抽象的 public void eat();//父类方法体提供了显得多余,那就不提供方法体,没有方法体的方法  -- 抽象方法
}
 
class Cat extends Animal{
    @Override
    public void eat(){
       syso("猫吃鱼");
    }
}
class Dog extends Animal {
}

1.2 特点

  1. 通过java关键字abstract实现
  2. 可以修饰方法或者类
  3. 抽象类中可以没有抽象方法(由子类去实现)
  4. 如果类中有抽象方法,那该类必须定义为一个抽象类
  5. 子类继承了抽象类以后,要么还是一个抽象类,要么就把所有抽象方法都重写
  6. 多用于多态中
  7. 抽象类不可以被实例化

1.3 入门案例

package cn.qile.abstractdemo;

//测试抽象类入门案例
public class Test1_Abstract {
    public static void main(String[] args) {
        //5、抽象类不能被实例化new
//     Student s = new Student();
//     s.eat();s.sleep();

        //TODO 创建多态对象测试
        Person p = new Teacher();//父类的引用指向子类的对象
        //编译看左边,运行看右边
        p.eat();
        p.game();
        p.sleep();
    }
}
//创建抽象类
//3、如果一个 类中 包含抽象方法  -- 这个类必须是一个抽象类,用abstract修饰
abstract class Person{
    //1、父类中的方法体没必要提供时,这个方法就是没有方法体的方法  叫  抽象方法
    //2、用关键字abstract修饰抽象的
    abstract public void eat();
    abstract public void game();

    public void sleep() {
        System.out.println("睡觉");
    }
}
//创建子类
//4、子类如果继承了抽象类,子类如果只不重写,或者只重写一部分,那子类仍然是抽象类
abstract class Student extends Person{
    //TODO 重写eat()
    public void eat() {
        System.out.println("吃菜");
    }
}
//4.1、子类如果继承了抽象类,要把所有抽象方法都重写  变成 普通子类
class Teacher extends Person{
    public void eat() {
        System.out.println("不吃");
    }
    public void game() {
        System.out.println("不玩");
    }
}

抽象类的用法

2.1 构造函数

常用于子类的实例化

package cn.qile.abstractdemo;

//抽象类的用法
public class Test2_UseAbstract {
    public static void main(String[] args) {
        //TODO 创建多态对象测试
        Animal a = new Dog();
        
    }
}
//创建父类
abstract class Animal{
    //抽象类提供构造方法:不是为了创建抽象类的对象(也不能创建),而是为了创建子类对象
    public Animal() {
        System.out.println("构造方法");
    }

}
//创建子类
class Dog extends Animal{
    public Dog() {
        super();//默认就有
    }

}

2.2 成员变量

既可以有变量,也可以有常量。

package cn.qile.abstractdemo;

//抽象类的用法

public class Test2_UseAbstract {
    public static void main(String[] args) {
        //TODO 创建多态对象测试
        Animal a = new Dog();
    }
}
//创建父类
abstract class Animal{
    //提供构造方法:不是为了创建抽象类的对象,而是为了创建子类对象
    public Animal() {
        System.out.println("构造方法");
    }

    int sum ;//抽象类中可以写变量
    final int count = 10;//抽象类中可以写常量
    
}
//创建子类
class Dog extends Animal{
    public Dog() {
        super();//默认就有
    }

}

2.3 成员方法

抽象类里,既可以有普通方法,有可以有抽象方法。

package cn.qile.abstractdemo;

//抽象类的用法
public class Test3_UseAbstract {
    public static void main(String[] args) {
        //创建多态对象测试
        Animal a = new Dog();
        System.out.println(a.count);
        System.out.println(a.sum);
        a.sleep();
        a.eat();
        a.jiao();
    }
}
//创建父类
//1、抽象类中可以有 抽象方法 也可以有 普通方法
abstract class Animal{
    //提供构造方法:不是为了创建抽象类的对象,而是为了创建子类对象
    public Animal() {
        System.out.println("构造方法");
    }

    int sum ;//抽象类中可以写变量
    final int count = 10;//抽象类中可以写常量


    public abstract void eat();
    public abstract void jiao();

    public void sleep() {
        System.out.println(sum);//0
        System.out.println("正在睡觉");
    }
}
//创建子类
class Dog extends Animal{
    public Dog() {
        super();//默认就有
    }
    //2、抽象类中如果有抽象方法,子类继承后,必须全都重写,否则子类就是抽象类
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
    @Override
    public void jiao() {
        System.out.println("汪汪汪");
    }

}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » java入门(二十四) | OOP(十一)之抽象类