抽象类和抽象方法
1.抽象类的声明方法,在前面加上抽象类的关键词abstract
abstract class canine extends animal{
     public void roam(){}
}
抽象类除了被继承过之外,是没有用途,没有值,没有目的。类中的方法可以当做子类的合约内容,合约是对其他程序的承诺协议
抽象类中可以带有抽象和非抽象的方法
如果类中有抽象方法,则类必定标识为抽象的。
 
2.抽象的方法没有实体
(因为方法中的程序代码没有意义。抽象类需要被extend过有意义,抽象方法一定要被覆盖才有意义)
public abstract void eat();//没有方法体,直接分号结束
注意:声明的抽象方法必须在抽象类下,不允许非抽象类拥有抽象方法。
 
3.使用抽象类和抽象方法的好处
多态,使用父类参数作为方法的参数、返回类型或数组类型,这样不同的子类不用写很多种方法,多态的好处就是所有的子型都会有那种方法
 
Object类
java中所有的类都是从Object这个类继承出来的,Object不是抽象类。
 
1.Object类有两个目的
作为多态让方法可以应付多种类型的机制;
提供了部分方法的具体代码实现,使得任何类在执行期都有方法可用。
 
2.Object类作为终极对象,它具有哪些主要方法
equals(object o)//对象是否相等
getClass()//获得对象被初始化的类
hashCode()//获得对象的hash代码,唯一id
toString()//列出类的名字等信息
 
3.为什么不所有参数和返回类型都设定成Object
 
3.1java是类型检查很强的语言,编译器是根据引用类型来判断有哪些method可以调用。如果想调用子类中有父类中没有的方法,就不能用父类做引用变量。例如:
Object o=new ferry();
o.gofast();//非法,Object中没有这个方法。
 
3.2使用Object定义的变量返回的值也是Object类型的,将不能被赋值为其他类型的变量。
例如当把对象装进ArrayList<Object>时,不论它原来时什么类型,现在只能把它当作Object类型。这样你就只能使用Object的方法(当然可以使用强制转换来更改类型)
 
4.将Object转换为原来的类型
Object o =al.get(index);
Dog d=(Dog) o;//使用(Dog)进行强制转换
d.roam();
如果不确定对象是不是Dog,可以使用instanceof来判断类型,如果转换错误会抛出异常ClassCastException:
if(o instance Dog){
     Dog d=(Dog) o;
}
 
接口
接口是100%纯抽象的类(无法被初始化的类)。想要更好的使用多态需要接口。接口相当于一个规范,子类需要实现所有的方法。
 
1.为什么要有接口?
a.有些类不适合初始化,比如animal,而他的子类是可以被实例化的,比如dog。所以为了防止这个类被初始化(被new出来),通过标记类为抽象类来实现。抽象类不能被实例化,但是可以作为引用类型。
b.可以很好的解决java不能多重继承的问题,解决方法就是把所有方法都设为抽象的,让子类将所有的方法重写一遍。
(我理解的接口,定义一个抽象的合约规范,然后子类去实现这个接口的具体方法,这样子类肯定遵守来这个合约规范,更好的使用了多态)
 
2.接口的定义(使用关键字interface)
public interface pet{具体的abstract抽象方法,没有内容,直接分号结束,可以不写abstract关键词也是默认抽象的}
例如:
interface pet{
     String name=“cat”;
     void run();
     String jump();
}
 
说明:
a.public修饰符不是必填的,如果不写接口的权限为默认的public的abstract类
b.接口可以继承自其他接口
c.接口的方法也不用填写public等修饰符,默认public。且方法不需要写abstract关键词,也表示是一个抽象方法
d.接口的常量默认是public static final标志
 
3.接口的实现
public class dog extends canine implements pet{具体的接口实现,必须在这里实现接口下所有方法的实现,这是合约规定}
 
说明:
a.使用implements关键词来实现接口
b.如果既要继承父类又要实现接口,extends写在implements前面
c.一个类可以一次implements多个接口(使用逗号隔开),引用多个接口同名变量时使用接口名.常量来定义,如果是方法名同名,定义一个方法就可以了。
d.子类调用父类的方法,可以使用super.xxx();
e.UML类图使用虚线箭头表示接口的实现(箭头指向接口)也可以用圆圈表示;实线空心封闭箭头表示继承(箭头指向父类)[但是不知道为什么书上用的是实线箭头来表示的继承]
 
 
 

java基础三 [深入多态,接口和多态](阅读Head First Java记录)的更多相关文章

  1. java基础(三)-----java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  2. 1.Java基础-面向对象编程思想(封装继承多态接口)

    封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的 ...

  3. Java 基础三、接口与内部类

    1.   在Java程序语言中,接口是对类的一种描述.例如Arrays类中sort方法声明可以对对象进行排序,但前提是对象所属的类必须实现Comparable接口. public interface ...

  4. Java基础学习(四)-- 接口、集合框架、Collection、泛型详解

    接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写.   二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...

  5. java基础知识总结--继承和接口

    什么是继承?什么是接口?他们之间的区别和联系是什么? 什么是继承? 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能.多个类中存在相同属性和行 ...

  6. java基础(三):反射、反序列化破解单列模式和解决方式

    单例模式指的是一个类只有一个对象,通过一些措施达到达到这个目的.但是反射和反序列化可以获得多个不同的对象. 先简单的认识一下单例模式 一:单例模式 通过私有构造器,声明一个该类的静态对象成员,提供一个 ...

  7. Java基础(十一):接口

    一.接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是 ...

  8. java基础 三 概念和java程序的结构.

    一.java的一些概念: JRE(java  runtime environment):java程序运行环境,如果要运行java程序,需要jre支持.jre里包含jvm JDK(java  devel ...

  9. java基础(三) -基本数据类型

    变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义不同类型的变量,可以在内存 ...

随机推荐

  1. mac下安装apache tomcat

    目录 一. 默认版: 二. 自定义下载配置版: ———————————————————————正文—————————————————————————— 一. 默认版: ##一.mac 自带了apach ...

  2. The record of Rf module debugging (1)

    In order to improve engineering English writing ability,start from today,record my daily work of  el ...

  3. java IO 学习(二)

    文件表示形式的转换: 一.从系统文件变成java中可以使用的文件对象 File file = new FIle("文件的路径"); 二.读取文件系统中文件的原始字节流,要读取字符流 ...

  4. CF-1055E:Segments on the Line (二分&背包&DP优化)(nice problem)

    You are a given a list of integers a 1 ,a 2 ,…,a n  a1,a2,…,an and s s of its segments [l j ;r j ] [ ...

  5. Java读取txt文件信息并操作。

    一.java读取txt文件内容 import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.Fi ...

  6. endnote x7 破解版 关联word2010/2013

    方法/步骤   1 首先在已安装EndnoteX7的条件下,打开word2013在工具栏上方未见“EndnoteX7”标识,则需要将两者关联. 2 打开word左上角的“文件”,然后点开“选项” 3 ...

  7. 20165212 2017-2018-2《Java程序设计》课程总结

    20165212 2017-2018-2<Java程序设计>课程总结 作业链接汇总 每周作业链接 预备作业1:我期望的师生关系 预备作业2:做中学learning by doing个人感想 ...

  8. streamsets Executors 说明

    执行程序阶段在收到事件时触发任务.执行者不会写入或存储事件. 将执行程序用作事件流中数据流触发器的一部分,以执行事件驱动的与管道相关的任务,例如在目标关闭时移动完全写入的文件. 可以使用的execut ...

  9. 获取 graphql schema 信息

    模块 npm install -g get-graphql-schema get-graphql-schema GRAPHQL_URL > schema.graphql 简单使用 使用prism ...

  10. docker默认配置文件不存在问题解决

    Docker默认的配置文件/etc/default/docker或者/etc/sysconfig/docker都不起作用,查看了一下/lib/systemd/system/docker.service ...