abstract [非private访问修饰符] 返回值类型 方法名称(参数列表);



当编写一个类时,我们往往会为该类定义一些方法,这些方法时用来描述该类的行为方式,那么这些方法都有具体的方法体。

但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。



比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?

所有的图形都有求面积的方法,不管你是正方形,矩形,圆形无所谓,他们都是图形,所以我们应该抽象一个图形这个父类。第一种做法,我们把求面积的方法作为每一个子类的自己的方法,但是这样,我们就不能利用多态来统一的屏蔽子类的实现细节,那有同学就想,那我们就给父类添加一个求面积的方法,但是对于图形来说,这个方法其实是没有任何实际意义的,那么有同学就想,我们这个方法就随便返回一个0吧,然后要子类都来重写这个方法。问题就来了,如果我有一个图形的子类忘记覆盖这个方法了,java是不知道的,但是应用在逻辑上是有错误的,那么有没有一个方式,来让我们能在父类里面加一个方法,但是这个方法在父类里面是没有实际含义的,并且要求子类必须重写这个方法,如果不重写,java在编译的时候就给我们报错,是不是就能解决这个问题了?那么这个机制就是抽象类。





通过abstract关键字来修饰的类称为抽象类;可以定义被abstract修饰的抽象方法。抽象方法只有返回类型和方法签名,没有方法体。抽象类可以含有普通方法。抽象类不能创建实例对象(不能new)。需要子类覆盖掉所有的抽象方法后才可以创建子类对象,否则子类也必须作为抽象类





分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功能声明相同,但功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。抽象方法要存放在抽象类中。抽象方法也可以存在于接口中。方法签名由方法名称和一个参数列表组成。代码规范问题,abstract一般写在方法修饰符最前面,醒目,一看就知道是抽象方法;





列举常见的几个抽象类:

流的四个基本父类

InputStream,OutputStream,Reader,Writer





抽象类能使用final修饰吗?//NO

抽象类可以定义构造方法吗?//YES

final和abstract可以同时使用吗?//永远不可以

final和private可以同时使用吗?//永远不可以



public class GraphDemo {
public static void main(String[] args) {
Circle c = new Circle(1.0);
double d1 = c.getZhouchang();
Graph c2 = new Circle(2.0);
double d2 = c2.getZhouchang();
Graph s = new Sanjiaoxing(3,4,5);
double d3 = s.getZhouchang();
System.out.println(d1 +"," +d2 +"," + d3);
}
} abstract class Graph{
abstract double getZhouchang();
} class Circle extends Graph{
private double r;
public Circle(double r){
this.r=r;
}
@Override
double getZhouchang() {
return Math.PI*r*2;
}
}
class Sanjiaoxing extends Graph{
private double a;
private double b;
private double c; public Sanjiaoxing(double a,double b, double c){
isSanjiaoxing(a, b, c);
} private void isSanjiaoxing(double a,double b, double c){
if(a+b<=c||a+c<=b||b+c<=a){
System.out.println("不是一个三角形。。。");
}else{
this.a = a;
this.b = b;
this.c = c;
}
} @Override
double getZhouchang() {
return a + b +c;
} }

linkin大话面向对象--抽象类的更多相关文章

  1. linkin大话面向对象--闭包和回调

      先来理解2个概念:闭包和回调   什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...

  2. linkin大话面向对象--类和对象

    我们每天在撸码,那么我们在敲什么东西呢?明显的我们在写类,写一个类,写一个接口,写某个接口里面写一些属性,在某个类里面写一个方法,然后以一个对象调用方法,对于j2ee来讲的话,可能还会写一些jsp,静 ...

  3. linkin大话面向对象--内部类

    内部类说白了就是类中有类 内部类:嵌套类 外部类:宿主类 内部类主要有以下作用:记住了3个字:多继承... 1,内部类提供了更好的封装,可以把内部类隐藏在外部类中,不允许同一个包中的其他类访问该类. ...

  4. linkin大话面向对象--枚举

    枚举类(enum) 其实我们使用到枚举的地方还是很多的,其实我们可以完全人工的来实现枚举的功能.比如说我现在手里的项目我就是自己实现的枚举,说白了,枚举就是一个类的多例模式. 1,使用enum声明,默 ...

  5. linkin大话面向对象--多态

    java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...

  6. linkin大话面向对象--GC和jar包

    GC java的垃圾回机制是java语言的重要机制之一.当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中.当这块内存不再被任何变量引用时,这块内存就 ...

  7. linkin大话面向对象--接口

    接口(interface)的概念,掌握接口很重要,以后所有的编程都要面向接口编程.其实接口的内涵就7个字:规范和实现分离. 抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特 ...

  8. linkin大话面向对象--包装类

    Java提倡的万物皆对象,但是数据类型的划分出现了基本数据类型和引用数据类型,那么我们怎么能把基本数据类型称为对象呢? 基本数据类型 包装类 byte Byte short Short int Int ...

  9. linkin大话面向对象--java关键字

    java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract  default  null  synchronized ...

随机推荐

  1. sql server存储过程实现批量删除

    在项目中用到了存储过程来进行批量删除的操作,给大家分享一下 原理就是把id组成的字符串在数据库分割成数组放一张临时表,删除的时候与id进行对照 --删除会员信息 if OBJECT_ID('pro_D ...

  2. 2017-07-18&19

    [toc] 数据库 for循环里写操作数据库是大忌!尤其是这种情况:一次查询的结果中有一个记录还要继续展开查询,两次查询的记录均不止一条.就很容易写成for循环里操作数据库了.解决办法就是循环里的每条 ...

  3. Redis进阶实践之二如何在Linux系统上安装安装Redis

    一.引言      上一篇文章写了"如何安装VMware Pro虚拟机"和在虚拟机上安装Linux操作系统.那是第一步,有了Linux操作系统,我们才可以在该系统上安装Redis. ...

  4. js 拼接table 的方法

    <html> <head> <title>test page</title> <script type='text/javascript'> ...

  5. Zabbix实战-简易教程(5)--Proxy和Agent端(源码和yum方式)

    3.3.1 zabbix proxy安装(源码方式) 1.创建目录 mkdir -p /usr/local/zabbix 2.安装必要软件 yum install -y fping(若安装不成功) 或 ...

  6. hdu_2030

    一个小小知识点,统计字符串中汉字出现的次数,直接给出代码 //ASCII码的范围是0-127所以,超出范围的都是汉字,因为一个汉字占两个字符位置,所以结果除以2就可以了 #include<cst ...

  7. NYoj289苹果(0-1背包)

    苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输 ...

  8. hdu_3003Pupu(快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3003 Pupu Time Limit: 2000/1000 MS (Java/Others)    M ...

  9. SSAS属性中更改AllowedBrowsingFolders的值后才能更改其它文件夹的值

    首先 以管理员身份运行 打开SQL Server Management Studio (SSMS). 在Sql Server Analysis Service中的属性中有很多文件夹属性,决定了存放CU ...

  10. surging 微服务框架使用系列之surging介绍

    首先,感谢surging的作者fanliang11为.net开源做出的贡献 其次, surging 的git地址:https://github.com/dotnetcore/surging surgi ...