接口是什么?它是一种百分之百纯抽象的类。
什么是抽象类?即无法初始化的类。
 
例如,我们设计一个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. Eclipse免reload设置

    在使用eclipse开发web项目的时候,有的时候需要通过运行看结果,但是如果项目很大,你改一句代码,也许就要重启一次,或者eclipse自动帮你reload,这样严重的影响开发的效率,这里只要修改一 ...

  2. vector array and normal stanard array

    array 数组的长度固定 vector 自由存储区(栈),动态长度 普通标准数组相对较不安全,不方便; array,vector对象成员函数支持数组越界检测,同时代价是效率问题: array,普通标 ...

  3. 温故而知新-WebSocket 教程

    一.为什么需要 WebSocket? 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有 ...

  4. Django的contenttypes应用、缓存相关

    一.django的contenttypes contenttypes 是Django内置的一个应用 , 可以追踪项目中所有app 和 model 的对应关系, 并记录djang_content_typ ...

  5. DDoS攻防战 (四):CC攻击防御系统部署

    1. 系统效果 此DDOS应用层防御系统已经部署在了http://www.yfdc.org网站上(如果访问失败,请直接访问位于国内的服务器http://121.42.45.55进行在线测试). 此防御 ...

  6. linux开机自检配置文件fstab变只读无法修改问题

    控制linux开机自检的配置文件是/etc/fstab,在最近用的服务器中,发现fstab变成了只读权限,无法修改. 解决方法:RH5下,因磁盘改变,而导致系统停在Ctrl+d,此时需输入密码进入修改 ...

  7. 配置siebel捕捉SQL语句

    C:\Siebel\15.0.0.0.0\Client\BIN\siebel.exe /c c:\Siebel\15.0.0.0.0\Client\bin\chs\siebel.cfg /B &quo ...

  8. Codeforces 1154F (DP)

    题意:有一个人去买铲子,他需要买正好k把.每把铲子有个标价,并且每把铲子最多只能被买一次.有m种优惠方案,每个优惠方案xi, yi是指如果这次恰好购买了xi把铲子,那么这次购买的铲子中最便宜的yi把将 ...

  9. 登录模块(前端bookstrapValidator校验+加密+后台加密+后台验证)

    package sysone.zr.com.controller; import java.io.IOException; import javax.servlet.http.HttpServletR ...

  10. spring+springmvc+mybatis+redis实现缓存

    先搭建好redis环境 需要的jar如下: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:330 ...