Java基础语法<八> 继承

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、不要过多的使用反射

时间: 2024-10-24 16:13:58

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

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

继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工,程序中便可以描述为研发部员工和维护部员工继承自员工,同理,JavaEE工程师和Android工程师继承自研发部员工,而维网络维护工程师和硬件维护工程师继承自维护部员工.这些员工之间会形成一个继承体系,具体如下图所示. 在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称

黑马程序员——Java基础语法(一) --- 关键字、标识符、注释、常量和变量、运算符

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 本篇博文主要总结java的基础语法,主要的内容包括:关键字.标识符.注释.常量和变量.运算符几部分. 一.关键字 关键字是被Java语言赋予了特殊含义的单词.关键字中所有的字母都是小写. java中的关键字主要包括如下几部分: 1.用于定

Java基础语法

Java的基础语法中包含字符集.标识符和关键字.变量和常量.语句.注释.运算符和表达式这些基本要素. 一.关键字 编程语言都有一些保留的单词,用于定义该语言,这些单词对于编译器有特殊含义,不能作为标识符使用: Java中的true.false.null这三个保留字,不能作为标识符使用,对于编译器有特殊含义: main是一个用于描述Java程序开始方法的特殊名称,它不是一个关键字: abstract 抽象 boolean 逻辑运算: 布尔 break 打破: 断开 byte 字节: case 例,

Java基础语法(一)---关键字、常量、变量、运算符

Java基础语法(一)---关键字.常量.变量.运算符一.关键字 定义:被Java赋予了特殊含义的单词. 特点:体现上都是英文小写. 1. 用于定义数据类型的关键字 基本数据类型: 整数类型: byte(1字节,最大值127) short(2字节,最大值为2^15-1) int(4字节,最大值为2^31-1) long(8字节,最大值为2^63-1) 浮点类型: float (单精度实数在内存中占32bit 有效数字为6~7位) double(双精度实数占内存单元为64bit 有效数字为15~1

java 基础语法

第一周接触java基础语法,上课听得头痛,还是半懂不懂,放学后讲的啥子都忘了. 这是老师给的周末作业: 1.输入长与宽计算长方形面积与周长.(用精度类型计算)2.输入一个学生三科成绩,计算平均分.3.输入int型市场价格,购买价格,计算差额,差额显示为单精度浮点型.4.42页第二,计算房贷那道题.5.输入一个学生成绩,学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示.6.题目:输入三个整数x,y,z,请把这三个数由小到大输出.程序分析:我们想办法把最小的数放到x

Java基础——封装、继承、多态

Java基础--封装.继承.多态 --小实例快速成长 抽象: 1.目的:将复杂的东西简单化,将繁乱的内容有序化. 2.过程:对相同.相似的东西合而为一,对不同的内容进行归门别类. 3.结果:类.接口. 封装: 1.目的:化零为整,将零散的内容进行归属,进行权限控制. 2.过程:将某对象的属性.方法(功能)统一到其名下,并分别设置.适当的权限进行控制管理. 3.结果:对象,接口. 继承: 1.求大同存小异:在一个系列内,大部分都有的内容,就划归父类:子类将父类的内容继承过来,可以有自身的一些发展和

Java基础语法1

                         Java基础语法(1)知识点目录 1:关键字 (1)定义 (2)特点 (3)注意事项 2:标识符 (1)定义 (2)组成规则 (3)注意事项 (4)常见的命名规则(见名知意) A:包 单级包 多级包 B:类或者接口 一个单词 多个单词 C:方法或者变量 一个单词 多个单词 D:常量 全部大写 一个单词 多个单词 3:注释 (1)定义 (2)分类 A:单行注释 B:多行注释 C:文档注释 (3)注释的作用 4:常量 (1)定义 (2)分类 A:字面

JavaSE入门学习7:Java基础语法之语句(下)

继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for. (5)Java循环语句之while 语法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 运行

java基础之【继承---&gt;多态】内存图

执行流程 1:Animal a = new Cat(); 1.1:在栈中创建区域,类型为Animal,变量名:a; 1.2:在堆中new Cat();占用一块区域.地址值:[0x3a4] 1.3:spuer()实例化父类Animal. 1.3.1:new Animal();占用一块区域,地址值:0x3ab; 1.3.2:引用着在方法区中初始化[Animal中的所有方法,该引用为:[0x754]]. 1.3.3:将Animal()引用赋给spuer();spuer引用着Animal(); 1.4: