接口是什么?它是一种百分之百纯抽象的类。
什么是抽象类?即无法初始化的类。
 
例如,我们设计一个animal类,以此类为父类,分别设计了多种动物子类,例如Lion,Tiger,Cat,Wolf,Dog类。
 
Wolf aWolf = new Wolf();

Animal aHippo = new Hippo();

以上都是正确,而下面这句代码就有问题了。

Animal anim = new Animal();
 
注意:有些类是不应该被初始化的,就是这些类不能被"new"出来。
通过标记类为抽象类,编译器就知道不管在哪里,这个类就是不能创建任何类型的实例。
 
设计继承结构时,就要确定哪些类是抽象的,而哪些是具体的,具体的类是实际可以被初始化为对象的。
 
虽然抽象类不能创建实例,但是还是可以使用抽象类来声明为引用类型给多态使用。
 
抽象的方法
除了类之外,你也可以将方法标记为abstract。抽象的类代表此类必须要被extend过,抽象的方法代表此方法一定要被覆盖过。
抽象的方法没有实体!
如果你声明出一个抽象的方法,就必须将类也标记为抽象的。不能在非抽象类中拥有抽象方法。
 
问:为什么要有抽象的方法?我认为抽象类的重点就在于可以被子类继承的共同程序代码。
答:将可继承的方法体(也就是有内容的方法)放在父类中是个好主意,但有时就是没有办法作出给任何子类都有意义的共同程序代码。抽象方法的意义是就算无法实现出方法的内容,但还是可以定义出一组子类共同的协议。
问:这样做的好处是....?
答:就是多态!记住,你想达成的目标是要使用父型作为方法的参数,返回类型,或数组的类型。通过这个机制,你可以加入新的子型到程序中,却又不必重写或修改处理这些类型的程序。因此多态的好处就在于所有子型都会有那些抽象的方法。
 
你必须实现所有抽象的方法
实现抽象的方法就如同覆盖过方法一样
抽象的方法没有内容,它只是为了标记出多态而存在。
这表示在继承树结构下的第一个具体类必须要实现出所有的抽象方法。
 
要记得抽象类可以带有抽象和非抽象的方法。当我们说到"你必须实现所有抽象的方法"时,表示说你必须写出内容。
 
对象之母:Object
在java中的所有类都是从Object这个类继承出来的。
没有直接继承过其他类的类会是隐含的继承对象。
 
Object中有什么?

对象与抽象类
 
可以覆盖过Object的方法?
部分可以。但是有些被标记final,这代表你不能覆盖掉它们。强烈建议用自己写的类去覆盖掉hashCode(),equals(),toString()。
 
所以Object的主要目的是提供多态的参数与返回类型吗?
这个Object类有两个主要目的:作为多态让方法可以应付多种类型的机制,以及提供java在执行期对任何对象都有需要的方法的实现程序代码。
 
 
ArrayList<Object> myDogArrayList = new ArrayList<Object>();
Dog aDog = new Dog();
myDogArrayList.add(aDog); 当运行以下代码时:
Dog d = myDogArrayList.get(0);
无法通过编译,调用get方法会返回Object类
任何从ArrayList<Object>取出的东西都会被当作Object类型的引用而不管它原来是什么。
 

 
“多态”意味着“很多形式”
当你把对象装进ArrayList<Object>时,不管它原来是什么,你只能把它当作是Object。
从ArrayList<Object>取出引用时,引用的类型只会是Object。
这代表你只会取得Object的遥控器。
 
接口(interface)可以用来解决多重继承的问题
java的接口就好像100%的纯抽象类,所有接口的方法都是抽象的。
 
