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、不要过多的使用反射
9、tag问题
9.1
抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。
继承:是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于抽取多类事物的共性。
多态:允许不同类的对象对同一消息做出响应。方法的重载、类的覆盖正体现了多态。
9.2
重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。
9.3 HashCode Equals 关系
equals相等,hashcode必相等;hashcode相等,equals可能不相等。
Java基础语法<八> 继承 多态 抽象 反射的更多相关文章
- Java基础语法<八> 继承
1.超类和子类 超类和子类 父类与子类 多态: 一个对象变量可以指示多种实际类型的现象称为多态 一个变量可以引用父类对象,也可以引用其子类对象,这就是多态. 不能将一个超类的引用赋给子类变量,因为调用 ...
- Java基础学习笔记七 Java基础语法之继承和抽象类
继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- java基础语法(一)
java基础语法(一) 1.类是一种抽象的概念,对象是类的一种具体表示形式,是具体的概念.先有类,然后由类来生成 对象(Object).对象又叫做实例(Instance). 2.类由两大部分构成:属性 ...
- Java基础语法知识你真的都会吗?
第一阶段 JAVA基础知识 第二章 Java基础语法知识 在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的"潜规则",通过你对命名 ...
- Java-Runoob:Java 基础语法
ylbtech-Java-Runoob:Java 基础语法 1.返回顶部 1. Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍 ...
- (四)Java 基础语法
Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一 ...
- JavaSE基础(三)--Java基础语法
Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...
- Java基础语法和基本数据类型
Java基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 对象:对象是类的一个实例,有状态(属性)和行为(方法). 类:类是一个模板,他描述一类对象的行为 ...
随机推荐
- Android典型界面设计(4)——使用ActionBar+Fragment实现tab切换
一.问题描述 之前我们使用ViewPager+Fragment区域内头部导航,在Android 3.0之后Google增加了新的ActionBar,可方便的实现屏幕Head部区域的 设计如返回键.标题 ...
- MAC常用软件推荐
SQL建模 http://dbwrench.com/download/install/mac_install.shtml 参考https://github.com/helantao/macOS/blo ...
- sql语句语法
13.1. 数据定义语句 . ALTER DATABASE语法 . ALTER TABLE语法 . CREATE DATABASE语法 . CREATE INDEX语法 . CREATE TABLE语 ...
- FDMB 增删改删 查 分页 封装
下载地址 http://pan.baidu.com/s/1qWrt9W4// // GCB_ProductDetailDB.h // TestDemo001 // // Created by Walt ...
- webpack中file-loader和url-loader的关系
url-loader把资源文件转换为URL,file-loader也是一样的功能. 不同之处在于url-loader更加灵活,它可以把小文件转换为base64格式的URL,从而减少网络请求次数.url ...
- Type Call requires API level 11 (current min is 8)解决办法
解决办法: 1:project-->clean.. 2:右键工程-->Android Tools-->clean lint markers 3:修改AndroidManifest.x ...
- 五分钟搞清楚MySQL事务隔离级别
好久没碰数据库了,只是想起自己当时在搞数据库的时候在事务隔离级别这块老是卡,似懂非懂的.现在想把这块整理出来,尽量用最简洁的语言描述出来,供新人参考. 首先创建一个表account.创建表的过程略过( ...
- 建立一个基本的UI
本章让你熟悉Xcode来写应用程序.你会熟悉Xcode项目的结构,并学习如何在基本项目组件中导航.通过整个课程中,您将开始为FoodTracker应用程序制作一个简单的用户界面(UI),并在模拟器查看 ...
- python 的正则表达式
在python中,对正则表达式的支持是通过re模块来支持的.使用re的步骤是先把表达式字符串编译成pattern实例,然后在使用pattern去匹配文本获取结果. 其实也有另外一种方式,就是直接使用r ...
- layui table 前台数字格式保留两位小数,不足补0(mysql 数据库)
layui table 对于后台json数据,有数字的,默认不会原样显示,而是只取数值,即100.00显示为100.如果想原样显示,需转为字符串. 项目采用mysql数据库,字段类型为decimal( ...