百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Java 抽象类(java 抽象类中非抽象方法的特点)

cac55 2024-09-20 12:41 44 浏览 0 评论

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

抽象类

在Java语言中使用abstract class来定义抽象类。如下实例:

/* 文件名 : Employee.java */

public abstract class Employee

{

private String name;

private String address;

private int number;

public Employee(String name, String address, int number)

{

System.out.println("Constructing an Employee");

this.name = name;

this.address = address;

this.number = number;

}

public double computePay()

{

System.out.println("Inside Employee computePay");

return 0.0;

}

public void mailCheck()

{

System.out.println("Mailing a check to " + this.name

+ " " + this.address);

}

public String toString()

{

return name + " " + address + " " + number;

}

public String getName()

{

return name;

}

public String getAddress()

{

return address;

}

public void setAddress(String newAddress)

{

address = newAddress;

}

public int getNumber()

{

return number;

}

}

注意到该Employee类没有什么不同,尽管该类是抽象类,但是它仍然有3个成员变量,7个成员方法和1个构造方法。 现在如果你尝试如下的例子:

/* 文件名 : AbstractDemo.java */

public class AbstractDemo

{

public static void main(String [] args)

{

/* 以下是不允许的,会引发错误 */

Employee e = new Employee("George W.", "Houston, TX", 43);

System.out.println("\n Call mailCheck using Employee reference--");

e.mailCheck();

}

}

当你尝试编译AbstractDemo类时,会产生如下错误:

Employee.java:46: Employee is abstract; cannot be instantiated

Employee e = new Employee("George W.", "Houston, TX", 43);

^

1 error

继承抽象类

我们能通过一般的方法继承Employee类:

/* 文件名 : Salary.java */

public class Salary extends Employee

{

private double salary; //Annual salary

public Salary(String name, String address, int number, double

salary)

{

super(name, address, number);

setSalary(salary);

}

public void mailCheck()

{

System.out.println("Within mailCheck of Salary class ");

System.out.println("Mailing check to " + getName()

+ " with salary " + salary);

}

public double getSalary()

{

return salary;

}

public void setSalary(double newSalary)

{

if(newSalary >= 0.0)

{

salary = newSalary;

}

}

public double computePay()

{

System.out.println("Computing salary pay for " + getName());

return salary/52;

}

}

尽管我们不能实例化一个Employee类的对象,但是如果我们实例化一个Salary类对象,该对象将从Employee类继承3个成员变量和7个成员方法。

/* 文件名 : AbstractDemo.java */

public class AbstractDemo

{

public static void main(String [] args)

{

Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);

Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

System.out.println("Call mailCheck using Salary reference --");

s.mailCheck();

System.out.println("\n Call mailCheck using Employee reference--");

e.mailCheck();

}

}

以上程序编译运行结果如下:

Constructing an Employee

Constructing an Employee

Call mailCheck using Salary reference --

Within mailCheck of Salary class

Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--

Within mailCheck of Salary class

Mailing check to John Adams with salary 2400.

抽象方法

如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。

Abstract关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。

抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。

public abstract class Employee

{

private String name;

private String address;

private int number;

public abstract double computePay();

//其余代码

}

声明抽象方法会造成以下两个结果:

  • 如果一个类包含抽象方法,那么该类必须是抽象类。

  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。

如果Salary类继承了Employee类,那么它必须实现computePay()方法:

/* 文件名 : Salary.java */

public class Salary extends Employee

{

private double salary; // Annual salary

public double computePay()

{

System.out.println("Computing salary pay for " + getName());

return salary/52;

}

//其余代码

}

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

相关推荐

微信新表情怎么更新哪里更新 微信新表情包安卓苹果更新方法一览

根据微信官方的消息,微信新增“裂开”等6个小表情。IT之家了解到,截止发稿时仍有很多用户反映没有收到小表情的更新,微信官方表示“不急,今夜都会有的”。根据微博网友的留言,这6个小表情的名称...

谷歌调整Android 15最低硬件要求:存储容量提升至32GB

IT之家4月15日消息,谷歌近期对Android系统的最低硬件要求进行了调整,其中最明显的变动的是Android15的存储容量要求从Android14的16GB提升至32...

微信8.0怎么更新安卓 微信8.0怎么更新不了 如何更新微信8.0安卓

