day13-面向对象-object-多态-多态方法调用-代码块-final-单例

  1. Object类的常见方法:
    1): protected  void finalize() :垃圾回收器在回收某一个对象之前,会先调用该方法,做扫尾操作.
    2): Class  getClass() :返回当前对象的真实类型。
    3): int hashCode(): 返回该对象的哈希码值,hashCode决定了对象再哈希表中的存储位置,
    4): boolean equals(Object obj) :拿当前对象(this)和参数obj做比较.
                   本身和 “ == ”符号相同,都是比较对象的内存地址.
                    官方建议:每个类都应该覆盖equals方法,不要比较内存地址,而去比较我们关心的数据      
    5):String toString():表示把一个对象转换为字符串.
                         打印对象时打印的就是对象的toString方法.
                         System.out.println(obj对象);等价于  System.out.println(obj对象.toString());
                         默认情况下打印对象,打印的是对象的十六进制的hashCode值
                         官方建议我们:应该每个类都应该覆盖toString,返回我们关心的数据.

  2. 多态的前提:可以是继承关系(类和类)/也可以是实现关系(接口和实现类)

    把子类对象赋给父类变量,在运行时期会表现出具体的子类特征(调用子类的方法).

    编译类型必须是运行类型的父类/或相同.
    当编译类型和运行类型不同的时候,多态就出现了.

    多态的作用:当把不同的子类对象都当作父类类型来看待,可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码达到通用编程,

  3. 多态时方法调用问题:
    1. 情况1: doWork方法存在于SuperClass中,不存在于SubClass中.

      此时执行结果: 编译通过,执行SuperClass的doWork方法.
            应该先从SubClass类中去找doWork方法,找不到,再去父类SuperClass类中找.

    2. 情况2: doWork方法存在于SubClass中,不存在于SuperClass中.
      此时执行结果: 编译错误.
           编译时期,会去编译类型(SuperClass)中找是否有doWork方法:
                        找    到:编译通过.
                        找不到:编译报错.

    3. 情况3: doWork方法存在于SuperClass和SubClass中.

      此时执行结果: 编译通过,执行SubClass的doWork方法.
            在运行时期,调用运行类型(SubClass)中的方法.

      4.情况4: doWork方法存在于SuperClass和SubClass中,但是doWork是静态方法.

      此时这种情况,我们称之为隐藏,而不叫方法覆盖.

      此时执行结果: 编译通过,执行SuperClass的doWork方法.
          静态方法的调用只需要类即可.

    4. 强制类型转换:  把父类类型对象赋给子类类型变量(但是该父类类型变量的真实类型应该是子类类型).

         Animal a = new Dog();
          Dog   d = (Dog)a;

    5. boolean b = 对象A   instanceof  类B

       

猜你喜欢

转载自blog.csdn.net/u013985548/article/details/81437046