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