要点:
  • 如果不想让某个类被初始化,就以abstract这个关键词将它标记为抽象的。
  • 抽象的类可以带有抽象和非抽象的方法。
  • 如果类带有抽象的方法,则此类必定标识为抽象的。
  • 抽象的方法没有内容,它的声明是以分号结束。
  • 抽象的方法必须在具体的类中运行。
  • java所有的类都是Object直接或间接的子类。
  • 方法可以声明Object的参数或返回类型。
  • 不管实际上所引用的对象是什么类型,只有在引用变量的类型就是带有某方法的类型时才能调用该方法。
  • Object引用变量在没有类型转换的情况下不能赋值给其他的类型,若堆上的对象类型与所要转换的类型不兼容,则此转换会在执行期产生异常。
  • 从ArrayList<Object>取出的对象只能被Object引用,不然就要用类型转换来改变。
  • java不允许多重继承
  • 接口就好像是100%纯天然抽象类
  • 以interface这个关键词取代class来声明接口
  • 实现接口时要使用implements这个关键词。
  • class可以实现多个接口
  • 实现某接口的类必须实现它所有的方法。
  • 要从子类调用父类的方法可以用super这个关键词来引用。

【Head First Java 读书笔记】(八)接口与抽象类的更多相关文章

  1. 1)Java学习笔记:接口和抽象类的异同

    Java接口和抽象类很像,他们有哪些相同点和异同点呢,下面我们做一个小结 相同 ① 都不能被实例化,都位于继承树的顶端,用于被实现或者继承 ② 都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必 ...

  2. Java 读书笔记 (八) 修饰符

    Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 访问控制修饰符 default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符.使用对象.类.接口.变量.方法. ...

  3. Java学习笔记之接口和抽象类

    接口(interface)1.interface创建一个接口,implements实现接口 interface jiekou{} class lie implements jiekou{}2.接口可以 ...

  4. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

  5. think in java 读书笔记 3 —— 数据报

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...

  6. think in java 读书笔记 2 —— 套接字

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 套接字基本知识 2 ...

  7. think in java 读书笔记 1 ——移位

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...

  8. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  9. [Effective Java 读书笔记] 第三章类和接口 第十八--十九条

    十八条 接口优于抽象类 接口的特点: 1.一个类可以实现多个接口,不能继承多个类(抽象类) 2.接口不能有具体的方法实现,只定义标准类型 骨架类: 即实现一个abstract类来实现接口,提供给其他类 ...

随机推荐

  1. mysql连接慢,修改配置文件

    修改配置 port= skip-locking skip-name-resolve

  2. Git学习之常用的命令

    配置git git config --global user.name "你的github用户名" git config --global user.email "你的G ...

  3. springmvc 使用ajx上传文件 不设置form enctype

    最近在做一个小项目 碰到这个问题 解决方案如下 1.js代码如下 获取当前form 转换为formdata ajax提交到后台 var form = $("#importForm" ...

  4. 阅读《名师讲坛--Android开发实战经典》

    一,专心,快速阅读一本书,直到深入理解,把书读厚,再读薄,你定会有收获. 二,20171214开始阅读<名师讲坛--Android开发实战经典>,但愿自己有所收获.从今天开始养成刻录学习写 ...

  5. Mellanox infinoband RDMA SDP

    IPoIB Internet Protocol over InfiniBand 就是指利用物理IB网络(IB卡,线缆,交换机,更甚者IB3层交换)通过ip协议进行连接,并进行数据传输! SDP Soc ...

  6. swagger 接口文档,控制器 和 object类型的参数与返回值 的 注释不显示问题

    一.控制器的注释不显示:是因为配置swagger的时候没有将includeControllerXmlComments参数配置为true,因为其默认值为false 二.object 类型的参数和返回值 ...

  7. leetcode513

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  8. malloc()与calloc区别 (转)

    另外说明: 1.分配内存空间函数malloc 调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域.函数的 ...

  9. VS2017更新后 在WIN7上找不到 stdio.h等的问题

    项目->属性->配置属性->常规->windows SDK版本.将其换成你现在的版本即可解决问题,如果不行就重新下个最新版SDK,如WIN10的.

  10. Dreamweaver安装与破解

    1.下载Dreamweaver cs6破解版解压包 打开下载网址http://pan.baidu.com/s/1jGr8pbK,点击下载,保存到自己想要保存的位置. 2.下载Dreamweaver c ...