接口是什么?它是一种百分之百纯抽象的类。
什么是抽象类?即无法初始化的类。
 
例如,我们设计一个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. Linux 之rsyslog+LogAnalyzer 日志收集系统

    一.LogAnalyzer介绍 LogAnalyzer工具提供了一个易于使用,功能强大的前端,用于搜索,查看和分析网络活动数据,包括系统日志,事件日志和其他许多日志源.由于它只是将数据展示到我们用户的 ...

  2. Vue源码(一)

    入口文件 src/core/instance/index.js 中可以看到 function Vue (options) { if (process.env.NODE_ENV !== 'product ...

  3. Android屏幕适配方案——基于最小宽度(Smallest-width)限定符

    转自:https://www.cnblogs.com/error404/p/3815739.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_ ...

  4. nginx 1.12 配置解析php

    server { listen 80; server_name foo.com; root /path; index index.html index.htm index.php; location ...

  5. C#实现并口输出输入高低电位

    PC并行口各阵脚定义: 1.选通,PC->Printer 2-9 数据(D0-D7) 10.应答(ACK),Printer->PC 11.忙(BUSY),Printer->PC 12 ...

  6. 用python3判断一个字符串 包含 中文

    在python中一个汉字算一个字符,一个英文字母算一个字符 用 ord() 函数判断单个字符的unicode编码是否大于255即可. s = '我xx们的88工作和生rr活168' n = 0 for ...

  7. F5负载均衡架构图

    原文:https://blog.csdn.net/qq_35611533/article/details/51917279?locationNum=1&fps=1

  8. Volatile关键字以及线程的内存可见性问题

    一.Volatile关键字 作用: 当多个线程进行操作共享数据时,可以保证内存中的数据可见,即为一个线程对数据的修改对另外一个线程来说是可见的.相较于 synchronized 是一种较为轻量级的同步 ...

  9. CyclicBarrier的使用

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆,如果有什么错误或者不当的地方,欢迎大家斧正. CyclicBarrier是一种多线程并发控制实用工具,和Count ...

  10. springboot启动过程(3)-refresh方法

    1  springboot在启动的时候,会调用run方法,创建环境设置spring容器,其中包含refresh方法,完成配置类解析,各种beanFactoryPostProcess和beanPostP ...