5.1.6 抽象类

有时候我们无法说出具体是什么,只能用于标识一个类型,比如图形,就可作为抽象类。虽然无法具体描述图形,但是图形通常都有面积、周长。这种时候就可用抽象类标识。

抽象类使用abstract标识来标识,特征如下:

  1. 可以写抽象方法,抽象方法同样使用abstract关键字标识,不能有大括号方法体,结尾用分号;
  2. 可以写非抽象方法,与普通类中方法的写法相同;
  3. 可以被继承,或者说不被继承的抽象类没有任何意义,继承抽象类的非抽象类,必须实现抽象方法;
  4. 抽象类不能使用 new 实例化,它指代的是一类东西的共同特征,无具体的描述。实例化抽象类类似于“你把人找来”,没有具体的指代,无法知道指的是哪个人。

代码如下:

public abstract class Shape{private int tmpA;private int tmpB;//1. 可以写抽象方法,抽象方法同样使用abstract关键字标识,不能有大括号方法体,结尾用分号;public abstract double getArea();public abstract double getPerimeter();//2. 可以写非抽象方法,与普通类中方法的写法相同;public int getTmpA() { return tmpA; }public void setTmpA(int tmpA) { this.tmpA = tmpA; }public int getTmpB() { return tmpB; }public void setTmpB(int tmpB) { this.tmpB = tmpB; }@Overridepublic String toString() {return "I am shape";}}
public class Circle extends Shape {private int r;public int getR() { return r; }public void setR(int r) { this.r = r; }//3. 可以被继承,或者说不被继承的抽象类没有任何意义,继承抽象类的非抽象类,必须实现抽象方法;@Overridepublic double getArea() { return PI*r*r; }@Overridepublic double getPerimeter() { return 2*PI*r; }@Overridepublic String toString() {return "r="+r;}}
public class Square extends Shape {double a;double b;public double getA() { return a; }public void setA(double a) { this.a = a; }public double getB() { return b; }public void setB(double b) { this.b = b; }//3. 可以被继承,或者说不被继承的抽象类没有任何意义,继承抽象类的非抽象类,必须实现抽象方法;@Overridepublic double getArea() {return a*b;}@Overridepublic double getPerimeter() {return a+a+b+b;}@Overridepublic String toString() {return "a="+a+" b="+b;}}
public class Main {public static  void main(String[] args){Main solution = new Main();Circle c = new Circle();c.setR(5);solution.printShapeAreaPerimeter(c);Square s = new Square();s.setA(3);s.setB(5);solution.printShapeAreaPerimeter(s);//4. 抽象类不能使用 new 实例化,它指代的是一类东西的共同特征,无具体的描述。//        Shape test = new Shape();//Error:(26, 22) java: com.dyy.jdk8.test.Shape是抽象的; 无法实例化}private void printShapeAreaPerimeter(Shape shape){System.out.println(shape.getArea());System.out.println(shape.getPerimeter());}}

5.1.7 受保护的访问

有些时候,一些方法只希望子类去修改,而不希望外界进行调用,此时可以用protected关键字,比如Shape中设置各自形状的名称

public abstract class Shape{private int tmpA;private int tmpB;//1. 可以写抽象方法,抽象方法同样使用abstract关键字标识,不能有大括号方法体,结尾用分号;public abstract double getArea();public abstract double getPerimeter();protected abstract void setName(String name);public abstract String getName();//2. 可以写非抽象方法,与普通类中方法的写法相同;public int getTmpA() { return tmpA; }public void setTmpA(int tmpA) { this.tmpA = tmpA; }public int getTmpB() { return tmpB; }public void setTmpB(int tmpB) { this.tmpB = tmpB; }@Overridepublic String toString() {return "I am shape";}}
public class Circle extends Shape {private int r;private String name;public Circle(){setName("circle");}public int getR() { return r; }public void setR(int r) { this.r = r; }//3. 可以被继承,或者说不被继承的抽象类没有任何意义,继承抽象类的非抽象类,必须实现抽象方法;@Overridepublic double getArea() { return PI*r*r; }@Overridepublic double getPerimeter() { return 2*PI*r; }@Overrideprotected void setName(String name) {this.name = name;}@Overridepublic String getName() {return name;}@Overridepublic String toString() {return "r="+r;}}
public class Square extends Shape {private double a;private double b;private String name;public Square(){setName("square");}public double getA() { return a; }public void setA(double a) { this.a = a; }public double getB() { return b; }public void setB(double b) { this.b = b; }//3. 可以被继承,或者说不被继承的抽象类没有任何意义,继承抽象类的非抽象类,必须实现抽象方法;@Overridepublic double getArea() { return a*b; }@Overridepublic double getPerimeter() { return a+a+b+b;  }@Overrideprotected void setName(String name) { this.name = name; }@Overridepublic String getName() { return name; }@Overridepublic String toString() {return "a="+a+" b="+b;}}
public class Main {public static  void main(String[] args){Main solution = new Main();Circle c = new Circle();c.setR(5);solution.printShapeAreaPerimeter(c);Square s = new Square();s.setA(3);s.setB(5);solution.printShapeAreaPerimeter(s);//4. 抽象类不能使用 new 实例化,它指代的是一类东西的共同特征,无具体的描述。//        Shape test = new Shape();//Error:(26, 22) java: com.dyy.jdk8.test.Shape是抽象的; 无法实例化}private void printShapeAreaPerimeter(Shape shape){System.out.println(shape.getArea());System.out.println(shape.getPerimeter());System.out.println(shape.getName());}}

执行结果:

