java定义抽象类abarea_详解 抽象类

本人在这篇博文中要讲解的知识点,和本人之前的一篇博文有所关联。因为,“抽象类” 是按照 “自下而上” 的顺序来编写所需的类,而在本人之前的博文《详解 继承(上)—— 工具的抽象与分层》中讲到的 继承 则与之相反,按照 “自上而下” 的顺序来编写所需类,那么,话不多说,现在本人就开始讲解这篇博文的主题

抽象类的基本概念:

首先,本人来介绍下什么是抽象类:

定义:

在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类

那么,抽象类具有如下特点:

特点:

抽象类 和 抽象方法 必须用abstract关键字修饰:

抽象类格式:abstract class 类名 {}

抽象方法格式:public abstract void eat();

抽象类 不一定有抽象方法,有抽象方法的类 一定是抽象类

抽象类中可以有构造方法,抽象类不能进行实例化:

问:那么要构造方法有什么作用呢?

答曰:用于子类访问父类数据时的初始化

抽象类不能直接实例化

问:那么,抽象类如何实例化呢?

答曰:按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。

抽象类的子类 :

要么是抽象类

要么重写抽象类中的所有抽象方法

本人来通过两个例子,来展示这个知识点的应用:

一、图形类:

假设现在要求编写几个类可以分别根据图形的属性求出图形的 周长 及 面积。

那么,若我们将几个图形的共性拿出来,做一个基类,之后我们再根据基类派生出各图形的方法。

首先,我们来编写 基本图形类(BaseShape类):

BaseShape.java:

package com.mec.about_abstruct;

public abstract class BaseShape {//只要含抽象方法,就是抽象类,就要加上“abstract”修饰符

protected String name;

protected String type;

protected BaseShape() {

}

protected BaseShape(String name) {

this.name = name;

}

//这两行代码,就是“抽象方法”,不在本类中实现,是专门用来给子类实现的

public abstract double area();

public abstract double rounder();

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

@Override

public String toString() {

return name + "的" + type;

}

}

现在本人来通过这个类编写一个 确定图形类 ——“Circle类”:

Circle.java:

package com.mec.about_abstruct;

public class Circle extends BaseShape {

private double radius;

public Circle() {

}

public Circle(String name) {

super(name);

this.type = "圆";

}

public Circle(String name, double radius) {

this(name);

this.radius = radius;

}

@Override

public double area() {

return Math.PI * radius * radius;

}

@Override

public double rounder() {

return 2 * Math.PI * radius;

}

}

现在同学们可能就对抽象类有了进一步了解:

抽象类:将类似的东西的共同部分(toString() 及 name 和 type)实现,将不同的、但必须要完成的(area()、rounder() 及 各图形特有尺度)表现出来,但不实现。

现在本人来对 Test类 进行一些改动:

Test类:

package com.mec.about_abstruct.test;

import com.mec.about_abstruct.BaseShape;

import com.mec.about_abstruct.Circle;

public class Test {

public static void main(String[] args) {

circleOne = new Circle("地球", 6371000.0);

System.out.println(circleOne.toString() + "周长= " + circleOne.rounder());

System.out.println(circleOne.toString() + "面积= " + circleOne.area());

}

}

我们现在来看看运行结果:

f81f6374d1902d321681a991532ea7ad.png现在,本人来总结下抽象类的注意点:

注意点:

只要含抽象方法,就是抽象类,就要加上“abstract”修饰符;

抽象类不能存在对象,因为它存在未实现的方法;

抽象类中不能存在private类成员及方法,所有抽象方法不能用static修饰;

抽象类派生的所有非抽象类,那么,

派生出来的非抽象类必须实现这个抽象类中的所有抽象方法;

若未实现,则子类也为抽象类,必须加上“abstract”修饰符;

我们能够发现,无论是 “继承” 还是 “抽象类” ,都是为了 “代码复用”。而本人在本专栏第一篇博文中就讲过,Java最主要的特点就是“面向对象”,也就是“面向工具”,我们现在来实现下一个有趣的问题——计算房价:

我们只需改动一下上面的代码:

BaseShape.java:

package com.mec.about_abstruct.shape;

public abstract class BaseShape {//只要含抽象方法,就是抽象类,就要加上“abstract”修饰符

protected String name;

protected String type;

//据了解:深圳近3年房价一平最低100

protected double price = 100;

protected BaseShape() {

}

protected BaseShape(String name) {

this.name = name;

}

public double getPrice() {

//所有的抽象方法,都可以在本类中被非静态方法调用

return price * area();

}

//这两行代码,就是“抽象方法”,不在本类中实现,是专门用来给子类实现的

public abstract double area();

public abstract double rounder();

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

@Override

public String toString() {

return name;

}

}