微信8.0更新方法也是值得研究的,ios的话不用说,可以在商店直接升级,但是安卓的呢,是怎么更新的,在哪里可以更新到安卓版,下面就来介绍下安卓在哪更新。微信8.0更新方法一览更新内容一览:1、首屏页有...

谷歌升级安卓Files文件管理器,支持以ZIP格式压缩文件、文件夹

IT之家9月10日消息,科技媒体AndroidAuthority昨日(9月9日)发布博文,表示谷歌旗下Files应用将支持以ZIP格式压缩文件、文件夹。该媒体逆向编译最新的...

安卓 7.0,魅族 15 Plus 喜迎 Flyme 8 稳定版更新

IT之家9月4日消息据网友投递,魅族15Plus已获得Flyme8.0.5.0A稳定版更新推送。此次更新基于安卓7.0,更新包体积约284.7MB,更新内容包括游戏模式4.1、优...

一加7T+7T Pro「Android 10.0 稳定版」H2OS-全量包发布-可救砖

一加7T和一加7TPro官方终于全量包推送稳定版本了,对比之前的稳定版来说,修复了太多的BUG,其实小编在体验一加氢OS的感受下,并没感觉到什么BUG,系统还是非常稳定的,只不过太过简洁,习惯了MI...

大疆 OM 6 和 OM SE 智能手机云台曝光

IT之家9月21日消息,大疆OSMO官方宣布,将于9月22日21点发布“灵机随行”新品,根据此前爆料,预计为DJIOM6和OMSE手机云台。目前大疆DJIOM...

【性价比入门大耳台式组合】说说飞傲FT1+K11R2R

眼瞅着就要到了2024的Q4,大半年下来,才子伴乐谈写了不少分享,飞傲的份额可能是各个厂牌里面最高的,前三季度他们“按部就班”推出了一系列新品,远高于其他国内品牌。今天要说的主角,是他们近期推出的两款...

暑期畅享高质量音乐生活,创新科技818新品首发狂欢不停

炎热的八月已经过去了一半,各位小伙伴的暑期生活过的怎么样呢?是顶着火辣的太阳出门逛街,还是在家吹着空调过上清爽舒适的宅家生活,相信不少人都是选择后者,当然,整天躺在家里只是刷微博开黑聊天的话,久而久之...

唱机秘笈,让你的生活从双11开始,慢下来

双11马上就来啦!是不是已经在盖楼大战中感受到了狂欢前夕弥漫的紧张感?锋梭1元预定,最高抵扣200元的活动仍在继续,决战前夕锋梭要给你最后的法宝——一份唱机秘笈,让它帮你选出双11最适合你的黑胶唱机...

西门子smart200和西门子1200ModbusTCP通讯交流

我们上节课程基于博途V16讲了西门子1200PLC和1500PLC的ModbusTCP通讯,这节课程我们讲smart系列PLC和1200系列PLC的ModbusTCP通讯,作这个实验项目必须满足以下...

国产半桥驱动芯片SLM2110S试用记(s2104半桥驱动芯片)

IR公司的IR2110S,是一片非常成熟的半桥驱动芯片,大量应用于半桥或全桥开关电源或逆变电源上。我在300-3000W的逆变器上曾用过很多,性能一直不错,电路简单,驱动卡可以做得很小,且短路保护功能...

好声音爱好者的福音,创新天猫乐活季优惠强势来袭

作为好声音爱好者,在家追剧、看电影、玩游戏的时候,你一定对声音设备有很高的要求。或者遇到居家办公处理工作情况,流畅的沟通也十分重要。因此一套专业好用的声音设备显得尤为重要。但是功能齐全、性价比高的声音...

爬虫神器-亮数据,可以轻松解锁各种网站~

网络爬虫是一种常见的数据采集技术,与屏幕抓取不同,屏幕抓取只复制屏幕上显示的像素,网络爬虫提取的是底层的HTML代码,以及存储在数据库中的数据。一般使用抓包工具获取HTML,然后使用网页解析工具提取数...

Excel实用技巧:抓取网页实时数据(excel抓取网页部分数据)

Excel是一个强大的数据处理和分析工具,可以用于处理各种类型的数据。如果你需要在Excel中获取实时数据,那么本文将为你介绍如何利用Excel抓取网页实时数据。一、安装PowerQuery插件Po...

取消回复欢迎 发表评论: