抽象类
一、抽象类声明格式:abstract class xx
二、抽象类特点:1.被abstract修饰
2.抽象类中不一定有抽象方法,但有抽象方法一定是抽象类
4.抽象类子类
a:抽象类子类也应是一个抽象类(不重写抽象方法)
abstract class A{}
abstract class B extends A{}
b:子类不是抽象类,是具体的类(应该重写抽象方法)
三、抽象类的成员特点:
1.成员变量:
既可以是变量也可以是常量
2.构造方法:有
用来子类访问父类数据初始化
3.成员方法:
抽象方法:强制要求子类做的事情
普通成员方法:子类继承的事情,提高代码复用性
一、抽象类声明格式:abstract class xx
二、抽象类特点:1.被abstract修饰
2.抽象类中不一定有抽象方法,但有抽象方法一定是抽象类
abstract class A{
public void B(){}
public abstract void B(){} //编译报错,抽象方法不能有方法体
public abstract void B(); //正确写法
}//可以编译
class A{
public abstract void B();
}//编译报错,有抽象方法必是抽象类
3.抽象类的实例化
a:抽象类不能直接实例化
abstract class A{}
class abstractDemo{
public static void main(String[] args){
A a=new A();//出错
}
}
b:抽象类可以通过多态的方式实例化
abstract class A{}
class B extends A{}
class abstractDemo{
public static void main(String[] args){
A a=new B();//多态向上转型
}
}
4.抽象类子类
a:抽象类子类也应是一个抽象类(不重写抽象方法)
abstract class A{}
abstract class B extends A{}
b:子类不是抽象类,是具体的类(应该重写抽象方法)
abstract class A{
public abstract void a{}
}
class B extends A{
public void a{
syso("重写抽象方法");
}
}
三、抽象类的成员特点:
1.成员变量:
既可以是变量也可以是常量
abstract class A{
public int num=10;
public final int num2=20;
}
class B extends A{}
class abstractDemo{
public static void main(String[] args){
syso(num+" "+num2);//输出10 20
}
}
2.构造方法:有
用来子类访问父类数据初始化
3.成员方法:
抽象方法:强制要求子类做的事情
普通成员方法:子类继承的事情,提高代码复用性
abstract class Person{
public abstract void breath();//每人都要呼吸,即强制子类做事。
public void eat(){
syso("吃饭");
}//提高代码复用性
}
class Student extends Person{
public void breath(){
syso("需要呼吸")
}
}
class Teacher extends Person{
public void breath(){
syso("需要呼吸")
}
}
四、抽象类练习员工案例
/*
假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
分析:
普通员工类
成员变量:姓名、工号以及工资。
成员方法:工作
经理类:
成员变量:姓名、工号以及工资,奖金属性
成员方法:工作
实现:
员工类:
职员类:
经理类:
*/
//员工类
abstract class Employee{
//成员属性姓名,员工号,工资
private String name;
private int employeeid;
private double salary;
public Employee() {}
public Employee(String name,int employeeid,double salary) {
this.name=name;
this.employeeid=employeeid;
this.salary=salary;
}
//抽象方法工作
public abstract void work();
public void show() {
System.out.println("姓名:"+name+" 职员号 :"+employeeid+" 薪水:"+salary);
}
}
//职工类
class Worker extends Employee{
public Worker() {}
public Worker(String name,int employeeid,double salary) {
super(name,employeeid,salary);
}
public void work() {
System.out.println("职员做基层工作");
}
}
//经理类
class Manager extends Employee{
//特有属性奖金
private double bonus;
public Manager() {}
public Manager(String name,int employeeid,double salary,double bonus) {
super(name,employeeid,salary);
this.bonus=bonus;
}
public void work() {
System.out.println("经理做管理工作");
}
//特有方法
public void getBonus() {
System.out.println("奖金:"+bonus);
}
}
class Test{
public static void main(String[] args){
//普通员工,用多态
Employee worker=new Worker("Mike",3,4000);
worker.show();
worker.work();
System.out.println("---------------------");
//测试经理,自己调用,因为有特有方法
Manager manager=new Manager("Jike",1,8000,2000);
manager.show();
manager.getBonus();
manager.work();
}
}