因为一般租的房子是投影式长方形的,所以本人现在来编写一个 长方形类:

Rectangle.java:

package com.mec.about_abstruct.shape;

public class Rectangle extends BaseShape {

private double width;

private double height;

public Rectangle() {

}

public Rectangle(String name) {

super(name);

this.type = "长方形";

}

public Rectangle(String name,double width, double height) {

this(name);

this.height = height;

this.width = width;

}

public double getWidth() {

return width;

}

public void setWidth(double width) {

this.width = width;

}

public double getHeight() {

return height;

}

public void setHeight(double height) {

this.height = height;

}

@Override

public double area() {

return width * height;

}

@Override

public double rounder() {

return 2 * (width + height);

}

}

Test.java:

package com.mec.about_abstruct.test;

import com.mec.about_abstruct.shape.BaseShape;

import com.mec.about_abstruct.shape.Rectangle;

public class Test {

public static void main(String[] args) {

BaseShape rectangleOne = new Rectangle("深圳一间小房间", 6, 6);

System.out.println(rectangleOne.toString() + "周长= " + rectangleOne.rounder());

System.out.println(rectangleOne.toString() + "面积= " + rectangleOne.area());

System.out.println(rectangleOne.toString() + "房价/月 约= " + rectangleOne.getPrice( ));

}

}

59d45c63a37fb7847990cfd3c94a4992.png

二、货币类:

因为本人在上文中已经将“抽象类”的基本知识点都已讲解完毕,那么,在这个例子中,本人就不会再做过多解释,以展示使用方法为目的,为同学们加深这个知识点的印象。

Currency类(抽象类):

package com.mec.about_abstruct.currency;

public abstract class Currency {

protected String goodsName;

protected double weight;

//以下是人民币分别对应其他货币的汇率

public static double RMB = 1.0;

public static double DOLLAR = 0.1459;

public static double EURO = 0.1250;

public static double POUND = 0.1110;

public static double YEN = 16.3797;

public static double WON = 163.8141;

public Currency(String goodsName, double weight) {

this.goodsName = goodsName;

this.weight = weight;

}

public double getWeight() {

return weight;

}

public abstract double price();

public void setWeight(double weight) {

this.weight = weight;

}

public double value(double currencyType) {

return price() * currencyType;

}

//这个方法调用了抽象方法,并将其返回值作为货币转换的基础数据

public String getValueString(double currencyType) {

return weight + "克" + goodsName + "价格为:"

+ value(currencyType)

+ currencyName(currencyType);

}

public String currencyName(double currencyType) {

if(Math.abs(currencyType - DOLLAR) < 1e-6) {

return "美元";

}

if(Math.abs(currencyType - EURO) < 1e-6) {

return "欧元";

}

if(Math.abs(currencyType - YEN) < 1e-6) {

return "日元";

}

if(Math.abs(currencyType - WON) < 1e-6) {

return "韩元";

}

if(Math.abs(currencyType - POUND) < 1e-6) {

return "英镑";

}

return "人民币";

}

}

Silver 类:

package com.mec.about_abstruct.currency;

public class Silver extends Currency{

public Silver(double weight) {

super("白银", weight);

}

@Override

public double price() {

return 3.12 * weight;

}

}

Gold 类:

package com.mec.about_abstruct.currency;

public class Gold extends Currency {

public Gold(double weight) {

super("黄金", weight);

}

@Override

public double price() {

return 264.5 * weight;

}

}

测试类(Demo 类):

package com.mec.about_abstruct.currency;

public class Demo {

public static void main(String[] args) {

Gold gold = new Gold(1.47);

System.out.println(gold.getValueString(Currency.RMB));

System.out.println(gold.getValueString(Currency.DOLLAR));

System.out.println(gold.getValueString(Currency.POUND));

System.out.println("下面演示白银兑换率:");

Silver silver = new Silver(132.0);

System.out.println(silver.getValueString(Currency.EURO));

System.out.println(silver.getValueString(Currency.WON));

System.out.println(silver.getValueString(Currency.YEN));

}

}

下面本人来展示下运行结果:

db14ab76f8ab8e96b2c9cb8648640095.png

由以上代码运行结果的展示,我们大致能够看出:

抽象类的成员具有如下特点:

抽象类的成员特点:

成员变量:

既可以是变量,也可以是常量。

构造方法:

