目录
1.抽象方法以及抽象类
在了解这个之前,我们先来看一个实例
class Animal{
public void eat(){
}
}
class Cat extends Animal{
}
class Dog extends Animal{
}
在以上案例中,由于猫和狗所吃的东西是不同的,父类无法确认方法体,那么就可以将父类中的eat方法定义为抽象方法,子类对其进行强制重写,变成如下形式:
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃小鱼干");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
在这里,我们将父类中的eat方法定义为了抽象方法,父类变成了抽象类,子类则必须要重写父类中的抽象方法。
1.抽象方法
被abstract关键字修饰的方法叫做抽象方法。
权限修饰符 abstract 返回值类型 方法名(参数列表);
public abstract void eat();
在这里,子类如果继承与父类,则必须要重写父类中的eat方法。
2.抽象类
被abstract关键字所修饰的类叫做抽象类。
权限修饰符 abstract class 类名{}
abstract class Animal{}
1.抽象类的注意事项:
1.被抽象方法修饰的类必定是抽象类,抽象类中不一定有抽象方法。
abstract class Person{
//由于play为抽象方法,那么类必须用abstract进行修饰,否则编译器会报错
public abstract void paly();
}
abstract class Person1{
//虽然Person1被abstract修饰了,但是其内部不一定有抽象方法
public void eat(){
}
}
2.抽象类无法实例化,但可以有构造方法。
public class TestDemo1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Student student = new Student();
//在这里,编译器会显示Student类被abstract修饰,无法进行构造。
}
}
abstract class Student{
private int age;
private String name;
public Student() {
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public abstract void study();
}
3.抽象类所继承的子类要么是抽象类,要么重写所有的抽象方法。
abstract class Person{
abstract void eat();
}
abstract class Student extends Person{
//在这里,由于Student为抽象类,因此不必重写父类中的eat方法。
}
class Teacher extends Person{
//由于Teacher并不是抽象类,因此需要重写父类中的抽象方法。
@Override
void eat() {
System.out.println("吃米饭");
}
}
2.为什么抽象类中要有构造方法
虽然抽象类无法实例化,但是其子类,可以调用父类中的构造方法来进行实例化。因此,建议在抽象类中写上构造方法。
abstract class Person{
private int age;
private String name;
public Person() {
}
public Person