Java学习笔记--继承和多态(中)

1.通过继承来开发超类(superclass)

2.使用super 关键词唤起超类的构造方法

3.在超类中覆盖方法

4.区分override和overload

5.在Object类中探索toString()类

6.发现多态性和动态绑定

7.描述解释为什么向下转型是必须的

8.在Object类中探索equals 方法

9.存储,取回,实现ArrayLis的对象

10.使用ArrayList类实现Stack

11.超类中使用数据和方法,protected

12.使用final模块来禁止类和方法的覆盖

 

5.在Object类中探索toString()类

  Java中的每个类都是从java.lang.Object类中扩展出来,定义类的时候如果没有特别规定是继承来的,那么默认父类是Object。例如

  public class ClassName 和 public classClassName extends Object

  这两个语句是一样的,String类,StringBuilder类都来是来自与Object类,学习toString()方法

  

public String toString()

toString的返回值是描述对象的字符串。默认情况下,返回的字符串由一系列对象的类名,通常我们在使用的时候需要将toString改写。

  笔记:也可以使用对象来唤起 System.out.println(Object)或者 System.out.println(Object)

6.发现多态性和动态绑定

  面向对象的三个特性:封装、继承和多态。

  介绍两个有用的术语:派生类subtype和超类supertype。子类定义的类型是subtype,例如原本研究圆是几何体。Circle is a geometry。所以说GeomericObject类是父类,Circle是子类,所以Circle是GeomericObject的subtype。GeomericObject是Circle的supertype。

  继承关系使得子类从父类中继承一些父类的特征并且加入新的特性,子类是某种特殊的父类,子类的所有实例也可以算是父类的实例,反之不成。也就是我们理解的圆是几何图形但是几何图形不是圆。

动态绑定

  超类中定义方法,然后在子类中进行覆盖,就像前面的toString()方法在Object类中已经定义了,在GeometricObject中再写一个方法方法进行覆盖,按照如下的代码:

  

Object O = new GeometricObject;
System.out.println(o.toString());

上面的例子中o调用的方法是哪个的toString()。为了研究这个问题,可以想到两个方面。比如说我们日常生活中,常常会声明“xxx是xxx,做出某某声明,但是实际上的是???”

出现某些事情影响到某机构,然后会有官方声明。所以就是两个方面,声明xxx,实际上xxx,Java中的思想,就是declare type和actual type就是声明类型和实际类型,变量必须声明一个类型变量的类型叫做它的声明类型,上面例子中的O的类型就是Object,如果遇到实际类型,实际类型根据变量的类进行参考,因此O的实际的类型是GeometricObject类,这就是动态绑定。(动态系统?声明一个类,然后具体由它的子类极性实现,生成的对象根据具体情况下的子类进行生成,此时对象和子类绑定起来)以后在遇到很多对象都是由不同的子类生成的,这些对象分别绑定了它的类:

  

7.描述解释为什么向下转型是必须的

  前面用的例子用比较专业的术语而言就是转型,将某种xxx类型转为下一类型,将某个变量从最初的类型转为实际的类型。将某个对象转为实际使用时候的对象。就像前面写的语句: Object o = new student();就是隐式类型转换,在C语言中也有这种类型转换,比如我们以前遇到的 int a = (int) b;某种类型转换。同样的赋值操作,如果说是数值的赋值操作 a=b;进行类比 有没有对象的类似赋值的操作  student b = o; 此时就出错了。很像前面提到的"XXX是XXX"的一种关系,而且这种关系不可逆。

  考虑以下的例子

 

object myObject = new Circle();
 if(myObject instanceof Circle){
     System.out.println("The Circle diameter is "+((circle)myObject).getDiameter());
    ...
}

myObject 变量声明的时候是Object类,声明类型决定了哪种方法会在编译的时候匹配,使用myObject.getDiameter()将会造成编译错误,因为Object类并没有getDiameter方法。编译的时候编译器找不到匹配的方法,所以要告诉编译器xxx是xxX的具体实例。为了更好理解转型,可以按照一下的想法进行思考:水果:苹果和橘子, fruit --superclass , Apple --subclass, Orange --subclass,Apple 是水果,所以能够安全地使用fruit的变量,然而fruit不是水果,所以在使用的时候要隐式类型转换。

8.在Object类中探索equals 方法

  Object 类中也有equals的方法:语法如下

  public boolean equals(Object o);

  使用的时候:

  object1.equals(object2);

默认的实现为:

  

public boolean equals(Object obj){
   return (this == obj);   
}

这个实现过程检查两个形参变量是否指向相同对象,此时使用的是==,在自己写的类中也可以进行重定义。

 笔记:

  ==符号适用与比较两个最初的数据类型,确定两个变量是否有相同的参考,equals方法是为了测试两个对象是否有相同的内容。==操作符的优先级高于equals方法,因为==是检查是否指向相同的对象。

注意:

  在子类中使用 equals(SomeClassName obj)(也就是 equals(Circle c))来覆盖是常见的错误,具体使用在以后的笔记中会涉及到。

原文地址:https://www.cnblogs.com/rynerlute/p/6392759.html