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);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值