zoukankan      html  css  js  c++  java
  • 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))来覆盖是常见的错误,具体使用在以后的笔记中会涉及到。

  • 相关阅读:
    MySQL如何查询两个日期之间的记录
    Android常用权限
    Android如何区别真机和模拟器
    android资源文件说明
    Android文件存取路径
    @SuppressLint("NewApi")和@TargetApi()的区别
    Java注释规范
    启动IpFilterDriver驱动
    IDEA 创建 Spring Boot 多模块项目(Multi Modules)
    Spring Boot 多环境如何配置
  • 原文地址:https://www.cnblogs.com/rynerlute/p/6392759.html
Copyright © 2011-2022 走看看