java抽象类及其派生类_java抽象类
本文指标:
1. 最基本的运用:掌握java类最简单,最核心的写法
2. 理论知识:语法角度,设计角度
3. 几种典型应用
最简单也是最核心的抽象类示例:
学习应该是一个循序渐进的过程,学java抽象类也好,学数据结构也好,或者其它,深入学习以后会发现知识点很多,如果学习的节奏加快,会感觉有一堆的东西在意念中,而这个时候最需要告诉自己起码最简单的一块已经毫无疑问的掌握着,而最简单的东西往往也最常用。以下的java抽象示例包括定义一个抽象类和抽象函数、普通类继承抽象类并实现抽象方法以及在主程序中如何使用抽象类。这三个步骤基本上就概括了java抽象类最基本的用法。
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 下午4:12:28
**/
public abstract classSimpleAbstract {public abstract voiddosome();
}
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 下午4:13:33
**/
public class SimpleAbstractDo extendsSimpleAbstract {public voiddosome() {
System.out.println("Hello Abstract .");
}
}
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 下午4:14:40
**/
public classSimpleAbstractDEMO {public static voidmain(String[] args) {//TODO Auto-generated method stub
SimpleAbstract a=newSimpleAbstractDo();
a.dosome();
}
}
语法角度看:
1. 抽象类不能直接实例化;因为:抽象类中包含抽象方法,抽象方法只有方法体,无法被对象调用)
2. 抽象类必然会有子类(非抽象子类),子类(非抽象子类)必须覆盖抽象类中的全部抽象方法。
3. 抽象方法的访问范围必须为public或者protected,而不能是private;因为:抽象方法需要被继承的子类重写。
4. 抽象类可继承抽象类,这种情况下不必须覆盖父类的抽象方法
设计角度
百度百科上这一段话挺经典:
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。
设计抽象类的作用在我看来有以下几点:
1. 通过看抽象类,就可以知道它的所有派生类都会有什么方法;
2. 通过抽象类实现模板设计模式编程变得更加优美和好管理;
3. 最本质的:现实中,对象都是有一个类去描述的,但是反过来却不是这样;比如动物这一概念,它可以是猫,是狗,或者其它,那么我们把动物作为一个类的时候应该把他设计成抽象类,我们可以在这个类里面定义一些动物该具有的方法,但是具体实现交给对应的派生类去实现。有了抽象类这种设计,编程描述动物与猫狗之间的关系时,就变得好理解。
抽象类的典型应用示例:
1.抽象类:内部抽象类
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 下午2:28:25
**/
abstract classStaticInnerAbstract {static abstract classInnerAbstract{public abstract voiddosome();
}
}
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 下午2:30:35
**/
public class StaticInnerAbstractDo extendsStaticInnerAbstract.InnerAbstract {public voiddosome() {
System.out.println("Hell,Static Inner Abstract .");
}
}
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 下午2:33:07
**/
public classStaticInnerAbstractDEMO {public static voidmain(String[] args) {
StaticInnerAbstract.InnerAbstract si=newStaticInnerAbstractDo();
si.dosome();
}
}
2.抽象类:唯一子类
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 下午3:10:24
**/
public abstract classSingleSubClassAbstract {public abstract voiddosome();private static class SingleSubClass extendsSingleSubClassAbstract{public voiddosome() {
System.out.println("hi,SingleSubClassAbstract .");
}
}public staticSingleSubClassAbstract getInstance() {return newSingleSubClass();
}
}
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 下午3:22:23
**/
public classSingleSubClassAbstractDEMO {public static voidmain(String[] args) {//TODO Auto-generated method stub
SingleSubClassAbstract.getInstance().dosome();;
}
}
3.抽象类:模板设计模式
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 上午11:24:53
**/
public abstract classLanguage {public static final int SORT=1;public static final int HOW=2;public abstract voidsort();public abstract voidhow();public void explain(intnum) {switch(num) {case 1:this.sort();break;case 2:this.how();
}
}
}
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 上午11:32:24
**/
public class JAVA extendsLanguage{public voidsort() {
System.out.println("language:java");
}public voidhow() {
System.out.println("well done java");
}
}
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 上午11:30:40
**/
public class PHP extendsLanguage {public voidsort() {
System.out.println("language:php");
}public voidhow() {
System.out.println("do well in website");
}
}
packagecom.wt010.abstractDEMO;/***@authorkonecms
* @date 2018年1月5日 上午11:34:16
**/
public classAbstractDemo {public static voidmain(String[] args) {//TODO Auto-generated method stub
pick(newPHP());
pick(newJAVA());
}public static voidpick(Language l) {
l.explain(l.SORT);
l.explain(l.HOW);
}
}
java抽象类及其派生类_java抽象类相关推荐
- java反射出抽象类的实现类_java利用反射模式调用实现类
本文主讲,java利用反射模式调用接口的实现类.抽象类的继承子类.下面请听一一道来 1.第一步在src下创建com.newer.reflex包 2.在com.newer.reflex包下面建立IRef ...
- java 抽象类的匿名类_Java匿名内部类(通过继承抽象类来实现)
3. 匿名内部类 没有名字的内部类就是匿名内部类. 3.1 匿名内部类特性 1. 匿名内部类总是默认实现某个接口或继承某个抽象类. 2.不能有构造方法,只能有一个实例. 3. 不能定义在任何静态成员. ...
- java请编写公共类继承抽象类_(Java相关)怎么理解抽象类,继承和接口?
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:海子 来源:博客园 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的 ...
- Java笔记018-抽象类、抽象类最佳实践-模板设计模式、接口、内部类
目录 抽象类 先看一个问题 小结: 抽象类快速入门 抽象类的介绍 抽象类使用的注意事项和细节讨论 抽象类练习题 抽象类最佳实践-模板设计模式 基本介绍 模板设计模式能解决的问题 最佳实践 最佳实践 接 ...
- Java接口、基类、抽象类详解(图解接口、继承和实现、基类和抽象类的区别等)——Java基础系列
文章目录 前言 总览(必看) 一.接口是"契约" 二.接口实例--Servlet接口 三.抽象标识符abstract和抽象类 四.基类作为"辅助" 求支持 前言 ...
- 常见java面试题 普通类和抽象类的区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法. 抽象类不能直接实例化,普通类可以直接实例化.
- Java抽象类和接口使用_Java 抽象类和接口
一.抽象类 1.定义 抽象类指提供方法,但是未提供方法体(实现方法)的类,抽象类用来被子类继承,子类通过方法的重写实现抽象方法. 注:1)抽象类中不一定包含抽象类,它可能只是abstract修饰的类: ...
- java抽象类的子类必须_JAVA——抽象类
一.抽象类的概念 包含一个抽象方法的类就是抽象类,其本质是对多个普通类中相同的部分的抽象. 二.抽象类的特点 1.抽象方法和抽象类使用 abstract 修饰: 2.有一个抽象方法的类必须是抽象类: ...
- java 只有日期的类_JAVA日期和时间类彻底解决(1)[转]
What's your time zone? JAVA日期和时间类彻底解决(1)Page 1 of 3 你是否在苦苦挣扎在JAVA语言中的日期和时间中?当你在计算机上显示日期和时间时,, 是否要快一个 ...
最新文章
- Redis存储总是心里没底?你大概漏了这些数据结构原理
- mysql 测试与mongodb 测试对比
- oracle配置控制文件快照的位置以及名称为,oracle的备份与恢复
- Bitmap详解(中)之像素级操作
- 剑指offer48-最长不含重复字符的子字符串(双指针经典)
- 【转】Visio(流程图绘制软件)的免费替代品
- python目录操作_Python 简明教程 --- 25,Python 目录操作
- 芯片领域再起风波 国内IC行业挑战来临
- MATLAB 6.封装 相频特性
- 如何在系统设置mysql环境变量(win11)
- linux 计算cpu利用率
- Python下载小说 -XXOO
- 四川师范大学计算机系黄宇,黄宇-经济信息工程学院
- 安卓开发——升级compileSdkVersion、targetSdkVersion、buildToolsVersion、support包到最新(28)问题解决
- CSDN问答标签技能树(一) —— 基本框架的构建
- python自相关函数提取基音周期_Python语音基础操作--4.2基音周期检测
- Excel如何提取单元格中最后一次出现的数值
- 机器自动翻译古文拼音 - 十大宋词 - 声声慢 寻寻觅觅 李清照
- 特斯拉4D成像毫米波雷达与木牛科技早期开源的产品几乎一模一样?
- 【Python编程】三步完成如何从视频中提取音频?
热门文章
- leetcode力扣17.电话号码的字母组合
- Pagerank-2
- Facebook广告账号主页创建时,其实还有这些小知识!
- java界面ATM机取款后的余额_java_ATM机银行存取款系统的设计与实现本科毕业论文...
- 饼状图改变数据显示位置_Tableau--饼图大作战
- 反射实现方法调用(1):执行机制
- 有高手想换工作的么?
- 重新学习java第一天
- 小程序navigator跳转路径url写法
- linux系统中存放用户账号信息的文件是,信息安全技术题库:Linux系统中,用户登录密码的hash是存放在()文件中的。...