在这里插入代码片
记录学习过程,仅供参考,有错或者叙述不当请指出。
Java-抽象
关键字:abstract
修饰对象:类、方法
抽象(abstract)是java继承中的一个概念,一个类如果被abstract修饰,那么这个类成为一个抽象类,不能生成对象,即不能单独实例化。
如果一个类不能被实例化那写着这个类的意义在哪里呢?这就是为什么说抽象是继承中的一个概念了——抽象类就是用来被继承的。
规则
-
抽象类不能被实例化
public abstract class Animal{ } public class Main(String[] args){ public static void main(String[] args) { Animal a=new Animal();//错误,抽象类不能实例化。 } }
-
抽象方法只能有方法名和参数列表,不能包含方法体。
//错误 public abstract void eat(){};//错误,抽象方法不能有方法体,即不能带有花括号。 //正确 public abstract void eat();
-
抽象类中可以有构造方法、非抽象方法、抽象方法,也可以什么都没有
//正确 public abstract class Animal { public abstract void eat(); public Animal(){ System.out.println("构造方法"); } public void method(){ System.out.println("普通方法"); } } //正确 public abstract class Animal { }
-
含有抽象方法的类必须是抽象类
//错误,包含抽象方法的类必须是抽象类 public class Animal { public abstract void eat(); } //正确 public abstract class Animal { public abstract void eat(); }
-
如果一个非抽象类继承了一个抽象类,那么这个类必须重写父类中所有的抽象方法,抽象类则不必。
如下所示,继承关系为:Animal被Dog继承,Dog被SmallDog继承。Animal和Dog都是抽象类,所以即使Dog继承自Animal,也不必要重写Animal的抽象方法,并且由于继承关系,Dog类将拥有eat()方法,即Dog类中的抽象方法有:eat()和sleep();而SmallDog是非抽象类,它必须重写父类中的所有抽象方法,它的父类是Dog,所以必须重写Dog中的抽象方法eat()和sleep()。
public abstract class Animal { public abstract void eat(); } public abstract class Dog extends Animal{ public abstract void sleep(); //由于继承,Dog将拥有eat()方法 } public class SmallDog extends Dog { @Override public void sleep() { } @Override public void eat() { } }
记录学习过程,仅供参考,有错或者叙述不当请指出。