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. python3之shutil高级文件操作

    1.shutil高级文件操作模块 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 2.shutil模块的拷 ...

  2. 【SSD,FIO,SAS选择的一些小结】SSD,FIO,SAS选择的一些小结

    最近重新摊上了数据库,公司核心数据库天天 IO爆满,在研究用SAS 16*RAID10 ,还是RAID10 SSD*6, 还是FIO:no.1 principle, no raid-5 for dat ...

  3. AOP---jdk动态代理的思考

    引出问题:动态代理中是谁调用了invoke方法 为了更好的说明情况,我先写一个动态代理类 a.Person类 public interface Person { public void eating( ...

  4. 微信小程序实现按首字母检索城市列表

    不说废话,上效果图 因为我有多处要用到,所以我这里是写成自定义组件的,你也可以直接改成在page页面编写: 布局左边一个scroll-view,显示城市列表,右边一个view显示字母列表,城市列表这边 ...

  5. 初学HTML5,你要懂得哪些?

    很多人问过我这个问题,想要做HTML5页面你要懂得哪些知识?而问这个问题的人基本上都是刚听说过或刚接触HTML5,处在迷茫的阶段,他们往往会被一些网上炫酷页面所吸引,然后自己也想学习HTML5,能通过 ...

  6. [搬运] C# 这些年来受欢迎的特性

    原文地址:http://www.dotnetcurry.com/csharp/1411/csharp-favorite-features 在写这篇文章的时候,C# 已经有了 17 年的历史了,可以肯定 ...

  7. python子域名收集器

    今天心血来潮做了一个子域名收集器.过程是蛋疼啊!这里先感谢一下qpython群的咸鱼大佬,在换页的时候出了点毛病,讲到后面我们就知道了. 思路: 代码开始: 我们要用到的模块是 Requests Bs ...

  8. CTF---Web入门第二题 上传绕过

    上传绕过分值:10 来源: Justatest 难度:易 参与人数:5847人 Get Flag:2272人 答题人数:2345人 解题通过率:97% bypass the upload 格式:fla ...

  9. [bzoj1910] [Ctsc2002] Award 颁奖典礼

    应该是第一次写这种图形类的DP.. 一个“I”可以分成三个矩形..令f[1..3][i][j][k]表示第几个矩形,下边界为第i行的j~k列,的最大面积. 然后就是各种优化啊什么的...时间复杂度O( ...

  10. JAVA多线程之CountDownLatch

    前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...