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基础语法<八> 继承 多态 抽象 反射的更多相关文章

  1. Java基础语法<八> 继承

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

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

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

  3. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  4. java基础语法(一)

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

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

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

  6. Java-Runoob:Java 基础语法

    ylbtech-Java-Runoob:Java 基础语法 1.返回顶部 1. Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍 ...

  7. (四)Java 基础语法

    Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一 ...

  8. JavaSE基础(三)--Java基础语法

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

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

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

随机推荐

  1. Use Multiple log4net Outputs from One Application

    Introduction This is an article simply to demonstrate how to use several output log files depending ...

  2. Ubuntu下搭建tftp服务器最简单方法

    今天开始调试ARM的板子,要通过tftp下载到板子上,所以又要配置tftp服务器,真的烦死了… (本人酷爱装系统,所以经常都要搞配置) 因为之前已经在Ubuntu下搭建过很多次tftp服务器了,但是一 ...

  3. fork failed because of Out Of Memory

    Maybe virtual memory over commit is prevented in your system. If it is prevented, then the virtual m ...

  4. 给iOS开发者的Android开发建议

    本人从事iOS应用开发已经5年有余,直到现在还总是刻意回避Andriod应用的开发.但是不管你信不信,安卓开发还是很有意思的,从iOS转向Android应用开发的跨度并没有你想象的那么大. 现在我把在 ...

  5. Java动态代理实现方法

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflec ...

  6. javascript中的this在不同场景下的区别

    javascript在初版的设计上存在失误,导致了这门语言在使用时,经验型写法并不能得到像其它几个流行语言一样预期.其中的this的使用就是一个典型. this在javascript中是由解释器注入的 ...

  7. 门户级UGC系统的技术进化路线 [转]

    原文链接   :http://weibo.com/p/1001603789147444803230 新闻门户网站的评论系统,或者称为跟帖.留言板,是所有门户网站的核心标准服务组件之一.与论坛.博客等其 ...

  8. Nginx 指令目录(中文版)

    指令大全 accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_t ...

  9. SNFAutoupdater通用自动升级组件V2.0

    1.组件介绍 C/S构的特点是能充分发挥客户端的处理能力,很多工作可以由客户端处理后再提交给服务器,对应的优点就是客户端响应速度快模式客户端以其强大的功能,丰富的表现力受到相当大部分用户的青睐,但是客 ...

  10. Fluent动网格【7】:网格节点运动

    在动网格中,对于那些既包含了运动也包含了变形的区域,可以通过UDF来指定区域中每一个节点的位置.这给了用户最大的自由度来指定网格的运动.在其他的动网格技术中(如重叠网格)则很难做到这一点.定义网格节点 ...