接口是什么?它是一种百分之百纯抽象的类。
什么是抽象类?即无法初始化的类。
 
例如,我们设计一个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. ansible自动化运维工具使用详解

    一. ansible 简介 1. ansible ansible是新出现的 自动化 运维工具 , 基于Python研发 . 糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行 ...

  2. centos 6.3 kickstart 装机卡在 unsupported hardware detected 页面

    起因 最近厂里一批 dell 新机器 centos 6.3 装机卡在 Unsupported Hardware Detected 页面,要人肉点击 OK 才能继续装机: Unsupported Har ...

  3. CentOS7.6安装Maven

    官网下载地址:http://maven.apache.org/download.cgi 第一步:软件下载安装 进行安装目录:cd /opt/software (如果目录不存在,请先创建目录) 下载二进 ...

  4. 自适应共振理论网络 ART

    引言 自适应共振理论的发源与现状 1976年, 美国 Boston 大学学者 G. A.Carpenter 提出自适应共振理论(Adaptive Res-onance Theory , ART ), ...

  5. Splash Screen 加载窗体 [not finished]

    对于windows开 发人员来说在打开VS开发工具时,总是先呈现一个SplashScreen界面,登上几秒钟后才打开VS的主界面.这样的效果一般是在主界面需要加载大量 资源,为避免主界面变成“死”界面 ...

  6. leetcode445

    /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNo ...

  7. 使用PowerMap生成地图图文

    地区    GDP(亿)广东省    80854江苏省    77388山东省    68024浙江省    47251河南省    40471四川省    32934湖北省    32665河北省  ...

  8. Tornado 多进程 & 异步

    另外一篇:http://www.cnblogs.com/xiaoshi657/p/6945208.html 基本版: #coding=utf-8 import tornado.web import t ...

  9. 【Django】uWSGI和Gunicorn【转】

    因为nginx等优秀的开源项目,有不少本来不是做服务器的同学也可以写很多服务器端的程序了.但是在聊天中会发现,大家虽然写了不少代码,但是对wsgi是什么,gunicorn是什么,反向代理又是什么并不了 ...

  10. C++ new到底new什么

    VS2010-Debug版本 9: int *obj = new int(6); 00F714CE push //压栈 00F714D0 call operator new (0F711EAh) // ...