抽象方法以及抽象类

抽象类:
eg:
学生类: 成员方法:职位描述
比如说学生类中,有一个职位描述的成员方法,可是学生中有很多的职位
这里只提到职位的描述,但并没说什么职位,班长,组长,职位的描述都是不一样的。
在这里,职位描述这个成员方法我们就称为是抽象方法。

抽象方法定义格式: public abstract void describe();
这里我们并不写执行体,因为每个职位的描述不一样。

抽象类:抽象方法所在的类。
定义格式:
-------------public abstract class 类名称

抽象类和抽象方法的注意事项:
1.不可以直接用抽象类创建对象
需要用不是抽象类的子类来创建对象。
抽象方法内部没有执行体,创建对象没有任何意义

2.构想类中一样可以有构造方法

3.抽象类中不一定有抽象方法,但抽象方法所在的类一定是抽象类
未包含抽象方法的抽象类,目的就是不想让别人创建该对象。

4.若抽象类的子类不是抽象类,则必须覆盖重写父类所有的抽象方法。
父类:人
抽象方法有:1.职位描述(学生,程序员,老师,医生…)
------------------2.睡觉姿势(趴着,躺着,侧着…)
直接子类(也是抽象类): 学生
-------------------需要重写的方法(从父类继承而来):
---------------------------职位描述 内容:我是学生
-------------------继承的抽象方法:睡觉姿势
下一级子类(非抽象类):
--------------------趴着睡觉的学生(小A)
----------------------------覆盖重写:睡觉姿势 内容:趴着
--------------------躺着睡觉的学生(小B)
----------------------------覆盖重写:睡觉姿势 内容:躺着

可以观察到,到最后一级,最开始的父类中所有的抽象方法我们都已经覆盖重写过了,所以最后一级就不是抽象类了
因为无论是他内部还是他继承的所有方法都不是抽象方法了。

Person类:

public abstract class Person {
    public Person() {
        System.out.println("人类构造方法执行");
    }

    public abstract  void describe();
    public abstract  void sleep();
}

Student类:

package cn.dali.code17;

public abstract class Student extends Person{

    public Student() {
        System.out.println("学生类构造方法执行");
    }

    @Override
    public void describe() {
        System.out.println("我是一个学生!");
    }


}

小A类:

package cn.dali.code17;

public class Xa extends Student{
    public Xa() {
        System.out.println("小A构造方法执行");
    }

    @Override
    public void sleep() {
        System.out.println("我是小A,我喜欢躺着睡觉!");
    }
}

小B类:

package cn.dali.code17;

public class Xb extends Student{
    public Xb(){
        System.out.println("小B构造方法执行");
    }
    @Override
    public void sleep() {
        System.out.println("我是小B,我喜欢趴着睡觉");
    }
}

主程序:

package cn.dali.code17;

public class demo01 {
    public static void main(String[] args) {
        Xa a = new Xa();
        a.sleep();
        a.describe();
    }
}

猜你喜欢

转载自blog.csdn.net/chen404897439/article/details/91365340