zoukankan      html  css  js  c++  java
  • Think in Java ---Chapter 7 复用类

    1.组合和继承是在不破坏现有代码下,复用类的方式。
    2.当需要用到String 的地方)而当前是对象时,会调用它的toString方法,有的是方法自己实现的行为,有的是JVM自动添加的,例如println传入的参数若不是String,则println方法会自动调用toString,而在表达式中时,则是JVM完成的。
    3.组合方式中,对依赖对象可以使用4种初始化方式:定义时初始化,构造方法初始化,初始化块,在使用时检查是否为null的惰性初始化。
    4.只要创建一个类,就已经发生了继承(显式继承或隐式从Object类继承)。从而思想来到了 多态(重载与重写),注意重写的方法使用的成员变量是捆绑在调用方法所在的类。
    5.每个类中的main作为单元测试使用。
    6.无论含有main的类是public还是包默认权限,取决于‘java 有main方法的类’ 调用的是哪个类。即‘java C’,则jvm先按照CLASSPATH找到.class文件,然后在方法区创建类的class对象,在方法区中初始化类C的静态结构,执行静态初始化块,然后调用C.main()。
    7.常用的继承策略是将所有变量为private, 外部需要访问的方法按照选择性写为protected, public,或包默认。
    8.super.父类的成员变量或者方法。 super是父类对象的引用。
    9.创建出来的子类实例,内部除了自己的重写方法和变量,独有方法和变量外,包含有父类的一个子对象,这个对象和直接创建父类的子对象是相同的。

    如图所示,现在有4个类的class文件,当我在程序中使用到这4个类时,即有如下代码:

    FatherB fb = new Father();
    ChildrenA ca = new ChildrenA();
    ChildrenB cb = new ChildrenB();
    

    JVM会在CLASSPATH等路径查找class文件,使用JIT即时编译机制,在方法区中逐个分配这4个class对象的空间,然后在下面的静态变量区执行类导入时的静态初始化过程。(复习一遍初始化)因为没有静态变量所以下面的静态变量区没有画出。
    然后分别在Eden区分配3个对象,其中两个对象的父类是以子对象存在内部的,当出现变量和方法覆盖时,需要使用super.XXX来在父类对象中查找。
    因此,如果存在继承连,则对象中的区域会逐渐深入嵌套。
    建立完内存对象结构,然后进行对象的初始化,根据方法区的构造函数代码,会从里到外填写成员变量,执行初始化块。
    10.要改变编译器默认添加的调用父类无参构造函数的语句,需要在子类构造方法中显式使用super(params)语句。
    11.除了组合和继承,还有代理来提供另一个类的功能,代理类与被代理类是组合关系。代理是介于组合和继承之间的方法。
    12.对象的清理操作需要写一个方法,并且遵守约定调用它,在这个方法中,应该先清理自己特有的部分,然后再使用super调用父类的清理方法,顺序和对象建立时相反。想想书上的Shape父类和图形子类,而CADSYStem类(也继承Shape类)组合这些图形,然后调用CADSystem的自定义dispose方法,想想过程。
    13.不要把对象的清理逻辑放在finalize方法中,因为GC是不可靠的,因为只要内存不满,就不会GC,即使GC,也未必会按照你想要的顺序清理对象执行finalize。
    14.子类中可以重载父类的方法,不会发生冲突。这点在上图中很容易理解。若是重写,则会覆盖,需要使用super。
    15.重写时习惯加上@Override。
    16.从上图上看,组合和继承只不过把父类对象放在了外面和里面。当使用组合时,若依赖的类访问控制做得很好,则组合很安全;而若不想外界过度使用依赖的类,或者想使用依赖的类的接口并且加以扩展,则使用继承。一个是is-a关系,一个是has-a关系。使用组合还是继承的另一个理由是是否要使用多态即向上转型。
    17.从图上看,继承还可以解释为:子类是父类的一种类型,即因为子类中拥有父类的所有成员,所以可以将子类作父类使用。例如多态中的对象自动向上转型。想想类图,想想对象内部的嵌套结构。
    18.final的3个用法:类,方法,变量。static final 和final变量可以在定义时不给值,但是各自必须在类静态初始化完毕和构造方法结束前给值。想想每个的用处,初始化过程。
    19.final修饰变量,若为基本类型,则不可变,若为引用类型,则还是不可变。(状态可变)例如final int []a={1,2};a[0]=2;
    20.说说static final 和final变量的区别和初始化过程。
    21.private方法即自带final属性,因此在子类中重写时不会发生错误,因为根本没发生重写。只是声明了一个新方法!!!可以向上转型子类到父类就知道了。可以用Override解决这个问题。
    22.final类的所有方法也都是带final属性。

  • 相关阅读:
    【Statistics】均值
    【Datastage】在win10安装Datastge 8.7
    【Linux】行首、行尾添加字符串
    【Linux】替换文本中的字符
    【Pyhton 数据分析】通过gensim进行文本相似度分析
    【Python 数据分析】jieba文本挖掘
    异或运算法则
    关于计算机中的《补码》,公式:-n=~n+1 引伸:~n=-n-1
    Base64编码解码
    位运算之——按位与(&)操作——(快速取模算法)
  • 原文地址:https://www.cnblogs.com/yumingle/p/6662206.html
Copyright © 2011-2022 走看看