抽象
概述
抽象的事物 给出一个声明
特点
a.抽象类和抽象方法必须使用abstract关键字修饰
抽象类格式:class abstract 类名{}
抽象方法格式:public abstract 返回值类型 方法名(){}
b.抽象类中不一定有抽象方法 但有抽象方法的类一定是抽象类
c.抽象类中可以有构造方法 抽象类不能实例化
构造方法用于子类访问父类数据时的初始化
抽象类的实例化:按照多态形式 子类实例化(抽象类多态)
d.抽象类的子类
子类要么也是抽象类 要么子类重写抽象类中所有的抽象方法
成员特点
成员变量:可以是变量也可以是常量
构造方法:抽象类有构造方法 子类访问父类数据的初始化
成员方法:既可以是抽象的 也可以是非抽象的
抽象方法:子类必须重写
非抽象方法:子类继承父类(提高代码复用性)
抽象类练习
关键字连用问题
abstract class H{
}
猫狗案例
具体事物:猫,狗
共性:姓名,年龄,吃饭,玩耍
我们需要自己找到抽象类(动物类)
将吃饭方法抽象 子类必须重写
将玩耍方法非抽象 子类继承父类
public class MyTest {
public static void main(String[] args) {
Animla animla = new Dog("大黄", 3);
animla.eat();
animla.play();
Cat cat = new Cat("小花", 1);
cat.eat();
cat.play();
}
}
public abstract class Animla {
private String name;
private int age;
public abstract void eat();
public void play(){
System.out.println(name + " 爱玩");
}
public Animla(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 class Dog extends Animla{
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗爱吃骨头");
}
}
public class Cat extends Animla{
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫爱吃鱼");
}
}
员工案例
假如我们在开发一个系统时需要对员工(Employee)类进行设计
员工包含3个属性:姓名、工号以及工资(salary)
经理(Manager)也是员工,除了含有员工的属性外,另为还有一个奖金(bonus)属性。
请使用继承的思想设计出员工类和经理类。
员工类我们需要抽象
public class MyTest {
public static void main(String[] args) {
Employee employee = new Manager("jack", "20220222", 20000, 500);
employee.work();
Manager manager = (Manager) employee;
manager.print();
}
}
public abstract class Employee {
String name;
String id;
double salary;
public Employee(String name, String id, double salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
public abstract void work();
}
public class Manager extends Employee{
double bonus;
public Manager(String name, String id, double salary, double bonus) {
super(name, id, salary);
this.bonus = bonus;
}
@Override
public void work() {
System.out.println("正在工作中....");
}
public void print(){
System.out.println("奖金=" + bonus + " 姓名='" + name + " 工号='" + id + " 工资=" + salary);
}
}