在开始写抽象类之前,有一个问题我觉得想清楚会对理解抽象类很有帮助:那就是为什么要设计抽象类?

难道用类还不够么,为什么要设计出抽象类这样一个东西。我们可以换个角度来理解,就是有些类本来就是不应该被实例化的。

可以举个例子:比如我们定义了一个所有动物的父类Animal,但是现实之中并没有Animal这种对象阿,所以从这个角度来看Animal其实不应该被初始化。

然后我们想通过一个方法来防止类似Animal这种类被实例化,即让这个类不能够被new()出来。

那么可以通过标记类为抽象类就可以很好的解决上面提到的问题,这样编译器就知道不管在哪里这个类都不能创建任何实例。但是还是可以作为引用的类型。

抽象类通过在类的声明前加上abstract关键字即可实现。要明白抽象类,首先要知道抽象方法。

java中的抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。

简言之,已abstract修饰的方法就是抽象方法,只有定义没有具体实现是抽象方法的特点。注意只有定义没有实现只能作为抽象方法的性质/特点,而不能作为抽象方法的定义。

例如  public void f();虽然只有定义没有具体实现,但是不是抽象方法,因为并没有abstract来修饰; public abstract void f();则是抽象方法。

有了抽象方法的概念之后我们再来看抽象类。这里又有一个经常出错的概念,很多书中把包含抽象方法的类定义为抽象类,这是不准确的。事实上,抽象类中并不一定要包含抽象方法。

和抽象方法一样,准确的定义是用abstract修饰的类是抽象类。 例如: abstract class Animal{...} 即为抽象类。

这里再来列举一下抽象类的几个性质:

1. 含有抽象方法的类必须是抽象类,但是抽象类中可以不包含抽象方法

2. 抽象类必须被继承,抽象类是不能通过new进行实例化操作的,抽象方法必须被重写

3. private和abstract不能同时使用(抽象方法必须被重写,以private修饰则矛盾);

static和abstract不能同时使用(static不用实例化即可调用,abstract必须要被继承,矛盾);

final和abstract不能同时使用(final修饰的类不能被继承,final修饰的方法不能被重写, 矛盾);

看完抽象类再来看看Java中随处可见的接口(Interface)

首先接口是一种特殊的抽象类,是抽象方法和常量值的集合。接口中只包含常量和方法的定义,不包含变量和方法的实现。

关于接口有几点要特别注意:

1. 接口中所有的方法都是 public abstract 的, 即使你没有这样声明, 也就是说接口中的所有方法都是抽象方法, 抽象方法必须被重写。

2. 接口中所有的数据成员都是public static final的, 即使你没有这样声明

3. 接口既然是一种抽象类也就同样不能被实例化

4. 接口必须由实现类通过implements关键字来实现,当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的。

下面该看看面试中经常遇到的问题了:

抽闲类与接口到底有哪些区别???Q) What is the difference between abstract class and interface?

1.With abstract classes, you can declare fields that are not static and final, and define
public, protected, and private concrete methods.

(对于抽象类中的数据成员来说,可以不是static和final类型的, 对于抽象类中的方法而言,可以是public,protected,private)
With interfaces, all fields are automatically public, static, and final, and all methods
that you declare or define (as default methods) are public.

(对于接口来说,不管你有没有声明,所有的域都是public static final类型,方法是public abstract类型)
In addition, you can extend only one class, whether or not it is abstract, whereas you
can implement any number of interfaces

             

