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. More 3D Graphics (rgl) for Classification with Local Logistic Regression and Kernel Density Estimates (from The Elements of Statistical Learning)(转)

    This post builds on a previous post, but can be read and understood independently. As part of my cou ...

  2. kafka 0.8.2 消息生产者 producer

    package com.hashleaf.kafka; import java.util.Properties; import kafka.javaapi.producer.Producer; imp ...

  3. Spring Boot 学习(3)

    文 by / 林本托 Tips 做一个终身学习的人. Tips 代码路径:https://github.com/iqcz/Springbootdemo/tree/master/code01/ch3 W ...

  4. SQL注入攻击[详解]

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...

  5. Java集合之Properties

    Java集合之Properties

  6. git使用3

    如何使用/学习第三方框架? 优秀的第三方框架都在 github.com 1> 搜索 2> git clone 获得完整版本 $ git clone https://github.com/A ...

  7. CPU-Z五大主要功能及使用方法初步了解

    CPU-Z这款软件除了具有查看CPU温度这个功能之外,还有很多其他的功能.今天就和小编一起去看看CPU-Z的5大功能以及他们的使用方法吧! CPU信息标签页 CPU-Z介绍: CPU-Z是一款著名的免 ...

  8. comm的用法

    1.comm的功能 对两个排序过的文本文件进行逐行比较基本用法:comm -[123] file1 file2 2.例子 1)显示两个文本文件都有的行#comm -12 file1 file2 2)显 ...

  9. WPF MVVM 架构 Step By Step(1)(介绍)

    生命就是我们从孩子开始,经过不断的学习成为成熟的成年人的进化过程.这和软件的架构有着异曲同工之妙,我们从基础的架构开始,随着需求和环境的变化不断的进化. 如果你去问任何一个.net开发者,什么是最基础 ...

  10. 轻松Angularjs实现表格按指定列排序

    angular表格点击序号进行升序,再次点击进行降序排序,在输入框输入信息,出现相对应数据的那一行. html: <input type="text" ng-model=&q ...