抽象类
1.1 抽象类概述
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
public abstract class Animal {
// public void eat(){ System.out.println(“吃东西”); }
// public void eat(); 缺少方法体,或声明为 abstract抽象类
// 抽象类的方法必须在抽象类public abstract class Animal{…}
public abstract void eat(); }
public class AnimalDemo {
public static void main(String[] args) {
// 抽象类不是具体的类,不能创建对象
// Animal animal = new Animal();
// animal.eat();} }
1.2 抽象类的特点
1、抽象类和抽象方法必须使用abstract关键字修饰
public abstract class 类名{} // 抽象类
public abstract void eat(); // 抽象方法
2、抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
3、抽象类不能直接实例化。只能通过多态的方式,继承子类对象实例化,这叫抽象类多态
4、抽象类的子类,子类继承的父类是抽象类,要么将子类定义为抽象类,要么子类重写所有抽象方法
// abstract抽象类
public abstract class Animal {
// abstract抽象方法,不能有主体
public abstract void eat();
// 非抽象方法,子类继承父类的方法
public void sleep(){ System.out.println(“睡觉”); }; }
———————————————————————————————
public class Cat extends Animal{
@Override
// eat()方法在父类是抽象的,但是子类重写
// 多态执行成员方法:编译看左边,执行看右边都满足
public void eat() { System.out.println(“猫吃鱼”); } }
———————————————————————————————
// 因为子类Dog继承的父类是abstract类所以子类也必须是abstract类
public abstract class Dog extends Animal{ }
————————————————————————————————
public class AnimalDemo {
public static void main(String[] args) {
// 抽象类不是具体的类,不能创建对象
// Animal animal = new Animal();
// 抽象类可以通过多态的方式创建对象,多态必须有继承
// 父类引用指向子类对象
Animal animal = new Cat();
animal.eat();
animal.sleep(); } }
1.3 抽象类的成员特点
1、抽象类成员变量:可以是变量也可以是常量
2、构造方法:有构造方法,但是不能实例化,构造方法的作用是用于子类访问父类数据的初始化
3、成员方法:可以有抽象方法,限定子类必须完成某些动作,也可以有非抽象方法,提高代码复用性
public abstract class Animal {
private int age = 20;
private final String city = “河南”;
// 抽象类的构造方法不能实体化,但是可以提供给子类访问父类的初始化
public Animal(){}
public Animal(int age){ this.age = age; }
public void show(){
age = 40;
System.out.println(city);
// 报错:city = “上海”; 无法将值赋给 final 变量 ‘city’
System.out.println(age); }
//抽象方法
public abstract void eat(); }
———————————————————————
public class AnimalDemo {
public static void main(String[] args) {
// 抽象类不能直接实例化,继承子类对象实例化,这叫抽象类多态
Animal animal = new Cat();
animal.eat();
animal.show(); } }
———————————————————————
// ‘Cat’ 子类必须被声明为abstract类或实现父类’Animal’中abstract方法
public class Cat extends Animal{
@Override
public void eat() { System.out.println(“猫吃鱼”); } }
案例:猫和狗
需求:采用抽象类的思想实现猫和狗的案例
代码实现:
// Animal抽象父类
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(); }
// Cat子类
public class Cat extends Animal{
// 一键生成构造方法继承父类
public Cat() { }
public Cat(String name, int age) { super(name, age); }
@Override
public void eat() { System.out.println(“猫吃鱼”); } }
// Dog子类
public class Dog extends Animal{
public Dog() { }
public Dog(String name, int age) { super(name, age); }
@Override
public void eat() { System.out.println(“狗吃肉”); } }
// 执行测试类
public class AnimalDemo {
public static void main(String[] args) {
// 创建对象,按照多态的方式
Animal animal = new Cat();
animal.setName(“奥利”);
animal.setAge(1);
System.out.println(animal.getAge() + “,” + animal.getName());
animal.eat();
System.out.println(“————————————“);
animal = new Cat(“奥利”, 5);
System.out.println(animal.getAge() + “,” + animal.getName());
animal.eat(); } }