Java面向对象之抽象方法&接口的更多相关文章

  1. Java面向对象作业-用接口方式测试向下转型

    Java面向对象作业-用接口方式测试向下转型 根据视频的里实例 我们直接修改Test2测试方法: package com.java1234.chap03.sec13; public class Tes ...

  2. Java面向对象之类、接口、多态

    Java面向对象之类.接口.多态 类 class Person { // 实例属性 int age; String name; // 类属性 static int v = 1; // 构造器 publ ...

  3. java面向对象程序设计(下)-接口的定义

    抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更加彻底,则可以提炼出一种更加特殊的"抽象类"-接口(interface),Java9对接口进行了改进,允许在接口中定义默认方 ...

  4. java面向对象--抽象类和接口

    如果某个父类只知道其子类应该包含哪些方法,但无法知道如何实现这些方法,同时要使用多态的特性,怎么办? 抽象方法:关键字abstract允许在一个类中创建一个或多个没有方法体的方法--只提供方法签名,但 ...

  5. Java面向对象—抽象类和接口

    本文引用海子的一篇文章:http://www.cnblogs.com/dolphin0520/p/3811437.html 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法 ...

  6. Java面向对象---抽象类与接口

    final关键字 1.final关键字在java中被称为完结器,表示最终的意思: 2.final能声明类.方法.属性: 3.使用final声明的类不能被继承,使用final声明的方法不能被重写,使用f ...

  7. java 面向对象抽象类和接口

    1.abstract:可以修饰类和方法,被abstract修饰过的称为抽象类和抽象方法. 抽象类: 除了不可以创建对象, 其他和普通类一致. 可以有成员方法.静态方法和构造方法(提供给子类调用)等. ...

  8. JAVA面向对象 - 抽象类、接口

    抽象类 用abstract关键字来修饰一个类时,这个类就叫抽象类,用abstract关键字来修饰一个方式时,这个方法就是抽象方法.当一个类继承的父类是抽象类的话,需要我们把抽象类中的所有抽象方法全部实 ...

  9. Java面向对象之USB接口实例

    一.需求: 1.在电脑上设置一个USB接口. 2.电脑运行时,将鼠标连接到接口上,鼠标可以使用自己的功能. 3.电脑运行时,将键盘连接到接口上,键盘可以使用自己的功能.(使用接口的作用:减低鼠标.键盘 ...

随机推荐

  1. 【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。

    1.概述 Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code). 为了提高 ...

  2. angular中ngOnChanges与组件变化检测的关系

    1.ngOnChanges只有在输入值改变的时候才会触发,如果输入值(@Input)是一个对象,改变对象内的属性的话是不会触发ngOnChanges的. 2.组件的变化检测: 2a.changeDet ...

  3. scanf函数读取缓冲区数据的问题

    标准I\O的缓冲类型 标准I\O根据不同的应用需求,提供了全缓冲.行缓冲.无缓冲三种缓冲方式. 全缓冲:只有当划定的缓冲区被填满或者数据读取至末尾时,才开始执行I\O操作(执行系统提供的read\wr ...

  4. 解决Ubuntu启动错误——kernel panic not syncing vfs unable to mount root fs on unknown-block 0 0 – error

    最近在倒腾Ubuntu,然后想着怎么美化一下界面,于是照着网上的教程整了一下Flatabulous这个软件,然后好像/boot就满了.关机之后再开机就出现了如题所述的错误,无法开机,也无法进入reco ...

  5. 从源码看String,StringBuffer,StringBuilder的区别

    前言 看了一篇文章,大概是讲面试中的java基础的,有如题这么个面试题.我又翻了一些文章看了下,然后去看源码.看一下源码大概能更加了解一些. String String类是final的,表示不可被继承 ...

  6. os,操作文件和目录

    如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操 ...

  7. 极光IM简单接入步骤

    最近生接触了一下android,尝试导入极光的demo到android study 各种错误,然后下载极光生成的项目也是各种错误,感觉好像有点脱离时代了,记得以前用eclipse写android只需要 ...

  8. tensorflow节点布放(device assignment of node)算法:simpler_placer

    tensorflow v0.9中目前在用的devcie assignment算法是simple placer算法,相比于白皮书中cost model算法实现简单.simpler placer算法优先选 ...

  9. windows下3D文字

    windows下3D文字 简单概述 需要在每一帧的视频图像上面添加3D文字,文字可以自由移动位置,变换各种字体属性,还能进行一些简单动画.然后把处理好的视频图像传个下一个步骤去处理.做的过程中参考了G ...

  10. c#随便聊聊数据库操作

    最近在学习web后台以及Python,到了程序员的转折年纪了,哎.估计很久不会写博文了.言归正传. 在原理的数据库连接池HiKari项目上.我扩展了独立的3个库,说是3个库,其实原本该是一个库.先聊聊 ...