抽象类和抽象方法
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. Python itertools.combinations 和 itertools.permutations 等价代码实现

    最近编程时经常要用到排序组合的代码,想当年还抱着一些情况买了一本<组合数学>,不过现在这货也不知道被自己放哪里了,估计不会是垫桌子腿了吧. 由于去年去东北大学考博面试的时候遇到过可能涉及排 ...

  2. python中的运算符优先级(其它语言也试用)

  3. jenkins执行shell命令,有时会提示“Command not found”

    这个问题其实就是环境变量没有配准确 (1)检查你在Jenkins中设置的maven是否准确,可以通过[new job]按钮查看新建job中是否有maven选项,没有就是你配置的不准确 如果你下载的插件 ...

  4. HDU 2050:折线分割平面

    折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. java之美妙的注解

    注解 一.认识注解 先看百度百科对java注解的解释: 定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它 ...

  6. postgresql PL/pgSQL—存储过程结构和变量声明

    ref: https://www.postgresql.org/docs/9.6/static/plpgsql-structure.html 一. 函数结构 CREATE FUNCTION somef ...

  7. centos 安装tomcat 7为服务

    3:安装Tomcat 下载apache-tomcat-7.0.33.tar.gz.解压缩: tar -xzvf apache-tomcat-7.0.33.tar.gz 将解压缩后的文件夹拷贝到/usr ...

  8. python 书籍推荐 二

    Python是一中面向对象的编程语言,语法简洁而清晰,具有丰富和强大的类库.对于初学编程者来说,首选Python是个非常棒的选择.   工具/原料 Python Python学习前的准备 1 学习任何 ...

  9. Erlang process structure -- refc binary

    Erlang 的process 是虚拟机层面的进程,每个Erlang process 都包括一个 pcb(process control block), 一个stack 以及私有heap . 这部分的 ...

  10. .NET后台访问其他站点代码整理

    HttpWebRequest request = WebRequest.Create(@"http://localhost:8080/mail/SendMail") as Http ...