zoukankan      html  css  js  c++  java
  • thinking in java笔记 5 初始化与清理

    方法重载
          重载的原因:
               1)相同的方法名可包含不同的含义,不能要求具有细微差别的方法都具有不同的方法名。
               2)构造器名由类名决定,只能由一个构造器名,想用多种方式创建一个对象,必须实现重载。
          每个重载的方法必须有独一无二的参数类型列表。参数类型列表包括类名和方法的形参列表,不包含返回值类型。因为有时你并不关心方法的返回值,想要的只是方法调用的其他效果(为了副作用而调用),这时你可能会调用方法而忽略其返回值。如void f() {}; int f() {},当调用f()时则区分调用的是哪个方法。
          涉及基本类型的重载:
             如果传入的数据类型小于方法中声明的形参类型,实际数据类型就会提升。char型不同,如果无法找到恰好接受char参数的方法,则把char直接提升至int型。如果传入的实际参数类型较大,则必须通过类型转换来执行窄化转换,否则会报错。
    构造器和this
          如果没有定义构造器,则编译器创建一个默认构造器(无参),如果自定义了构造器,编译器则不创建。
          在构造器中可调用其他的构造器,如this(); this(3)。注意:Constructor call must be the first statement in a constructor。
          构造函数可为private,如单例模式中。用于不想被直接创建对象的类中,此类也不可被extends。
    清理
        1)finalize()与析构函数
          一旦gc准备好释放对象占用的存储空间,将调用finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
          在C++中,对象一定会被销毁,而java中的对象却不一定会被垃圾回收。
          因此,在java中,在你不再需要某个对象之前,如果必须执行某些动作,必须自己创建清理方法。
        2)finalize用途
          无论对象如何创建,gc都负责释放对象占据的所有内存。
          在java中调用非java代码时,使用finalize来释放存储空间(c,c++ free()方法来释放)。
          finalize可用于验证终结条件,清理对象时来验证是否有未适当清理的部分。、
        3)gc
          其他语言中,在堆上分配对象的代价很高,java中不是,gc有助于提高对象的创建速度,达到其他语言在堆栈上分配空间的速度。
    • 初始化
        初始化顺序:静态对象 成员变量,构造函数
        成员变量有默认初始化值,局部变量没有。
        
    对象的创建过程
    1)java解释器查找类路径,定位 Dog.class文件
    2)载入Dog.class,执行静态初始化的所有动作(首次加载的时候创建)
    3)new Dog()创建对象的时候,首先在堆上未Dog对象分配足够的存储空间。
    4)这块存储空间被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值
    5)执行所有出现于字段定义处的初始化动作
    6)执行构造器
    静态子句:java中允许将多个静态初始化动作组织成一个静态子句。如:
    也有非静态实例初始化:
    public class Spoon{
        static int i;
        static {    //静态子句
          i=8;
         }
        int j;
        {    //非静态实例初始化
          j=6;
        }
    }
         这种语法对于支持匿名内部类是必须的。
    数组初始化
          编译器不允许指定数组的大小。数组定义的是一个引用。
          若在编写程序时,不能确定数组内元素个数,可以用new在数组内创建元素。
          int[] a;    a=new int[new Random(40).nextInt(20)];
          数组的创建是在运行时刻进行的,数组中的基本类型数据类型值会自动初始化为空值。
          如果忘记创建对象,并试图使用数组中的空引用,会在运行时产生异常。可以用花括号括起来的列表来初始化对象数组,Integer[] b={new Integer(1),new Integer(3),4}.初始化列表的最后一个逗号是可选的(使长列表更易于维护)。
          可变参数列表:
             不用再显式编写数组语法,指定参数时,编译器会自动填充数组。
             void printArray(Object... args){
               for(Object obj:args)
                  //do  something
                   }
             printArray(new Integer(46),new Float(4.2));
    枚举类型
          常见enum时,编译器会自动添加一些有用的特性,如toString();ordinal();
          enum是类,在生成时添加了一些编译器行为。enum与switch搭配使用最为合适。
          另外经常使用enum来配置常量字符串。
    public static enum Relationship {
    GoodFriend(" 亲密好友 "), CommonFriend(" 普通朋友 "), BLACK(" 不受欢迎 ");
    private String v;

    Relationship(String value) {
    v = value;
    }

    @Override
    public String toString() {
    return v;
    }
    }


  • 相关阅读:
    JavaScript访问ab页面定时跳转代码
    http协议相关-待续
    curl发送get和post请求
    Java入门——动态网页jsp(jdk下载和配置环境变量)
    LeetCode:Best Time to Buy and Sell Stock
    LeetCode:Reverse Integer
    LeetCode:Same Tree
    LeetCode:Single Number II
    LeetCode:Single Number
    LeetCode:Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/myparamita/p/2203940.html
Copyright © 2011-2022 走看看