美文网首页
第八章多态

第八章多态

作者: 小倩的宁采臣 | 来源:发表于2017-08-24 15:34 被阅读0次

Overview

最近在学习Thinking in Java这部java经典,书非常不错,作者有非常深厚的编程功底,讲解知识时候说的很透彻,而且有一定发散,深入浅出,是一本阅读起来非常舒服。目前阅读到第八章,除了第五章初始化与清理里的垃圾回收机制有些难度以外,其他章节有一定编程经验的都可以看懂。从第八章开始,内容开始增多,各种重要知识点开始出现,如不好好总结很可能会漏掉一些细节,所以从这里开始对第八章进行总结。

有关垃圾回收的知识我准备在以后在整理jvm相关知识时再做详细总结。

Contents

  • 初始化的顺序
    • 先将分配给对象的存储空间初始化成二进制的零。
    • 调用基类的构造器。这个步骤一直递归下去,直至递归到根类,再开始从根向导出类开始初始化。
    • 按声明顺序调用成员的初始化方法。
    • 调用导出类构造器的主体。

初始化的顺序还要注意在第五章中提到的知识,静态对象要先于非静态对象。

  • 构造器内部的多态方法的行为
class Super {
    public int field = 0;
    public int getField() {
        return field;
    }
}

class Sub extends Super {
    public int field = 1;
    public int getField() {
        return field;
    }
    public int getSuperField() {
        return super.field;
    }
}

public class JavaTest{
    public static void main(String[] args) {
        Super sup = new Sub(); //向上转型
        //这里在直接访问域的时候,并没有出现理想中的多态
        System.out.println("sup.field: " + sup.field + "\nsup.getField: " + sup.getField() + "\n");
        Sub sub = new Sub();
        System.out.println("sub.field: " + sub.field + "\nsub.getField: " + sub.getField() + "\nsub.getSuperField():" + sub.getSuperField());
    }
}

输出为:
sup.field: 0
sup.getField: 1
sub.field: 1
sub.getField: 1
sub.getSuperField():

当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,由于多态采用的是动态绑定,而不是靠编译器,所以无法完成多态。

在上面的例子中,一个sub对象中有两个叫做field的域(Super.field和Sub.field),然而在引用sub中的field时所产生的默认域并非Super版本的field,因此必须显示的指明super.field。

在实际编程中非常不赞成出现这样的代码,这样的代码难以阅读,进而难以维护。

public class Test1 {
    public void printStr(String s){
        System.out.println("this is test1.printStr");
        System.out.println(s);
    }

    public void printStr2(String s){
        printStr(s);
    }
}
public class Test2 extends Test1 {
    public void printStr(String s){
        System.out.println("this is test2.printStr");
        System.out.println(s);
    }
    public static void main(String[] args) {
        Test1 test = new Test2();
        test.printStr2("test");
    }
}

输出为:
this is test2.printStr
test

这是第八章练习10的运行效果,和上面的结果放在一起对比看起来会更佳直观,这里的printStr()方法被覆盖了,即使是Test1的方法调用printStr()也会调用被覆盖的方法,与上面的变量覆盖是不同的。

  • 构造器内部的多态方法的行为
    • 在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
    • Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
    • 注意:"协变返回(covariant return)",仅在subclass(子类)的返回类型是superclass(父类)返回类型的extension(继承)时才被容许。

相关文章

  • Thinking in Java 第八章多态读书笔记

    1.第八章一开头就说了多态的作用:消除类型之间的耦合关系。 2.多态的前提是继承与重写,因为继承之后允许将子类视为...

  • 第八章:多态

    多态分离做什么和怎么做,将接口和实现分离开来。也称为动态绑定、后期绑定或运行时绑定。

  • 第八章多态

    Overview 最近在学习Thinking in Java这部java经典,书非常不错,作者有非常深厚的编程功底...

  • 第八章多态

    多态是继数据抽象和继承之后的第三种基本特征.多态也叫(动态绑定,运行时绑定或者后期绑定) 8.1方法调用绑定 方法...

  • 第八章:多态

    向上转型 向上转型:把对某个对象的引用视为对其基类型的引用的做法被称作为向上转型 后期绑定:在运行时根据对象的类型...

  • 1.9 多态基本概念

    本小节知识点: 【了解】什么是多态? 【掌握】多态的条件 【了解】多态的优点 1.什么是多态? 什么是多态:多态就...

  • C++ 的多态(Polymorphism), virtual f

    多态 c++支持两种多态,编译时多态和运行时多态但其实编译时多态根本不是真正的多态,编译时多态就是函数的重载,ov...

  • 详解Java多态

    详解Java多态 多态定义 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态...

  • Think in Java 第八章(多态)

    在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。 多态通过分离做什么和做怎么做,从另一个将...

  • 多态

    1.多态 1.多态 1.1 要点 多态是方法的多态,不是属性的多态 多态的存在有三个必要条件:继承;方法重写;父类...

网友评论

      本文标题:第八章多态

      本文链接:https://www.haomeiwen.com/subject/htwsdxtx.html