【Java】抽象类

目录

概述:

示例代码:

抽象类特点

 示例代码:


概述:

在Java中,一个没有 方法体 的方法应该定义为 抽象方法,而类中如果有 抽象方法,该类必须定义为抽象类。

抽象类和抽象方法用 abstract 关键字来修饰

  • 抽象类:abstract class 类名{}
  • 抽象方法:public abstract void eat();// 抽象方法中没有方法体 

 【Java】抽象类_第1张图片

示例代码:

AnimalParent.java

package com.面向对象.Demo24;

//public class AnimalParent {
public abstract class AnimalParent {
    /**
     * eat()方法没有方法体 具体 都是交给子类 重写的
     * 如果在方法上加上 abstract 进行修饰 为抽象方法
     * 如果在一个类中存在一个抽象方法 则该类必须是抽象方法
     */
//    public void eat(){
//        System.out.println("我在吃");
//    }
    public abstract void eat();
}

Cat.java

package com.面向对象.Demo24;

public class Cat extends AnimalParent {
    // 在我们抽象类中  的抽象方法 子类必须是要重写的
    @Override
    public void eat() {
        System.out.println("Cat-eat()-鱼");
    }
}

Dog.java

package com.面向对象.Demo24;

public class Dog extends AnimalParent{
    // 在我们抽象类中  的抽象方法 子类必须是要重写的
    @Override
    public void eat() {
        System.out.println("Dog-eat()-骨头");
    }
}

Test01.java

package com.面向对象.Demo24;

public class Test01 {
    public static void main(String[] args) {
//        AnimalParent animalParent = new AnimalParent(); //报错,'AnimalParent' is abstract; cannot be instantiated
        // 动物类是一个抽象的概念 没有具体的事物

        AnimalParent dog = new Dog();
        AnimalParent cat = new Cat();
        dog.eat(); //Dog-eat()-骨头
        cat.eat(); //Cat-eat()-鱼
    }
}

抽象类特点

  1. 抽象类中不一定有抽象方法,但是有抽象方法的类必须为抽象类;
  2. 抽象类不能实例化;
  3. 抽象类由具体的子类进行实例化;
  4. 子类必须对父类(抽象类)中的所有抽象方法进行重写;
  5. 在抽象类中可以定义非抽象方法;
  6. 子类如果不重写抽象类中的抽象方法,则该类还是为抽象类;
  7. 抽象类中可以有构造方法,用于子类访问父类时的数据初始化。

 示例代码:

AnimalParent.java

package com.面向对象.Demo25;

public abstract class AnimalParent {
    /**
     * 在抽象类中 是可以定义 成员属性
     */
    private int age;
    private final int code = 200;

    /**
     * 1.在方法上加上 abstract 进行修饰,则该方法是为抽象方法
     * (如果在该类中存在一个抽象方法,则该类必须是为抽象类)
     * 2.在一个抽象类中是可以存在多个抽象方法的
     * 3.在抽象类 可以定义 非抽象方法
     * 4.子类是必须重写父类中 所有 的抽象方法 (非抽象方法 子类没有必须 强制 重写的)
     * 5.如果子类 没有重写 父类中的抽象方法,则该类 也需要是为 "抽象类" 继承父类中的抽象方法
     * 6.抽象类——不能够实例化的 没有明确具体的事物 所以 抽象类必须 通过子类 实例化
     * 7.在抽象类中,不一定有抽象方法的(但是这样做不合理)
     * 8.抽象类中可以有构造方法,用于子类访问父类时的数据初始化。
     */
    public abstract void eat();

    public abstract void play();

    public AnimalParent() {
        System.out.println("AnimalParent-无参构造方法...");
    }
    // 抽象类 是可以定义 有参构造方法,子类访问父类初始化时 可以给父类的成员属性进行赋值
    public AnimalParent(int age) {
        this.age = age;
        System.out.println("AnimalParent-有参构造方法...");
    }

    /**
     * 非抽象方法(子类不需要强制重写的)
     */
    public void show() {
        System.out.println("非抽象方法-show()");
        System.out.println("age:"+age);
        System.out.println("code:"+code);
    }
}

Dog.java

package com.面向对象.Demo25;

public class Dog extends AnimalParent {
    /**
     * 默认每个类中都有一个无参构造方法 默认是可以不用写的
     */
    public Dog(int age) {
        super(age); //如果这里调用父类的有参构造方法,程序会默认在这里加上 super(),帮我们调用无参构造
        // 思考 在Dog类中 的有参构造方法中,会调用父类中的 有参构造方法吗?
        System.out.println("Dog-有参构造方法...");
    }

    @Override
    public void eat() {
        System.out.println("Dog-eat-骨头");
    }

    @Override
    public void play() {
    }
}

Cat.java

package com.面向对象.Demo25;

// 如果子类 没有重写 父类中的抽象方法,则该类 也需要是为 "抽象类" 继承父类中的抽象方法
public abstract class Cat extends AnimalParent{
}

Test01.java

package com.面向对象.Demo25;

public class Test01 {
    public static void main(String[] args) {
//        new AnimalParent();//报错,'AnimalParent' is abstract; cannot be instantiated
        // 抽象类 没有明确具体的事物 所以 抽象类必须 通过子类 实例化

        AnimalParent dog = new Dog(20);
        dog.show();
//        AnimalParent cat = new Cat();//报错,∵ Cat类是 abstract
    }
}

下一篇文章:抽象类案例

你可能感兴趣的:(java,开发语言,抽象类,抽象类特点)