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这个域名竟然消失了。联…

python傅里叶函数图像_python实现傅里叶级数展开的实现

傅立叶级数的介绍我就不说了&#xff0c;自己也是应用为主&#xff0c;之前一直觉得很难懂&#xff0c;但最近通过自己编程实现了一些函数的傅立叶级数展开之后对傅立叶 级数展开的概念比较清楚了(1)函数如下函数图象如下&#xff1a;代码&#xff1a;from pylab import *x mg…

kafka python教程_kafka python 指定分区消费

通过assign、subscribe两者之一为消费者设置消费的主题consumer KafkaConsumer(bootstrap_servers[127.0.0.1:9092],auto_offset_resetlatest,enable_auto_commitTrue, # 自动提交消费数据的offsetconsumer_timeout_ms 10000, # 如果1秒内kafka中没有可供消费的数据&#xff0…

python字典由什么组成_在Python中,将由关键字对组成的列表添加到字典中最简单的方法是什么?...

试试这个&#xff1a;data []with open(names.dat) as database:for line in database:if line.strip(): # skip blank linesdata.append(dict(i.split(":") for i in line.rstrip(\n).split(",")))如果您的文件是&#xff1a;^{pr2}$data将是&#xff1a…

java题霸_牛客题霸每日一题 + NC50 + Java题解

import java.util.*;/** public class ListNode {* int val;* ListNode next null;* }*/public class Solution {/**** param head ListNode类* param k int整型* return ListNode类*/public ListNode reverseKGroup (ListNode head, int k) {if (head null || head.next…

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()函…

python视频网站分类_媒资分类_Python SDK_服务端SDK_视频点播 - 阿里云

初始化客户端使用前请先初始化客户端&#xff0c;请参见创建分类调用AddCategory接口&#xff0c;完成创建分类功能。接口参数和返回字段请参见from aliyunsdkvod.request.v20170321 import AddCategoryRequestdef add_category(clt, cateName, parentId-1):request AddCatego…

为什么java需要静态类_java – 为什么OOP中静态类的最佳实践有所不同?

我目前正在阅读有关Java最佳实践的内容,我发现根据this book,我们必须支持非静态的静态类.我记得在C#最佳实践中,我们必须根据Dennis Doomen的C#3.0,4.0和5.0编码指南来避免这种情况&#xff1a;AV1008 – Avoid static classesWith the exception of extension method contain…

光电转换模块_光模块: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_Java中关于获取时间(日期)的总结大全

文章目录1.相关类1.1 java.util.Date1.2 java.text.DateFormat(抽象类)1.3 java.text.SimpleDateFormat(DateFormat的直接子类)1.4 java.util.Calendar(抽象类)2.示例2.1 日期取值2.1.1 获取当前系统时间(毫秒数)2.2 日期转换2.2.1 日期转字符串、字符串转日期2.2.2 将日期转换…

python仪表指针识别_一种指针式仪表的识别方法

一种指针式仪表的识别方法杨世杰&#xff0c;张平【摘要】当前指针式仪表识别技术日益成熟&#xff0c;其中指针形状和位置的识别大多采用Hough变换算法&#xff0c;传统的Hough变换算法运算时间长、储存空间大&#xff0c;使得识别过程效率低下。针对以上缺点&#xff0c;提出…

树莓派python编程读取电压_《树莓派Python编程指南》——3.2 在结构体中存储值-阿里云开发者社区...

本节书摘来自华章计算机《树莓派Python编程指南》一书中的第3章&#xff0c;第3.2节,作者&#xff1a;(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区“华章计算机”公众号查看。3.2 在结构体中存储值除了简单数据类型&#xff0c;Python还允许我们将数据用不同…

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

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

Java 数据库进度条_java进度条

练习JProgressBar结合Timer使用。代码如下&#xff1a;package luojing;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.Timer;import java.util.TimerTask;public class NewClass{static JProgressBar jpb null;static JButton jb null;…