1、超类和子类

超类和子类

父类与子类

多态:

一个对象变量可以指示多种实际类型的现象称为多态

一个变量可以引用父类对象,也可以引用其子类对象,这就是多态。

不能将一个超类的引用赋给子类变量,因为调用子类方法时可能发生运行错误

子类引用可以赋给超类引用

动态绑定:

在运行时能够自动地选择哪个方法的现象称为动态绑定

是一个非常重要的特性,无需对现存的代码进行修改,就可以对程序进行扩展。

阻止继承:final类和方法

将方法和类声明为final主要目的是:确保它们不会在子类中改变语句

强制类型转换

只能在继承层次内进行类型转换。

在将超类转换成子类之前,应该使用instanceof进行检查。

抽象类

使用abstract关键字,这样就完全不需实现这个方法。

为了提高程序清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的

除了抽象方法外,抽象类还可以包含具体数据和具体方法。

尽量将通用的域和方法(不管是否是抽象的)放在超类(不管是否是抽象类)中

扩展抽象类

1 子类中定义部分抽象方法或抽象方法也不定义,这样就必须将子类也标记为抽象类

2 定义全部的抽象方法,子类就不是抽象的了

抽象类不能被实例化 (不能new)这个类的对象

可以创建一个具体子类的对象,可以定义一个抽象类变量,但是它只能引用非抽象子类的对象。

受保护访问

private 子类不能访问超类的私有域,

protected 允许子类访问超类的某个域

2、Object:所有类的超类

Object是Java的始祖,在Java中每个类都是由它扩展而来

可以使用Object类型的变量引用任何类型的对象

eqluas方法

  用于检测一个对象是否等于另一个对象,在Object类中,这个方法将判断两个对象是否具有相同的引用。

  在子类中定义equals方法时,首先调用超类的equals。如果检测失败,对象就不可能相等。

  如果超类中的域都相等,就需要比较子类中的实例域。

相等测试与继承

  Java语言规范要求equals方法具有下面的特性:

自反性:x.eqluas(x) 返回true

对称性:当且仅当x.eqluas(y) 返回true,y.eqluas(x)返回true

传递性:如果x.eqluas(y)返回true,y.eqluas(z)返回true,x.equlas(z)也应该返回true

一致性:如果x,y引用的对象没有发生变化,反复调用x.eqluas(y)应该返回同样的结果

对于任意非空引用x,x.eqluas(null) 应该返回false

对称性,instanceof 子类与超类的比较

  • 如果子类能够拥有自己的相等概念,则对称性需求将强制采用getClass进行检测
  • 如果由超类决定相等的概念,那么就可以使用instanceof进行检测,这样可以在不同子类的对象之间进行相等的比较。

编写一个完美的equals方法的建议:

1 显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量

2 检测this 与 otherObject是否引用同一个对象:

if(this == otherObject) return true;

3 检测otherObject是否为null,如果是null ,返回false

if(otherObjecr == null) return false;

4 比较this 与 otherObject是否属于同一个类。

  如果equals的语义在每个子类中所改变,就使用getClass检测

  if(getClass != otherObject.getClass()) return false;

  如果所有的子类都拥有统一的语义,就使用instanceof检测

  if(!otherObject instanceof ClassName) return false;

5 将otherObject转换为相应的类类型变量

ClassName other = (ClassName)otherObjecrt;

6 现在开始对所有需要比较的域进行比较了。使用==比较基本类型域,使用equals比较对象域。

如果在子类重新定义equals,就要调用super.equlas(other);

hashCode方法

散列码(hashCode)是由对象导出的一个整数值。

hashCode定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储位置。

如果重新定义equals方法,就必须重新定义hashCode方法,以便用户可以将对象插入到散列表中

toString方法

3、泛型数组列表

访问数组列表对象

ArrayList<T>

不必指出数组的大小

使用add将任意多的元素添加到数组

使用size()替代length计算元素的数目

使用a.get(i)替代a[i]访问元素

4、对象包装器与自动装箱

基本类型 转换为 对象

5、参数数量可变的方法

省略号...是Java代码的一部分,它表明这个方法可以接收任意数量的对象

6、枚举类

Enum

7、反射

反射机制:

在运行中分析类的能力

在运行中查看对象

实现通用的数组操作代码

利用Method对象

Class类

 Class.forName().newInstance();

捕获异常

  try catch