必须有,因为 要用于子类访问父类数据的初始化。

成员方法:

既可以是抽象的,也可以是非抽象的。

抽象类的成员方法具有如下特性:

抽象类的成员方法特性:

抽象方法

强制要求子类做的事情

非抽象方法

子类继承的事情,提高代码复用性

抽象类和继承的逻辑顺序是相反的。

并且,抽象类 与 本人下一篇博文—— 《内部类 与 匿名内部类》 还有很深的关系,能够看出,这个知识点还是蛮重要的,所以,希望同学们能够加以重视。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word表格图片自动适应表格大小_Excel应用实践20:使用Excel中的数据自动填写Word表格...

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfect我在Excel工作表中存放着数据&#xff0c;如下图1所示。图1我想将这些数据逐行自动输入到Word文档的表格中并分别自动保存&#xff0c;Word文档表格如下图2所示&#xff0c;文档名为“datafromexcel.docx”。图…

dnspod java_使用dnspod遭遇的奇特问题以及背后的原因与临时解决方法

由于园子里有不少用户在使用dnspod&#xff0c;我们觉得有必要将这两天blogjava.net域名在dsnpod遇到的奇特问题分享一下&#xff0c;以免再有人踩着这个坑。12月11日&#xff0c;我们登录到dnspod的后台时&#xff0c;大吃一惊&#xff0c;blogjava.net这个域名竟然消失了。联…

cad转dxf格式文件太大_想知道DWG、DWT、DWS和DXF是什么吗?从了解4种CAD图形格式开始吧...

原创&#xff1a;就说我在开发区常用图形文件格式盘点CAD中的图形文件格式共9种&#xff0c;其扩展名分别为&#xff1a;❶DWG – 图形或块文件❷DWT – 图形样板文件❸DWS – 图形标准文件❹DXF – 图形交换文件(ASCII 或二进制)❺DST – 图形集或图纸集文件(SHEETSET 命令)❻…

vue登录如何存储cookie_vue项目实现表单登录页保存账号和密码到cookie功能

实现功能&#xff1a;1.一周内自动登录勾选时&#xff0c;将账号和密码保存到cookie&#xff0c;下次登陆自动显示到表单内2.点击忘记密码则清空之前保存到cookie的值&#xff0c;下次登陆需要手动输入次要的就不说了直接上主要的代码html部分登陆帮助一周内自动登录忘记密码&a…

usb协议规范_USB连接标准接口简述发布

制程工艺材料类USB为Universal Series Bus (通用序列总线)的缩写,是一种串行通讯协议(sereal protocol),它负责实体层和链接层的建立。它可以支持慢速的数据传输(如鼠标、键盘、游戏摇杆等)也支持快速的数字压缩影音信息。普通的USB2.0版本以下有两对线&#xff0c;分别用来传输…

java urlencode php_PHP如何使用urlencode()函数进行url编码?(代码示例)

urlencode()函数是PHP中的一个内置函数&#xff0c;用于对url进行编码。下面本篇文章就来给大家介绍一些urlencode()函数的用法&#xff0c;让大家了解urlencode()函数是如何对url进行编码的&#xff0c;希望对大家有所帮助。【视频教程推荐&#xff1a;PHP教程】urlencode()函…

光电转换模块_光模块:PIN光电二极管和APD光电二极管

在前面的文章中我们介绍了光模块的基本结构&#xff0c;包括TOSA、ROSA以及BOSA。今天我们接着介绍ROSA光器件的光电探测器。光模块接收端能正确识别信号并完成光电转换&#xff0c;就需要光电探测器&#xff0c;光电探测器通过检测出照射在其上面的光功率&#xff0c;从而并完…

java如何添加自定义的图片_java代码将图片加上自定义水印 -4

java代码将图片加上自定义水印&#xff0c;然后生成了新的图片import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import javax.image…

vba 当前文件名_值得学习和珍藏的VBA常用编程代码语句

分享成果&#xff0c;随喜真能量。大家好&#xff0c;今天继续和大家分享VBA编程中常用的过程代码。过程代码在这里讲解的语句非常简单单一&#xff0c;简单的语句组合起来就是一个复杂的过程&#xff0c;我们要认真掌握这些简单的过程&#xff0c;为我们复杂的工程服务。这也是…

java上传csv错误信息_java处理csv文件上传示例详解

前言&#xff1a;示例只是做了一个最最基础的上传csv的示例&#xff0c;如果要引用到代码中去&#xff0c;还需要根据自己的业务自行添加一些逻辑处理。ReadCsvUtil工具类package com.hanfengyeqiao.gjb.utils;import java.io.*;import java.util.*;/*** csv工具类*/public cla…

