首页 > 代码库 > 抽象类
抽象类
抽象类
抽象类概述:抽象就是看不懂的
1.抽象类特点
1) 抽象类和抽象方法必须用abstract关键字修饰
abstract class 类名 {} 抽象类
public abstract void eat();抽象方法
注意:抽象方法//直接;,不加大括号./当不知道该方法具体是怎么实现的//比如动物吃,你知道它吃什么吗?怎么吃?都不知道,就定义成抽象的.
2) 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
3) 抽象类不能实例化
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
抽象类可以声明:抽象类名 类名
多态(继承,重写,父类引用指向子类对象)(编译看左边运行看右边)
4) 抽象类的子类
a.要么是抽象类(可以不用重写抽象方法)
abstract class Cat extends Animal { } 相当于把抽此案够方法继承下来了(不能实例化)
b.要么子类重写抽象类中的所有抽象方法(一般用这种)
2.抽象类的成员特点
1) 成员变量
既可以是变量,也可以是常量。abstract是不能修饰成员变量(值都是具体的)
2) 构造方法
有构造方法,用于子类访问父类数据的初始化。
3) 成员方法
既可以是抽象的,也可以是非抽象的。
3.抽象类的成员方法特性:
a:抽象方法 强制要求子类做的事情。
b:非抽象方法 子类继承的事情,提高代码复用性。
4.为什么非要继承抽象类?
要遵守里面的规则,统一了标准,有了规则就能每个看法自己的了,没有规则则前台开发后台就得写着
定义抽象类,抽象方法,就是给子类做了个声明,声明规则后就需要遵守.
5.abstract不能和哪些关键字共存
1) abstract和static
被abstract修饰的方法没有方法体
被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的
2) abstract和final
被abstract修饰的方法强制子类重写
被final修饰的不让子类重写,所以他俩是矛盾
3) 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
}
6.一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以
这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
举例说明:
例1:
class bj09_09 {
public static void main(String[] args) {
//Animal a = new Animal(); 不能实例化,不能用于创建但是可以声明
Animal a = new Cat();//父类引用指向子类对象
a.eat();//编译看左边,左边有eat保证编译通过,不调用它//运行走的是右边,执行
System.out.println("Hello World!");
}
}
abstract class Animal { //抽象类
public abstract void eat();//直接;,不加大括号
}
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
}
例2:
class bj09_14 {
public static void main(String[] args) {
Coder c = new Coder("德玛西亚","007",8000);
c.work();
Manager m = new Manager("苍老师","9527",2000,20000);
m.work();
System.out.println("Hello World!");
}
}
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) { //设置工号
this.id = id;
}
public String getId() { //获取工号
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){
//this.name = name; //父类中已经被私有化了,所以用super
super(name,id,salary);
} //有参
public void work() {
System.out.println("我的名字是:" + this.getName() + ",我的工号:" + this.getId() + ",我的工资是:" + this.getSalary() + ",我的工作内容是敲代码");
//name这里被父类私有化了,不能被继承,可以通过getName获得,this.name;
}
}
//项目经理
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 + ",我的工作内容是管理");
}
}
抽象类