讲解人:郭馨惠 日期:8月22日
邮箱:guoxinhuigxh@outlook.com
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
1.抽象类不能被实例化。
2.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
3.抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
4.含有抽象方法的类必须申明为抽象类
5.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。
抽象类简介
在Java语言中,可以通过把类或者类的某些方法声明为abstract(abstract只能用来修饰类或者方法,不能用来修饰属性)来表示一个类是抽象类。抽象类不能被实例化。
抽象类基本定义:
抽象类需要使用abstract class 进行定义,并且在一个抽象类中也可以用abstract关键字定义若干个抽象方法,这样抽象类的子类就必须在继承抽象类时强制覆写全部抽象方法。
例:
abstract class Message { //定义抽象类
private String type; //消息类型
public abstract String getConnectInfo( ); //抽象方法
public void setType(String type) { //普通方法
this.type = type;
}
Public String getType( ) { //普通方法
Return this.type;
}
}
抽象类与普通类主要两点不同:
1、在类的修饰符后面多了一个abstract关键字
2、抽象类是不允许通过new来实例化的
由于抽象类不能通过new来实例化,所以基本上是在继承中当做父类使用。
什么是抽象方法
抽象方法的定义需要加上abstract关键字,不能有方法体,以封号结尾,比如:
public abstract void getOtherSalary();
抽象方法的具体实现,需要在子类中实现。注意:static、final的方法,不能被申明为抽象方法。
抽象类与抽象方法
抽象类不一定包含抽象方法,但如果一个类包含了抽象方法,那这个类一定是抽象类,否则编译不通过。
什么时候用抽象方法
抽象方法通常用于父类中。父类通常都是用于定义一些公共方法、公共属性等,但是实际项目可能会出现某些方法定义在父类中,父类却无法给出具体的实现,此时就是抽象方法出场的时候了。比如下文实例中,职员在公司中的收入都包含基本工资以及绩效奖金,基本工资大家都一样,但是绩效奖金就因岗位而异了,所以绩效奖金在职员类中只是个方法体,没有具体实现。
抽象方法与设计模式
抽象方法在设计模式中有比较多的体现,特别是用于 模板方法设计模式。
.抽象方法的使用
需求描述:公司里的职员分为普通程序员和技术总监,所有职员的基本薪水都是10000元每个月,程序员的绩效奖金每个月3000元,技术总监的绩效奖金每个月20000元。
了解了需求后,我们先定义一个职员类Employee,如下:
/** * 定义职工类,每个职工的薪水都由基本薪资跟绩效奖金组成 */
public abstract class Employee {
/** * 岗位名称 */
private String jobName;
/** * 所有职工的每月基本薪资都一样
* @return */
public int getBaseSalary(){
return 10000;
} /**
* 所有职工都有绩效奖金,但是普通程序员跟技术总监的不一样,
* 所以这里无法给出具体实现,需要在子类中实现
* @return */
public abstract int getOtherSalary();
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
}
定义程序员类Coder,继承职员类,实现getOtherSalary() 方法,如下:
/** * 程序员类,继承Employee类 */
public class Coder extends Employee{
/** * 由于继承了Employee类,所以必须实现Employee类中的抽象方法getOtherSalary()
* @return */
@Override
public int getOtherSalary() {
return 3000;
}
}
定义程序员类Coder,继承职员类,实现getOtherSalary() 方法,如下:
/** * 技术总监类,继承Employee类 */
public class Cto extends Employee{
/** * 由于继承了Employee类,所以必须实现Employee类中的抽象方法getOtherSalary()
* @return */
@Override public int getOtherSalary() {
return 20000;
}
}
最后打印程序员与技术总监每个月的薪水:
public class AbstractMain {
public static void main(String[] args){
Coder coder = new Coder();
coder.setJobName("程序员");
System.out.println(coder.getJobName() + "每个月薪资为:"); System.out.println("基本薪资:" + coder.getBaseSalary() + "元"); System.out.println("绩效奖金:" + coder.getOtherSalary() + "元"); Cto cto = new Cto(); cto.setJobName("技术总监"); System.out.println(cto.getJobName() + "每个月薪资为:"); System.out.println("基本薪资:" + cto.getBaseSalary() + "元"); System.out.println("绩效奖金:" + cto.getOtherSalary() + "元"); }
}
执行以上程序后,输出:
程序员每个月薪资为:
基本薪资:10000元
绩效奖金:3000元
技术总监每个月薪资为:
基本薪资:10000元
绩效奖金:20000元
END