首页 > 编程语言 >Head First Java 读书笔记

Head First Java 读书笔记

时间:2022-11-06 19:36:15浏览次数:38  
标签:Head Java 读书笔记 Object dog 接口 抽象 抽象类 方法

第8章:接口与抽象类(深入多态)

什么是抽象类?

用abstract关键字声明抽象类,抽象类不能用new 关键字进行实例化。在设计继承结构时,必须决定清楚什么类是抽象类,什么类是具体类。编译器不会让你初始化一个抽象类。抽象类,除了被继承以外,是没有其它任何用途的。抽象类中,必须包含有抽象方法,还可以包含非抽象方法。

什么是抽象方法?

即用 abstract关键字声明的方法,抽象方法没有方法实体,即没有具体的实现过程。拥有抽象方法的类,必须声明为抽象类。抽象类中的抽象方法,用于规定一组子类共同的协议。

abstract class Animal {
// 抽象方法,没有方法体
public abstract void eat();
}

在继承过程中,具体类必须实现抽象父类的所有抽象方法

抽象方法没有具体的方法体,它只是为了标记出多态而存在。在覆写抽象父类的抽象方法时,方法名、参数列表必须相同,返回值类型必须兼容。Java很在乎你是否实现了抽象类的抽象方法。public class Canine extends Animal {

// 覆写抽象类的抽象方法

public void eat() {

System.out.println("Canine,会吃食物!!");

}

// 非继承的方法

public void roam() {

}

}

多态的使用

在java中,所有类都是从Object这个类继承而来的,Object是所有类的源头,它是所有类的父类。Object有很有用的方法,如 equals(), getClass(), hashCode(), toString()等。

Object类,是抽象类吗? 答:不是,它没有抽象方法。

是否可以覆写Object中的方法? 答:Object类中带有 final关键字的方法,不能被覆写。

Object类有什么用? 答:用途一,它作为多态可以让方法应付多种类型的机制,以及提供Java在执行期对任何对象都需要的方法实现。另一个用途,它提供了一部分用于线程的方法。

既然多态类型这么有用,为什么不把所有的参数类型、返回值类型都设定为Object? 答:因为Java是强类型语言,编译器会检查你调用的是否是该对象确实可以响应的方法。即,你只能从确实有该方法的类中去调用。Object dog = new Dog();dog.toString(); // 这可以通过编译,因为toString()是Object类中自有的方法。dog.eat(); // 这将无法通过编译,因为dog是Object类型,它调用的eat()方法在Object类中没有。

Object dog = new Dog();
dog.toString(); // 这可以通过编译,因为toString()是Object类中自有的方法。
dog.eat(); // 这将无法通过编译,因为dog是Object类型,它调用的eat()方法在Object类中没有。

什么是接口?

接口,是一种100%纯抽象的类。接口中的所有方法,都是未实现的抽象方法。

为什么需要接口?接口存在的意义,就是为了解决Java多重继承带来的致命方块问题。为什么接口可以解决致命方块的问题呢?因为在接口中,所有方法都是抽象的,如此一来,子类在实现接口时就必须实这些抽象方法,因此Java虚拟机在执行期间就不会搞不清楚要用哪一个继承版本了。

如何判断应该是设计 类、子类、抽象类、还是接口呢?

如果新的类无法对其它的类通过 IS-A 测试时,就设计成不继承任何类的类。

只有在需要某个类的特殊化版本时,以覆写或增加新的方法来继承现有的类,得到子类。

当你需要定义一群子类的模板,又不想让程序员初始化该模板时,就设计出抽象类。

如果希望类可以扮演多态的角色,就设计出完全抽象的接口。

super关键字代表什么?super代表父类,在子类中使用 super关键字指代父类,通过super还可以调用父类的方法。

标签:Head,Java,读书笔记,Object,dog,接口,抽象,抽象类,方法
From: https://www.cnblogs.com/LvJinshuai/p/16863479.html

相关文章

  • JAVA的File对象
    文件1.File对象  java封装的一个操作文件及文件夹(目录)的对象。可以操作磁盘上的任何一个文件和文件夹。2.创建文件 方式一:根据路径构建一个File对......
  • 通过 SAP UI5 ODataModel API 在 JavaScript 代码里访问 OData 元数据试读版
    在本教程第24个步骤里,我们介绍了SAPUI5OData模型最基本的使用方法:SAPUI5应用开发教程之二十四-如何使用OData数据模型我们通过urlhttp://localhost:8080/w......
  • Java爬虫工具Jsoup使用Demo
    导入依赖<dependencies><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.13.1</v......
  • [Java反序列化]JavaCC链学习(8u71前)
    文章目录​​写在前面​​​​前置​​​​Transformer​​​​TransformedMap​​​​ChainedTransformer​​​​InvokerTransformer​​​​ConstantTransformer​​​​......
  • Java 线程池之ThreadPoolExecutor学习总结
    前提javaversion"1.8.0_25"池简述软件开发活动中,我们经常会听到数据库连接池、内存池、线程池等各种“池”概念,这些“池”到底是什么东西呢?程序的世界里,我们可以将池简单......
  • Java 线程池之ThreadPoolExecutor学习总结
    前提javaversion"1.8.0_25"池简述软件开发活动中,我们经常会听到数据库连接池、内存池、线程池等各种“池”概念,这些“池”到底是什么东西呢?程序的世界里,我们可以将池简单......
  • JavaScript 学习-50.实现页面菜单拖放(Drag 和 Drop)
    前言拖放是一种常见的操作,即抓取对象以后从一个位置拖到另一个位置。在HTML5中,拖放是标准的一部分,任何元素都能够拖放。拖放(Drag和Drop)在拖曳操作中,被拖曳的元素称做源......
  • Java学习File类的判断和获取功能
    方法名说明publicbooleanisDirectory()测试此抽象路径名表示的File是否为目录publicbooleanisFile()测试此抽象路径名表示的File是否为文件publicbooleanexists()测试......
  • 自学Java的学习步骤与基本态度
     一般来说,刚开始学Java,需要掌握的基础并没有那么多,但是却需要牢牢掌握。如:Java数据类型、String基本类型封装类、MySQL等基础知识,属于必备技能,不论你是什么目的学习Java,此......
  • PyCharm在Linux安装出现报错-Java Runtime (class file version 55.0)
        在Linux桌面下安装PyCharm的时候出现如下报错root@ubuntu:~#cdpycharm-community-2021.1.1root@ubuntu:~/pycharm-community-2021.1.1#lsbinclas......