抽象类:
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();
}
}