不能实例化抽象类_普通类和抽象类有哪些区别?

eeca2adc69d0538cf8081ccbf2029a69.gifIT环游记普通类和抽象类有哪些区别?

讲解人:郭馨惠    日期:8月22日

邮箱:guoxinhuigxh@outlook.com

bd4d67e006a3c90ec10baf73736afc50.png

6dd1731036be21bfa2cc18c7606cc848.gif

普通类不能包含抽象方法,抽象类可以包含抽象方法。

抽象类不能直接实例化,普通类可以直接实例化。

1.抽象类不能被实例化。

2.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。

3.抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体

4.含有抽象方法的类必须申明为抽象类

5.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。

f752cadcf48371693f12ee40038bcb03.gif

抽象类简介

在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;

   }

}

44cb0328b391aad89808ee9631ec3eb9.png

  抽象类与普通类主要两点不同:

1、在类的修饰符后面多了一个abstract关键字

2、抽象类是不允许通过new来实例化的

由于抽象类不能通过new来实例化,所以基本上是在继承中当做父类使用。

224206a7a5696f8d9bd28f923e52401e.png

什么是抽象方法

抽象方法的定义需要加上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元

e0745ce9f921a795f01a21d6e66a5fa0.gif eeca2adc69d0538cf8081ccbf2029a69.gifEND
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值