Java(18)抽象类
抽象类
当父类的方法实现没有意义时,通常用abstract
将方法修饰为抽象方法,如Animal
父类的run()
方法,把该方法体写出来是没有意义的(动物的跑的方式不能确定)。因为抽象方法的存在,也要将类用abstract
修饰,这样的类称为抽象类。
-
含有抽象方法的类必须被声明为抽象类
public class Test01 { public abstract void run(); //报错:Abstract method in non-abstract class,表示抽象方法不在抽象类内 } public abstract class Test01 { public abstract void run(){};// 此处不能有花括号 //报错:Abstract methods cannot have a body,表示抽象方法不能有方法体 } //----------------正确的做法在下面----------------------------- public abstract class Test01 { public abstract void run(); }
-
抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,则要声明为抽象类。
package day01; public abstract class Test01{ public abstract void move(); public abstract void eat(); } class Dog extends Test01{ @Override public void move() { System.out.println("狗的移动方式是跑"); } @Override public void eat() { System.out.println("狗的吃东西的方式是舔"); } //如果不重写实现从父类继承来的方法会报错: // Class 'Dog' must either be declared abstract or implement abstract method 'move()' in 'Test01' //必须重写所有全部的抽象方法,如果不重写全部抽象方法,必须将当前类声明为抽象类,如下面的hicken类。 } abstract class Chicken extends Test01{ @Override public void eat() { System.out.println("小鸡吃东西的方式是啄"); } //可以看到抽象类可以继承抽象类,被声明为抽象类的子类不必重写全部父类抽象方法。 } class MainClass{ public static void main(String[] args) { Test01 a=new Test01() { @Override public void move() { System.out.println("true"); } @Override public void eat() { System.out.println("emmm"); } };//如果要实例化,必须按照此方法重写所有抽象方法 a.eat();//输出emmm } }
-
不能用
abstract
修饰属性、私有方法、构造器、静态方法、final
方法或final
类package day01; public abstract class Test01{ private int a; public abstract int a=10; //会报错:Modifier 'abstract' not allowed here private abstract void fun1(){ //报错:Illegal combination of modifiers: 'abstract' and 'private' } public abstract Test01(){ //报错:Modifier 'abstract' not allowed here } }