 系列内容

《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述

《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(4)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(5)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(6)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(7)大数处理、数组、多维数组、控制台传参

《Java 核心技术 卷1》 笔记 第四章:类与对象

《Java 核心技术 卷1》 笔记 第四章:类与对象(2) GregorianCalendar 与 类的基本组成

《Java 核心技术 卷1》 笔记 第四章:类与对象(3) 构造器全局私有方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(4) 静态字段+静态方法+工厂方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(5) 形参与实参 构造器的默认值与默认构造

《Java 核心技术 卷1》 笔记 第四章:类与对象(6) 构造器调用与初始化块

《Java 核心技术 卷1》 笔记 第四章:类与对象(7) 注释、JavaDoc与类设计

《Java 核心技术 卷1》 笔记 第五章 继承

《Java 核心技术 卷1》 笔记 第五章 继承(2)

喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。

关注公众号,互相学习:钰娘娘知识汇总

《Java 核心技术 卷1》 笔记 第五章 继承(3)相关推荐

  1. Java核心技术卷阅读随笔--第3章【Java 的基本程序设计结构】

    3.1 一个简单的Java应用程序 下面看一个最简单的 Java 应用程序,它只发送一条消息到控制台窗口中: 复制代码 public class FirstSample { public static ...

  2. 《Java核心技术》学习笔记——第8章 泛型程序设计

    版权声明:本文为博主ExcelMann的原创文章,未经博主允许不得转载. 第8章 泛型程序设计 作者:ExcelMann,转载需注明. 第8章内容目录: 为什么要使用泛型程序设计 定义简单泛型类 泛型 ...

  3. Java核心技术卷1——笔记(1)

    2019独角兽企业重金招聘Python工程师标准>>> 今天读到卷一中对象与类的相关内容,当中关于对象变量的描述对我还是很有启发的. 第一点: 那就是"一个对象变量并没有实 ...

  4. [Java核心技术(卷I)] - vscode手动编译运行继承类

    参考 - P160~P161 主要有3个类: 一个测试类(ManagerTest).一个子类(Manager).一个父类(Employee) 注意点: -1. 使用 javac -d . *.java ...

  5. Java核心技术卷2 高级特性 学习笔记(5)

    参考:Java核心技术卷2 高级特性  第九章 Java技术提供了三种确保安全的机制: 语言设计特性(对数组的边界进行检查,无不受检查的类型转换,无指针算法等). 访问控制机制,用于控制代码能够执行的 ...

  6. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)

    22.一旦获得了一个 Charset,就可以在 Java 的 Unicode 和指定的编码格式之间进行转化,下面以 GBK 和 Unicode 之间做为例子. 从 Unicode 到 GBK: imp ...

  7. 《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试

    出现不可预计的问题时,需要进行如下处理: 报告错误 保存操作结果 允许用户退出 本章解决的问题: 验证程序正确性 记录程序错误 调试技巧 11.1 处理异常 程序出现错误时应该: 返回安全状态,能让用 ...

  8. java核心技术卷I 第1-3章 笔记

    java核心技术卷I 第1-3章 本书将详细介绍下列内容: ● 面向对象程序设计 ● 反射与代理 ● 接口与内部类 ● 异常处理 ● 泛型程序设计 ● 集合框架 ● 事件监听器模型 ● 使用Swing ...

  9. 《Java核心技术 卷Ⅰ》读书笔记一

    Java核心技术·卷 I(原书第10版) 作者: [美] 凯.S.霍斯特曼(Cay S. Horstmann) 出版社: 机械工业出版社 原作名: Core Java Volume I - Funda ...

最新文章

  1. 预测|十张图带你了解2018年机器人行业趋势与前景
  2. C++中extern “C”含义深层探索(zz)
  3. Vector用法(C++ Primer中文版)
  4. 面试官:Spring事务的传播行为有几种?
  5. php 23种设计模型 - 组合模式(合成模式)
  6. C# 中是否支持 Like 和 ln 条件的参数化查询 ?
  7. Sandy引擎学习笔记:摄影机
  8. 看看30万码农怎么评论:培训出来的程序员真的很渣吗?
  9. laravel基本信息
  10. Android ListView反复调用getView和getCount
  11. webpack入门总结1
  12. 关于IplImage的widthstep
  13. 基于JSP的房屋租赁管理系统
  14. 小程序 canvas旋转文字
  15. HTML的弹性布局用法
  16. 有运气摇号来不及挑选?网易有数帮你科学选房
  17. python咋念_python怎么念
  18. 【USACO 2020 January Silver】Loan Repayment 题解
  19. KATKO KEM640U开关
  20. 蔡楚生暨潮籍电影名人史迹馆在广东汕头开馆

热门文章

  1. 怎么辨别小米屏幕是否原装
  2. html中怎么把文字环绕圆形,Photoshop如何制作环绕圆形路径文字(章环绕的圆形文字)及使用技巧记录...
  3. 64位字符串的编码解码[转]
  4. C++11 之auto
  5. Java 面向对象程序设计 错题整理 chapter 12
  6. 数码相机中关于Auto/A/S/P/M档的使用
  7. python正则替换_python正则之替换字符串
  8. fundamentals\Counting
  9. 前端web页面通过VUE集成H5直播、点播播放器LivePlayer
  10. 微生物组-扩增子16S分析研讨会(参加线上直播课还可免费参加线下课 )