抽象类
概述
在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
也就是说,之前的多态中定义了动物类,动物类中有个动物吃东西的方法,但其实并不知道具体是什么动物,所以在动物类中应该只能声明一个所有动物都会有的特征方法。这就是抽象方法,而动物类则是抽象类。
那么如何定义一个没有方法体的抽象方法?
//动物类
public abstract class Animal{
public abstract void eat();
}
//定义为抽象类和抽象方法
那么抽象类就不能这样创建对象了:
Animal a=new Animal();
抽象类的特点
一个类里有抽象方法,那么这个类一定是抽象类,则类的前面一定要写abstract。
但是抽象类里面可以没有抽象方法,可以创建有方法体的方法,但这样意义不大。
抽象类如何创建对象?
这里则要用用多态的形式创建对象了
回忆一下多态需要满足的条件:
1.有继承/实现关系
2.有方法重写
3.有父类引用指向子类对象
//父类 抽象类
package myday;
public abstract class Animal {
public abstract void eat();
}
//子类
package myday;
public class Cat extends Animal{
//方法重写
public void eat() {
System.out.println("猫吃鱼");
}
}
//测试
package myday;
public class Demo {
public static void main(String[] args) {
Animal c=new Cat();//向上转型
c.eat();
//输出:猫吃鱼
}
}
另外,多态中子类一样可以继承父类中的方法,也就是说,就算子类没有重写父类的该方法,但子类可以运行。
//父类 抽象类
package myday;
public abstract class Animal {
public abstract void eat();
public void sleep(){
System.out.println("睡觉");
}
}
//子类
package myday;
public class Cat extends Animal{
//方法重写
public void eat() {
System.out.println("猫吃鱼");
}
}
//测试
package myday;
public class Demo {
public static void main(String[] args) {
Animal c=new Cat();//向上转型
c.eat();
c.sleep();//继承父类
//编译看左,运行看右
//输出:猫吃鱼
// 睡觉
}
}
注意
抽象类的子类要么必须重写抽象类中的抽象方法(但子类写的不是抽象方法,而是将该方法具体化了,上面有例子),要么该子类本身也是个抽象类。
抽象类中是可以有非抽象方法的。