暗金色 rgb_杜伽TAURUS K310樱桃RGB红轴体验:做工精良、手感优秀

前言DURGOD杜伽的机械键盘一直以简约的外形和优秀的手感而备受好评。笔者之前用过杜伽的K310、K320两个系列的多把键盘&#xff0c;对其非常熟悉&#xff0c;外形简约大方&#xff0c;手感、灯效也比较满意。正因如此&#xff0c;这次刚刚入手了一把杜伽K310 RGB樱桃红轴&#…

vim 显示行号_Vim给文件加行号,这通惊为天人的操作没sei了!文末天书慎点

引言一般 Vim 使用 :set number 命令&#xff0c;在编辑器显示行号。本文展示了如何将行号插入到正文中&#xff0c;或者只插入到段落中。此外&#xff0c;还提供了打印行号的选项(Vim 可以打印带有数字的行&#xff0c;并且不需要文件有数字)。Vim可以使用 :s 命令在每行之前插…

java 获取对象方法有哪些方法有哪些方法有哪些_Java中创建String 对象的方法有哪些...

Java中创建String 对象的方法有哪些发布时间&#xff1a;2020-11-25 16:45:30来源&#xff1a;亿速云阅读&#xff1a;71作者&#xff1a;Leah这篇文章将为大家详细讲解有关Java中创建String 对象的方法有哪些&#xff0c;文章内容质量较高&#xff0c;因此小编分享给大家做个参…

vb中怎么使图片适应框的大小_叮!VB考前练习了解一下?

1、Visual Basic窗体设计器的主要功能是(C )。A) 画图B) 编写源程序代码C) 建立用户界面D) 显示文字解析&#xff1a;Visual Basic窗体设计器简称窗体(Form)&#xff0c;是应用程序最终面向用户的窗口&#xff0c;它对应于应用程序的运行结果。各种图形、图像、数据等都是…

苹果切换输入法_日语输入法哪个好

在初学日语的时候经常会遇到一些不认识的词&#xff0c;想查一下这个词是什么意思&#xff0c;应该怎么输入呢?尝试过许多软件之后&#xff0c;テツ为大家总结了一些认为比较好用的输入法百度IME输入法。下载安装后的切换非常简单&#xff0c;在右下角输入法处切换至JP日语即可…

python 10个100以内随机整数编辑_你要偷偷的学Python,然后惊呆所有人(第五天) - python阿喵

标题无意冒犯&#xff0c;就是觉得这个广告挺好玩的前言前期回顾&#xff1a;你要偷偷学Python&#xff0c;然后惊呆所有人(第四天)在第四天的时候&#xff0c;我们接触了Python的模块调用&#xff0c;这也是Python能够火起来的一大优势。我们还实践了csv模块。不过冷静下来想想…

安卓开发怎么调用photopicker_谷歌出手整顿安卓应用程序乱象:无良权限的APP们再见了!...

相信你在使用安卓手机的时候一定有过这样的经历&#xff0c;在明确拒绝了软件调用电话、手机通讯录、短信等敏感内容的访问权后&#xff0c;APP表示无法继续运行然后强退。如果这款APP不具备可替代性&#xff0c;恐怕最终结果是&#xff0c;用户不得不选择妥协。关于应用程序度…

react router官方文档_阿里开源可插拔 React 跨端框架 UmiJS

点击上方“开发者技术前线”&#xff0c;选择“星标”18&#xff1a;30 在看 真爱作者&#xff1a;Tamic | 编辑&#xff1a; 可可阿里之前开源&#xff1a;阿里闲鱼开源 Flutter 应用框架 Fish Redux&#xff01; 今天介绍的是前端React 框架- UmiJS。介绍umi官方宣称是一个…

java约瑟夫环迭代器_Josephus约瑟夫环问题的不同实现方法与总结

/************************************************************************//* Josephus问题——数组实现 *//************************************************************************/#include #include int Josephus(int t…

ios 下拉放大 上拉缩小_为啥鞠婧祎发量这么多?截图放大十倍她的“发缝”,网友:真密集...

​鞠婧祎&#xff0c;这位女明星真的是黑&#xff0c;红&#xff0c;黑&#xff0c;红。这不是秘密。鞠婧祎最近几天的确很受欢迎。甚至头发也受到质疑。一般而言&#xff0c;娱乐业的演艺人员由于多年来的工作时间安排不规则以及采取巴拉克拉法帽的行为&#xff0c;通常都有使…