1、抽象类
1.1 案例:
//父类
public class Person {
private String name;
private int age;
public void eat() {
System.out.println(this.age+"的"+this.name+"在吃饭");
}
}
public class Student extends Person{
//重写父类的方法
public void eat() {
System.out.println("成绩为" + this.score + "分的" + this.getName() + "学生" + "正在吃学生餐");
}
}
public class Teacher extends Person{
//重写父类的方法
public void eat() {
System.out.println("工资为" + this.salary + "元的" + this.getName() + "老师" + "正在吃工作餐");
}
}
在上面的案例中,两个子类都重写了父类的eat方法。那么父类定义的方法是否还有意义?
①父类的方法的申明是不能去掉。
②父类的方法实现没有意义。
这时我们希望,父类只提供方法的申明,不提供方法的实现(不写方法体)。
这时就用到了抽象方法:
所有的抽象方法都是使用abstract修饰。
所有的抽象方法都没有方法体。
抽象方法只能写在抽象类或者接口中。
1.2抽象类和抽象方法
抽象?不存在具体的内容(xxx)。
所谓抽象类,就是不存在具体的类的对象。
所有抽象方法就是不存在具体的方法体。
案例:
package com.igeek.demo1;
/**
* @company 武汉极客营
*
* @author www.igeekhome.com
*
* 2019年8月26日上午9:42:27
*/
public abstract class Animal {
public abstract void eat();
}
抽象类不能被实例化。。为什么呢?
因为抽象类中可能存在抽象方法,而抽象方法是没有方法体的,不能执行,所以不能直接创建抽象类对象。
1.3抽象类中可以写什么?
①抽象类中可以写抽象方法。
②抽象类中可以写非抽象方法。
public abstract class Animal {
public abstract void eat();
public void bark() {
System.out.println("动物在吼叫!!!");
}
}
③抽象类中可以定义属性。
public abstract class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
④抽象类同样有构造方法。抽象类构造方法和非抽象类的构造方法是一样的。
⑤抽象类也可以定义静态方法。
public abstract class Animal {
public static void showClassName() {
System.out.println(Animal.class.getName());
}
}
抽象类和非抽象的区别:
抽象类不能实例化对象,抽象类中可以定义抽象方法。
1.4 抽象类是用来干啥的?
抽象类不能实例化对象,那么定义的非静态方法又有啥用呢?
抽象类可以继承其他类,同样可以被其他类继承。
抽象类就是用来让其他类继承的。
public abstract class Instruments {
/**
* 发出声音
* @param o
*/
public abstract void vocalization(String o);
public void showMe() {
System.out.println("我是一个乐器!");
}
}
public class Piano extends Instruments{
public void vocalization(String o) {
System.out.println("钢琴演奏出:"+o);
}
}
当一个类继承了一个抽象类,则该类必须实现(重写ÿ