zoukankan      html  css  js  c++  java
  • 【Thinking in Java, 4e】初始化与清理

    【用构造器确保初始化】

    【方法重载】

    涉及基本类型的重载

    1、如果传入的数据类型小于方法中声明的形式参数类型:实际数据类型会被提升。

     

    2、如果传入的数据类型大于方法中声明的形式参数类型:编译器报错,应该通过类型转换来执行窄化转换。

    【默认构造器】

    【this关键字】

    1、不要画蛇添足!!!在必要的地方写出this!!!(例如,在方法内部调用同一个类的另一个方法,就没必要写出this)遵循一种一致而直观的编程风格能节省时间和金钱。

     

    2、this关键字的应用:a.将自身传递给外部方法。b.在构造器中调用另一个构造器(避免重写代码)c.避免参数名与数据成员重名(例如:this.name = name)

     

    3、更全面地理解static的含义:static方法就是没有this的方法。 

    【清理:终结处理和垃圾回收】

    要记住的三点:

     1、对象可能不被垃圾回收!finalize()是随着垃圾回收事件的发生而被调用的,而垃圾回收事件在程序的整个执行过程中可能发生也可能不发生(具有不确定性),因此不该将其作为通用的清理方法。

      

    2、垃圾回收并不等于“析构”。

      

    3、垃圾回收只与内存有关。

      

    finalize()的用途何在?

    释放本地方法所分配的内存,本地方法是一种在Java中调用非Java代码的方法,例如调用c和c++的代码。

    你必须实施清理

    1、在c++中,如果对象是用new创建的,程序员一旦忘记调用delete,那么永远不会调用析构函数!

    2、在Java中,所有对象都是由new创建的,由垃圾回收器追踪和清理,但是这种机制并不能完全替代析构函数。

    3、垃圾回收本身也是有开销的,因此若不是内存耗尽,Jvm是不会浪费时间去执行垃圾回收恢复内存的!

    终结条件:finalize中的条件语句

    p89练习10:

    public class Rubbish {
        protected void finalize() {
            System.out.println("我被回收啦!");
        }
        public static void main(String[] args) {
            Rubbish a = new Rubbish();
            // a所引用的对象最终可能没有被垃圾回收。
        }
    }

    练习11:

    public class Rubbish {
        protected void finalize() {
            System.out.println("我被回收啦!");
        }
        public static void main(String[] args) {
            new Rubbish(); // 不理解的地方:如果这句是Rubbish a = new Rubbish();则最后不会输出“我被回收啦”。
            System.gc();
        }
    }

    垃圾回收机如何工作

    【成员初始化】

    【构造器初始化】

    强调一点:静态初始化动作只执行一次,在首次生成那个类的对象的时候(构造器实际也是静态的)或者首次访问那个类的静态成员的时候。

    【数组初始化】

    1、Java中的数组是允许直接拷贝的!a1 = a2;但实质上两个引用操控同一个对象。

    2、Java中允许先创建数组引用int[] a1;之后再进行初始化。(这一点可以用来创建“全局”数组)

    3、非基本类型的数组其实是引用数组,声明方式:ClassName[] a = new ClassName[10];

    4、Java中的可变参数的函数:void f(ClassName... objects);实际上是用一个数组(这里的数组名叫objects)收集数量不确定的位置参数,可以通过foreach语句遍历打印objects数组中的元素。

    【枚举类型】

    1、枚举类型属于非常普遍的需求。

    2、在Java中,你可以将enum当作其他任何类来处理。

    3、在创建enum时,编译器会自动添加一些有用的特性:toString()、static value()、ordinal()等。

    4、enum还有一个特性是可以在switch中使用。

    4、具体实现方面,写了个简单的例子:

    创建一个枚举类:

    public enum Colors {
        RED, YELLOW, BLUE, GREEN
    }

    enum的使用与特性:

    public class TestColors {
        public static void main(String[] args) {
            Colors myColor = Colors.BLUE;
            System.out.println(myColor); // toString()
            // static values() & ordinal()
            for (Colors c : Colors.values()) {
                System.out.println(c + ", ordinal " + c.ordinal());
            }
            // switch
            myColor = Colors.RED;
            switch (myColor) {
                case RED:   System.out.println("My color is red!");
                            break;
                default:
            }
        }
    }
    /* Output:
    BLUE
    RED, ordinal 0
    YELLOW, ordinal 1
    BLUE, ordinal 2
    GREEN, ordinal 3
    My color is red!
     */

    【总结】

     构造器、垃圾回收机。

  • 相关阅读:
    C# Assembly 反射
    C# Assembly 反射
    为C#自定义控件添加自定义事件
    为C#自定义控件添加自定义事件
    redis5.0的槽点迁移,随意玩(单机迁移集群)
    redis5.0的槽点迁移,随意玩(单机迁移集群)
    []MongoDB优化的几点原则
    []MongoDB优化的几点原则
    当MongoDB遇见Spark
    当MongoDB遇见Spark
  • 原文地址:https://www.cnblogs.com/xkxf/p/6582309.html
Copyright © 2011-2022 走看看