利用反射分析类的能力

  Field Method Constructor

  三个类都有

  getName返回项目的名称

  getModifiers 返回一个整型数值,描述修饰符

  Field getType 返回描述域所属类型的Class对象

  getFileds

  getDeclaredFileds

在运行时使用反射分析对象

  setAccessible

使用反射编写泛型数组代码

  CopyOf

调用任意方法

  Method invoke

8、继承设计的技巧

1、将公共操作和域放在超类

2、不要使用受保护的域

3、使用继承实现 is-a 关系

4、除非所有集成的方法都有意义,否则不要使用继承

5、在覆盖方法时,不要改变预期的行为

6、使用多态,而非类型信息

7、不要过多的使用反射

Java基础语法<八> 继承的更多相关文章

  1. Java基础语法<八> 继承 多态 抽象 反射

    1.超类和子类 超类和子类 父类与子类 多态: 一个对象变量可以指示多种实际类型的现象称为多态 一个变量可以引用父类对象,也可以引用其子类对象,这就是多态. 不能将一个超类的引用赋给子类变量,因为调用 ...

  2. Java基础学习笔记七 Java基础语法之继承和抽象类

    继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...

  3. Java基础语法知识你真的都会吗?

    第一阶段 JAVA基础知识 第二章 Java基础语法知识 在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的"潜规则",通过你对命名 ...

  4. Java基础语法和基本数据类型

    Java基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 对象:对象是类的一个实例,有状态(属性)和行为(方法). 类:类是一个模板,他描述一类对象的行为 ...

  5. java面向对象编程——第二章 java基础语法

    第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...

  6. java基础语法(一)

    java基础语法(一) 1.类是一种抽象的概念,对象是类的一种具体表示形式,是具体的概念.先有类,然后由类来生成 对象(Object).对象又叫做实例(Instance). 2.类由两大部分构成:属性 ...

  7. Java匹马行天下之JavaSE核心技术——Java基础语法

    Java基础语法 一.   认识Java 1. Java 简介 java 是一种高级的面向对象的程序设计语言,使用Java语言编写的程序时跨平台的.从pc到手机,都有Java开发的程序和游戏,Java ...

  8. JAVA基础语法——标识符、修饰符、关键字(个人整理总结)

    JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1    什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Dem ...

  9. 第3天 Java基础语法

    第3天 Java基础语法 今日内容介绍 引用数据数据类型(Scanner.Random) 流程控制语句(if.for.while.dowhile.break.continue) 引用数据类型 Scan ...

随机推荐

  1. jquery deferred done then区别

    jquery deferred done then区别 deferred是jquery 对promise的实现. 以下内容基于jquery 1.8及以上版本 deferred具有then done等属 ...

  2. Oracle数据库------体系结构

    ORACLE体系结构包括:实例(Instance),数据库文件,用户进程(User process),服务器进程以及其他文件. 1.ORACLE实例(instance)     1).要访问数据库必须 ...

  3. 搭建eureka服务

    1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  4. python标准库]Hashlib

    hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法. 在学习hashlib模块之前,先来看 ...

  5. 史上最完整Hadoop2.x完全分布式安装部署-小白也能学会

    一.环境要求: 1.        虚拟机安装并设置网络: 2.        修改主机地址映射: 3.        必备软件:Jdk.Development Tools   Development ...

  6. String、StringBuffer、StringBuilder比较

    String.StringBuffer.StringBuilder三者是字符串中重要的内容,也是面试过程中经常问到的问题,下面就来总结一下三者的区别. 1.三者都可以存储和操作字符串. 2.Strin ...

  7. cpp(第七章)

    1.c++提供了3种表示c—风格字符串方法:字符数组,字符串常量,字符串指针.其中字符数组并不一定是字符串,以空值字符'\0'来结束的字符数组时字符串. 2.函数参数为数组时,虽然减少了时间和内存的使 ...

  8. idea无法正常使用SVN的解决方法

    问题描述: IntelliJ IDEA安装之后,使用SVN进行提交或更新以及检出代码的时候会出现如下错误: Cannot load supported formats: Cannot run prog ...

  9. JSON 转换异常 multipartRequestHandler servletWrapper

    下面出现红色的字还有警告,解决方法:本人项目是struts1 from类继承了“extends ActionForm” .把它去掉就行了.如果你是其它的框架一定是继承引起的作个参考吧. ....... ...

  10. python大规模爬取京东

    python大规模爬取京东 主要工具 scrapy BeautifulSoup requests 分析步骤 打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点 我们可以看到这个页面 ...