zoukankan      html  css  js  c++  java
  • Java 初始化和清理

    初始化和清理是影响代码安全的两个重要因素。

    一、初始化

    1. 方法重载

      构造器与类名相同,成为强制重载方法名的原因之一。重载规则:每个重载的方法必须拥有独一无二的参数类型列表。不能根据返回值来区分重载方法。

      Java基本类型的自动提升:byte(1) -> short/char(2) -> int(4) -> long(8) -> float(4) -> double(8byte)

      假设有2个函数:print(char), print(int),   调用print('x')会执行第一个方法。
      假设只有print(int),  调用print('x')时char会自动提升为int类型
      假设只有print(char),使用高类型传参时需强制转换 print((char) 1)

    2. this关键字

    public class Leaf {
        int i;
        public Leaf(){
            this(10);     // 调用其他构造器
        }
        public Leaf(int i){
            this.i = i;   // 表示数据成员
        }
        public Leaf increment() {
            i++;
            return this;  // 返回当前对象的引用
        }
        public void print(){
            System.out.println("i = " + i);
        }
        public static void main(String[] args) {
            new Leaf().increment().increment().print();
        }
    }

    static方法不存在this,因此静态方法不能调用非静态方法,无法传递调用对象。

    3. 成员初始化

     

    初始化值

      方法的临时变量必须初始化,否则会编译失败。但类的成员变量会被赋予默认值如int=0,boolean=false,String=nul

      数组的初始化可以使用可变参数列表,无需显示编写数组语法,编译器会自动填充数组。

    public class Test {
    
        public static void main(String[] args) {
            print1(new String[]{"1", "2"});
            print2("1", "2");
            print2();
        }
        public static void print1(String[] args){
            System.out.println("print1: " + Arrays.toString(args));
        }
        public static void print2(String...args){  // 当不传参时,容易与下面的无参函数混淆,虽然编译器不报错,但使用时最好注意是否与其他函数冲突
            System.out.println("print2: " + Arrays.toString(args));
        }
        public static void print2(){ 
            System.out.println("print2 without params");
        }
    }

    初始化顺序

    1. 父类--静态变量
    2. 父类--静态初始化块
    3. 子类--静态变量
    4. 子类--静态初始化块
    5. 父类--变量
    6. 父类--初始化块
    7. 父类--构造器
    8. 子类--变量
    9. 子类--初始化块
    10. 子类--构造器
    class Parent {   
        public static String p_StaticField = "父类--静态变量";  
        public String p_Field = "父类--变量";   
        static {   
            System.out.println(p_StaticField);   
            System.out.println("父类--静态初始化块");   
        }  
    { System.out.println(p_Field); System.out.println("父类--初始化块"); } public Parent() { System.out.println("父类--构造器"); } } public class SubClass extends Parent { public static String s_StaticField = "子类--静态变量"; public String s_Field = "子类--变量"; static { System.out.println(s_StaticField); System.out.println("子类--静态初始化块"); }
    { System.out.println(s_Field); System.out.println("子类--初始化块"); } public SubClass() { System.out.println("子类--构造器"); } public static void main(String[] args) { new SubClass(); } }

    二、清理

    使用垃圾回收器的唯一原因是为了回收程序不再使用的内存,但Java里的对象并非总是被垃圾回收,只要程序没有濒临存储空间用完,对象占用的空间就总也得不到释放。  

    finalize()方法的工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

  • 相关阅读:
    jQuery相关知识点2
    自适应相关知识点1
    jQuery相关知识点1
    执行程序(例如UltraEdit)在WIN7下添加到右键菜单
    std::string 字符串大小写转换(转)
    Mathematica作图
    编写高效代码(大话处理器)
    关于make: *** No rule to make target `clean'. Stop.这个莫名其妙问题的解决方法
    网络编程 tcp udp 时间同步机制 代码
    python_控制台输出带颜色的文字方法
  • 原文地址:https://www.cnblogs.com/anxiao/p/6971869.html
Copyright © 2011-2022 走看看