1,抽象类概述
-
抽象就是看不懂的
2,抽象类特点
,【1】抽象类和抽象方法必须用abstract关键字修饰
-
abstract class 类名 {}
-
public abstract void eat();
【2】抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
-
抽象类不能实例化那么,抽象类如何实例化呢? 不能new出来
-
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
【3】抽象类的子类
-
要么是抽象类
-
要么重写抽象类中的所有抽象方法
class Demo1_Abstract {
public static void main(String[] args) {
//Animal a = new Animal(); //错误: Animal是抽象的; 无法实例化
Animal a = new Cat(); //父类引用指向子类对象
a.eat();
}
}
abstract class Animal { //抽象类
public abstract void eat(); //抽象方法
public Animal() {
System.out.println("父类空参构造");
}
public void print(){
}
}
class Cat extends Animal {
public Cat() {
super();
}
public void eat() {
System.out.println("猫吃鱼");
}
}
【4】案例演示
3,抽象类的成员特点
【1】成员变量:既可以是变量,也可以是常量。abstract是否可以修饰成员变量?不能修饰成员变量
【2】构造方法:有,用于子类访问父类数据的初始化。
【3】成员方法:既可以是抽象的,也可以是非抽象的。
【4】抽象类的成员方法特性:
-
抽象方法 强制要求子类做的事情。
-
非抽象方法 子类继承的事情,提高代码复用性。
class Demo2_Abstract {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
abstract class Demo {
int num1 = 10;
final int num2 = 20;
public Demo(){}
public void print() {
System.out.println("111");
}
public abstract void method();
}
class Test extends Demo {
public Test(){
super();
}
public void method() {
System.out.println("111");
}
}
4,abstract 使用注意事项
【1】一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
-
可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
【2】abstract不能和哪些关键字共存
abstract和static
被abstract修饰的方法没有方法体
被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的
abstract和final
被abstract修饰的方法强制子类重写
被final修饰的不让子类重写,所以他俩是矛盾
abstract和private
被abstract修饰的是为了让子类看到并强制重写
被private修饰不让子类访问,所以他俩是矛盾的
abstract class Demo {
//public static abstract void print(); //错误: 非法的修饰符组合: abstract和static
//public final abstract void print(); //错误: 非法的修饰符组合: abstract和final
private abstract void print(); //错误: 非法的修饰符组合: abstract和private
}
5,抽象类,案例
【1】需求
-
假如我们在开发一个系统时需要对程序员类进行设计,程序员包含3个属性:姓名、工号以及工资。
-
经理,除了含有程序员的属性外,另为还有一个奖金属性。
-
请使用继承的思想设计出程序员类和经理类。要求类中提供必要的方法进行属性访问。
class Test3_Employee {
public static void main(String[] args) {
Coder c = new Coder("德玛西亚","007",8000);
c.work();
Manager m = new Manager("苍老师","9527",3000,20000);
m.work();
}
}
abstract class Employee {
private String name; //姓名
private String id; //工号
private double salary; //工资
public Employee() {} //空参构造
public Employee(String name,String id,double salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
public void setName(String name) { //设置姓名
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setId(String id) { //设置id
this.id = id;
}
public String getId() { //获取id
return id;
}
public void setSalary(double salary) { //设置工资
this.salary = salary;
}
public double getSalary() { //获取工资
return salary;
}
public abstract void work();
}
//程序员
class Coder extends Employee {
public Coder() {} //空参构造
public Coder(String name,String id,double salary) {
super(name,id,salary);
}
public void work() {
System.out.println("我的姓名是:" + this.getName() + ",我的工号是:" + this.getId() + ",我的工资是:"
+ this.getSalary() + ",我的工作内容是敲代码");
}
}
//项目经理
class Manager extends Employee {
private int bonus; //奖金
public Manager() {} //空参构造
public Manager(String name,String id,double salary,int bonus) {
super(name,id,salary);
this.bonus = bonus;
}
public void work() {
System.out.println("我的姓名是:" + this.getName() + ",我的工号是:" + this.getId() + ",我的工资是:"
+ this.getSalary() + ",我的奖金是:" + bonus + ",我的工作内容是管理");
}
}