抽象类和抽象方法
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. <NET CLR via c# 第4版>笔记 第10章 属性

    10.1 无参属性 10.1.1 自动实现的属性 10.1.2 合理定义属性 属性可以只读或只写,而字段访问总是可读和可写的(一个例外是 readonly 字段仅在构造器中可写). 属性方法可能抛出异 ...

  2. 一个简单的观察者模式的JS实现

    这不是原创文章,主要是写给自己看的.原文比较详细容易让人,我提取最简单最好理解的部分,便于我以后用到.参考http://www.cnblogs.com/TomXu/archive/2012/03/02 ...

  3. 20155224 2016-2017-2 《Java程序设计》第8周学习总结

    20155224 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 第十四章 NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以设定缓冲区 ...

  4. CMS初步认识

    一CMS本质 [1]基本思想是:分离内容的管理和设计,页面显示的风格和框架存储在模板里.至于页面显示的内容存储在数据库中或一个独立的文件中.当一个用户请求页面时,各部分联合生成一个标准的 HTML 页 ...

  5. web应用中Filter过滤器之开发应用

    1 过滤器的简单开发应用部署 首先讲解过滤器的开发部署运行基本流程,在这里先通过一个简单的示例: 1)编写过滤器类 编写一个简单的过滤器类:SimpleFilter,实现Filter接口,完整的代码为 ...

  6. 指向NULL的类

    引出:写个类A,声明类A指针指向NULL,调用类A的方法会有什么后果,编译通过吗,运行会通过吗? (在VS2008与VC++的情况下) 有错误欢迎批评指正! #include<stdio.h&g ...

  7. 【python】函数名存在变量中

    变量函数:意思就是将函数名存在变量中,然后根据变量值动态的调用需要的函数. LOGIN = 'xxxx' PASSWD = "xxx" URL = 'xxxxx' def hand ...

  8. vim之vundle

    git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle,下载到本地 gvim ~/.vimrc set nocompat ...

  9. Java 正则表达式详细实例解析

    案例1:判断字符串是否是abc package Regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * ...

  10. HDU 2516 取石子游戏(斐波那契)

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...