}
}
class Cat extends Pet { // 继承父类
// 重写父类方法 eat
@Override
public void eat() {
System.out.println(“猫猫吃猫粮”);
}
}
小猫类、小狗类这些子类都重写了宠物类中的 eat 方法,我们知道每种宠物都有吃的行为,宠物表示了一个抽象的概念。那么宠物类的实例化和方法调用就没有了实际意义:
Pet pet = new Pet();
pet.eat();
我们知道了抽象类不能被实例化,此时可以将父类设定为抽象类,使用 abstract 关键字来声明抽象类,abstract 关键字必须放在 class 关键字前面 :
// 声明抽象类
abstract class Pet {
…
}
如果你尝试实例化抽象类 Pet,编译器将会报错:
Pet.java:4: 错误: Pet是抽象的; 无法实例化
new Pet();
^
1 个错误
使用抽象类,我们既可以通过父类和子类的继承关系,来限制子类的设计随意性,也可以避免父类的无意义实例化。
如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
上面我们将 Pet 父类改为了抽象类,其中包含了 eat 方法的具体实现,而实际上这个方法是不需要具体实现的,每种宠物都有各自的具体实现。此时,就可以将 eat 方法改为抽象方法:
abstract class Pet {
abstract void eat();
}
我们可以看到抽象方法使用 abstract 关键字声明,它没有方法体,而直接使用 ; 结尾。
子类必须实现父类中的抽象方法,假如 Dog 类继承了抽象类 Pet,但没有实现其抽象方法 eat:
class Dog extends Pet {
}
编译执行代码,将会报错:
Dog.java:1: 错误: Dog不是抽象的, 并且未覆盖Pet中的抽象方法eat()
public class Dog extends Pet {
^
1 个错误
上述报错中可知,如果我们不想在 Dog 中重写抽象方法 eat(),那么可以将 Dog 也改为抽象类:
abstract class Dog extends Pet {
}
抽象方法不能是 final、static 和 native 的;并且抽象方法不能是私有的,即不能用 private 修饰。因为抽象方法一定要被子类重写,私有方法、最终方法以及静态方法都不可以被重写,因此抽象方法不能使用 private、final 以及 static 关键字修饰。而 native 是本地方法,它与抽象方法不同的是,它把具体的实现移交给了本地系统的函数库,没有把实现交给子类,因此和 abstract 方法本身就是冲突的。
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

最新整理电子书

专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
[外链图片转存中…(img-lyJ6toBX-1714696836686)]
最新整理电子书
[外链图片转存中…(img-p68ysAcb-1714696836686)]

984

被折叠的 条评论
为什么被折叠?



