1.抽象类和抽象方法

抽象方法:不完整的,仅有声明而没有方法体。

   abstract void f();

抽象类:包含抽象方法的类。(若一个类包含一个或多个抽象方法,则该类必须限定为抽象的。)

1.用抽象类直接创建对象是不安全的,因为这个抽象类是不完整的。编译器通过这种方式保证了
抽象类的纯粹性。

public abstract class Person {
public abstract void eat();
public abstract void pee();
public abstract void sleep();
} //不能直接用抽象类创建对象
//Person p = new Person();//错误

2.一个类从抽象类中继承,若想创建改类的对象,就必须实现基类中的所有抽象方法。否则将无法创建该类的对象,
并且导出类也是抽象类。

//一个类继承自抽象类,必须实现这个抽象类中的所有抽象方法
public class Male extends Person {
@Override
public void eat() {
System.out.println("Male eat a lot!");
} @Override
public void pee() {
System.out.println("Male pee by standing up");
} @Override
public void sleep() {
System.out.println("Male sleep");
}
} //创建改导出类的对象
Person p = new Male();

3.可以创建一个没有任何抽象方法的抽象类。(若有这样一个类,包含任何抽象方法都显得没有实际意义,而且我们也想阻止产生这个类的任何对象)

4.抽象类并不需要所有的方法都是抽象的。

作用:
1.明确类的抽象性,并告诉用户和编译器打算怎样来使用它们。
2.抽象类是很有用的重构工具,使我们能很容易的将公共方法沿着继承层次向上移动(也就是将公共方法抽取重构到抽象类中)

2.接口

interface关键字使抽象更进一步,产生一个完全抽象的类,没有提供任何具体的实现。(只有方法名,参数列表和返回类型,没有任何方法体。接口只提供了形式,而未提供任何具体实现)

public interface People {
void eat();
void sleep();
void pee();
}

一个接口表示:“所有实现了该特定接口的类看起来都像这样”

接口被用来建立类和类之间的协议(protocol)

接口不仅仅是一个极度抽象的类,因为接口允许我们通过创建一个能够被向上转型为多种基类的类型
来实现类似于多重继承的特性。(Java只支持单继承,但可以通过实现接口来达到多继承的效果)

接口中可以包含域,但是这些域隐式地是static和final的。

使用implements关键字让一个类遵循某个接口(或是一组接口)。它表示:"接口只是它的外貌(what it looks like),我们用类实现接口来声明它是如何工作的(how it works)"

3.完全解耦

    • 策略设计模式: 创建根据所传递的参数对象的不同而具有不同的行为的方法(这类方法包含所要执行的算法中
      固定不变的部分,而策略包含变换的部分,策略就是传递进去的参数对象)

    • 适配器设计模式: 适配器中的代码将接受所拥有的接口,并产生所需要的接口。
      将接口从具体实现中解耦使得接口可以应用于多种不同的具体实现,因此代码也就更具复用性。

 4.抽象类和接口的区别

尽管接口和抽象类看起来很是相似,但他们之间还是存在很多的不同点. 
(1).抽象类毕竟还是类,所以用class关键字声明然后用extends关键字继承.接口用interface声明,implements继承. 
(2).接口中方法权限必须是public,变量是static final型常量;抽象类中的方法权限可以自己设定,变量也一样. 
(3).接口中的所有方法都必须是抽象的而抽象类中可以是抽象的也可以是普通的. 
(4).最后也是最重要的一点区别是:接口支持多重继承而抽象类是不可以的!这一点带来的一个好处就是,我们能够将一个类向上转型成多个基类.

 转载: http://www.cnblogs.com/JohnTsai/p/4659400.html

Java编程思想学习(七) 抽象类和接口的更多相关文章

  1. Java编程思想学习(八) 内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类的定义是简单的,但是它的语法确实很是复杂,让人不是很好理解.下面就内部类做一个小结. 一.内部类的分类 总的来讲内部类分为普通内部类,匿 ...

  2. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  3. Java编程思想学习(一)----对象导论中多态的理解

    1.1抽象过程 1)万物皆对象. 2)程序是对象的集合,他们通过发送消息来告知彼此所要求做的. 3)每个对象都有自己的由其他对象所构成的存储. 4)每个对象都拥有其类型. 5)某一特定类型的所有对象都 ...

  4. java编程思想--学习心得

    学习Java编程思想,需要了解语言特性,对于各种名词,能够借助项目代码,解释其含义,不借助搜索工具,明白其在什么样场景下使用,会带来什么样的问题,能否避免这类问题. 学习的过程,与软件开发相同,一样是 ...

  5. Java编程思想学习笔记——接口

    1.抽象类和抽象方法 抽象方法:不完整的,仅有声明而没有方法体. abstract void f(); 抽象类:包含抽象方法的类.(若一个类包含一个或多个抽象方法,则该类必须限定为抽象的.) 1.用抽 ...

  6. Java编程思想 学习笔记1

    一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...

  7. [Java编程思想-学习笔记]第1章 对象导论

    1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...

  8. Java编程思想 学习笔记11

    十一.持有对象  通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...

  9. Java编程思想 学习笔记7

    七.复用类 1.组合语法 在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法叫做组合. 类中域为基本类型时能够自动被初始化为零.对象引用被初始化为null. 编译器不是简单地为 ...

随机推荐

  1. 2014 UESTC 暑前集训队内赛(3) 部分解题报告

    B.Battle for Silver 定理:完全图Kn是平面图当且仅当顶点数n<=4. 枚举所有完全图K1,K2,K3,K4,找出最大总权重. 代码: #include <iostrea ...

  2. React 之 Hello world

    一入react深似海,从此学习为常态,react 成为了一种趋势,很多人应该很多人准备进坑,下面对react进行简单的描述: 首先学习react,要有多方学习的准备,例如:Webpack, Babel ...

  3. Android系列之Fragment(二)----Fragment的生命周期和返回栈

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件

    字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...

  5. 关于tcpdump抓包一个很详细的介绍

    http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

  6. mybatis order by绑定的参数

    <select id = "queryByStartWithOrder" resultType="org.seckill.entity.SuccessKilled& ...

  7. angularjs: ng-select和ng-options

    angular.js有一个很强大的指令: ng-select 它可以帮助你通过数据模型来创建select元素.它很好的支持了select标签的语法,但是却有点坑. 假设有如下一段json数据: { & ...

  8. 关于audio元素在实际项目中遇到的问题总结

    在ios高版本的微信浏览器下(ios10.0以上),audio标签如果添加autoplay属性的话.导致的问题是:通过二维码扫码第一次进入没有问题,第二次扫码进入之后直接卡死在loading页面. 解 ...

  9. 11Spring_AOP编程(AspectJ)_概述

    AspectJ 是一个框架 (第三方AOP框架 ),提供切面编程 ,编写一个Aspect 支持多个Advice和多个PointCut .对比前一种提到的传统的Aop编程,AspctJ更加的常用.Asp ...

  10. usb驱动开发7之接口描述符

    前面struct usb_interface里表示接口设置的struct usb_host_interface被有意的飘过了,咱们在这节主要讲讲这个结构体,同样在include/linux/usb.h ...