为什么需要抽像Abstract
- 当多个类出现相同的功能,而只是功能的主体不同时,可以向上抽象。
- 所谓抽象就是,只抽取功能的定义,而不抽取功能的主体
- 抽象Abstract,简单理解就是:看不懂。
抽样类的特点:
- 抽象方法一定定义在抽象类中,但抽象类中的方法不必全是抽象的,也可以有非抽象的方法。
- 只要类中有一个方法是抽象的,这个类就是抽象的。
- 抽象方法和抽象类必须用abstract关键字修饰。
- 抽象类不可以new一个对象,因为抽象类中的方法没有方法体,new一个对象无实际意义。
- 抽象类中定义的方法要被使用,就要由子类去继承这个抽象类,并且子类要重写抽象类中的所有抽象方法。
- 如果子类只是重写了父类的部分抽象方法,那么这个子类仍然时抽象的。
为什么需要抽象的示例:
class Cat { void yell() { System.out.println("Cat: meow meow meow..."); } } class Dog { void yell() { System.out.println("Dog: woof woof woof..."); } }
上面两个类,小猫和小狗都有发出叫声的功能,为了能够抽象出阿猫阿狗的叫声,我们写了另一个Pet类
class Pet { void yell() { System.out.println("pet yell..."); } }
但这个类里面的方法还不够抽象,因为它的yell()方法时具体的。这时我把它的方法体去掉。
class Pet { void yell() { } }
一个方法后面可以跟大括号,里面什么也不写,方法也可以以分号结尾。进一步抽象这个方法,去掉大括号,加上分号。
class Pet { //当一个方法没有大括号包围起来的方法提示,我们就应该在方法的前面加上abstract这个关键字,来申明这个方法时一个抽象方法。
//实际,idea等ide这时会报错提示我们,要么给出方法体,要么什么它是abstract的。 void yell(); }
根据idea提示,给yell()的方法加上abstract关键字时,idea会自动给Pet类也加上abstract关键字。
这就是我们前面提到的:抽象方法存在与抽象类中;如果一个类中有抽象方法,这个类也必须是抽象的。
abstract class Pet { abstract void yell(); }
抽象类不可以new一个对象。下面我们试图在Demo类中new一个Pet类的对象,因为Pet是一个抽象类,intelliJ idea就会报错提示我们不可以这样做。
public class Demo { Pet p=new Pet(); }
完整的例子:
import org.junit.Test; public class Demo { @Test public void test() { Cat c = new Cat(); Dog d = new Dog(); c.yell();//子类调用子类自己已经实现的yell()方法 d.yell(); } } abstract class Pet { public abstract void yell(); } class Dog extends Pet { public void yell() { System.out.println("Dog: woof woof woof..."); } } class Cat extends Pet { public void yell() { System.out.println("Cat: meow meow meow..."); } }
运行结果
Cat: meow meow meow...
Dog: woof woof woof...
后记:
2020年3月1日 星期日 上海 阴有间断小雨 气温:10° 比较冷