抽象类和抽象方法
概念
抽象方法
当父类中的方法,在不同子类中有不同的具体实现,那么就可以只声明该方法,而不书写方法体,这样的方法可以称之为抽象方法。
格式
权限修饰符(通常为public) abstract 返回值类型 方法名(参数列表);
抽象类
通常来说,当一个类中存在了抽象方法,那么该类必须声明为抽象类。当然了,抽象类也可以不存在抽象方法。
格式
权限修饰符 abstract class 类名{
//与正常的类无异,但可以存在抽象方法
}
要点
- 抽象类存在构造器,但不可以实例化对象。
- 抽象类的子类要么必须重写所有的抽象方法,要么子类也是抽象类。
- 抽象类不一定含有抽象方法,但存在抽象方法的一定是抽象类。
范例
父类(抽象类)
package com.blogs.abstracttest;
//抽象类
public abstract class Animal {
private String name;
private int age;
//构造器,虽然不能实例化对象,但是可以给子类构造方法中直接调用
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//抽象方法
public abstract void eat();
}
子类1
package com.blogs.abstracttest;
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
//这里调用父类(抽象类)的构造器
super(name, age);
}
//重写抽象方法
@Override
public void eat() {
System.out.println("小猫喜欢吃小鱼干!");
}
}
子类2
package com.blogs.abstracttest;
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
//调用父类的构造器
super(name, age);
}
//重写抽象方法
@Override
public void eat() {
System.out.println("狗狗喜欢啃骨头!");
}
}
测试类
package com.blogs.abstracttest;
public class AbstractTest {
public static void main(String[] args) {
Cat cat = new Cat("芒果", 2);
Dog dog = new Dog("旺财", 1);
System.out.print(cat.getName() + "今年" + cat.getAge() + "岁,");
cat.eat();
System.out.print(dog.getName() + "今年" + dog.getAge() + "岁,");
dog.eat();
}
}