liujijiang

java学习笔记 --5-- 初始化与清理

2020.03.25

初始化和清理

使用未初始化的元素时,会出现很多问题,使用完元素不及时清理,会导致资源(尤其是内存)耗尽

使用构造器确保初始化

new一个对象时会为其分配空间,并且调用构造器
java中创建和初始化是捆绑在一起的,创建就意味着初始化

package com.company;



public class Main {


    public static void main(String[] args) {
	// write your code here

        for(int i=0;i<3;i++){
            new test(i);
        }
    }
}

class test{

    test(int i ){
        System.out.println(i);
    }
    
//    test(){
//        
//    }
}


如果声明了一个有参构造方法,默认的无参构造方法就会被覆盖
此时如果想使用无参构造器,就必须显式声明无参构造器

方法重载

区分方法重载

独一无二的参数类型列表
参数的顺序不同也可以实现方法重载(但是不推荐这种写法,难以维护)

当基本类型碰上构造器

package com.company;



public class Main {


    public static void main(String[] args) {
	// write your code here

        new test(3);
        new test('a');
    }
}

class test{

    test(int a){
        System.out.println( "int " + a);
    }

//    test(char a){
//        System.out.println("char " + a);
//    }
    
}


结果是:int 3 int 97
如果构造方法的参数类型为基本类型并且构造方法重载中没有这种类型的话,类型可能出现上升等级
char short byte 都是比 int 小的基本类型
如果构造方法重载中没有 char 或者 short 或者 byte 但是有int,那么在初始化的时候参数可以为char ,只不过会使用int的方法初始化,并且类型上升

package com.company;



public class Main {


    public static void main(String[] args) {
	// write your code here

        new test(3);
        new test('a');
    }
}

class test{

//    test(int a){
//        System.out.println( "int " + a);
//    }

    test(char a){
        System.out.println("char " + a);
    }

}


反过来类型无法窄化,编译器报错

不能根据返回值不同实现重载

void f() 和 int f() 编译报错,

如果你执行f(),编译器也不知道你要执行哪个方法

默认构造器

如果你没有创建构造器,编译器自动给你创建一个无参构造器
如果你创建了构造器,那编译器就不会给你创建构造器

this关键字

package com.company;



public class Main {


    public static void main(String[] args) {
	// write your code here

        Test a = new Test(), b = new Test();
        
        a.print(1);
        b.print(2);

    }
}

class Test{

    void print(int a){
        System.out.println(a);
    }


}


系统是怎么知道调用print方法的对象是谁呢
其实系统内部的实现是:Test.print(a,1) Test.print(b,2)

我们在类中可以使用this关键字表示对象

this: 调用方法的那个对象的引用

如果是使用类中的方法 没有必要使用this
当我们需要返回当前对象的引用时 才使用 this

构造器中使用构造器

package com.company;



public class Main {


    public static void main(String[] args) {
	// write your code here

        Test a = new Test(), b = new Test();

    }
}

class Test{

    int a;
    String b;
    
    Test(){
        
    };
    
    Test(int a){
        this.a = a;
    }
    
    Test(int a,String b){
        this(a);
        this.b = b;
    }

}

构造器中使用构造器,this指代构造器
this的另一个用法,如果参数和成员字段一样的话,this可以指代成员字段

static(静态)

static方法就是没有this 的方法
在static方法中不能调用非静态方法,反过来可以

想一想也知道为什么,static方法是在new的时候就创建的,但是如果你没有对这个对象进行引用也就没有this,这时候你在static中调用this就找不到this

使用类本身调用static方法,这也正是static方法的主要作用

static方法类似于全局方法,其实不太属于面向对象了(因为他没有对象,或者说所有对象都是他的对象)

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

java的垃圾回收器只会回收new出来的对象,如果某一块内存不是new出来的,垃圾回收器不会回收这块内存

java允许类中定义一个finalize()方法:如果准备释放这块内存,那么就会调用finalize,并在下一次回收动作发生时,回收内存
两点:

  • 对象可能不会被垃圾回收
  • 垃圾回收不等于析构

垃圾回收只跟内存有关

所以finalize方法的内容应该只跟内存有关

finalize方法使用场景:

  • 方法中有c或者c++的代码并且使用了malloc函数没有释放内存

  • 用来判断一个类的终结条件,finalize方法不一定执行,但是终结前一定执行,可以用来判断这个类是否可以被终结

垃圾回收不是一定发生的,如果内存充足,JVM可能不会浪费时间垃圾回收

垃圾回收

java的垃圾回收器会可以提高内存的分配速度

使得java的对象在堆中新建的速度可以和其他的语言在堆栈中新建对象的速度相媲美

enum

package com.company;


public class Main {

    public static final int VALUE_TEST = 1;

    public static void main(String[] args) {
	// write your code here
        Color color = Color.RED;
        System.out.println(color.ordinal());
        for(Color v : Color.values()){
            System.out.println(v);
        }
    }
}

enum Color{
    RED,BLUE,BLUCK;
}

  • ordinal:位置

未完。。。