Java基础(五)

119 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

1.Java中finalize方法

前沿:在面试过程中我们可能会被问到final、finally、finalize的区别?本篇文章将介绍finalize的简单用法。

  • Finalize()是Object类的方法。
  • 在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。
  • finalize()方法将重写以处理系统资源,执行清理活动并最大程度地减少内存泄漏。
  • 简单来说可在释放对象前进行某些操作。

代码举例:

public class FinalizeTest {
    public static void main(String[] args) {
        Student student = new Student("YuShiwen",21);
        System.out.println(student);
        student = null;//此时对象实体就是垃圾对象,等待被回收。但时间不确定。
        System.gc();//强制性释放空间

    }

}

class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    //子类重写此方法,可在释放对象前进行某些操作
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("进行某些操作!");
    }
}

输出结果:

Student{name='YuShiwen', age=21}
进行某些操作!

Process finished with exit code 0

垃圾回收机制关键点:

  • 垃圾回收机制只回收JVM堆内存里的对象空间。

  • 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力

  • 现在的JVM有多种垃圾回收实现算法,表现各异。

  • 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。

  • 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。

  • 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有 一些效果,但是系统是否进行垃圾回收依然不确定。

  • 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一 个新的引用变量重新引用该对象,则会重新激活对象)。

  • 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。

2.Java中包装类(Wrapper)的使用

java中的包装类提供了将原始数据类型转换为对象,以及将对象转换为原始数据类型的机制。

自J2SE 5.0以来,自动装箱和取消装箱功能将原始对象和对象自动转换为原始数据类型。将原始数据类型自动转换为对象称为自动装箱,反之亦然。

  • 针对八种基本数据类型定义相应的引用类型——包装类(封装类)
  • 有了类的特点,就可以调用类中的方法
  • 以下是8种基本数据类型对应的其包装类:
基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charCharacter

为什么需要包装类?

将原始类型和包装类分开以保持简单是一个明智的做法。当需要一个适合像面向对象编程的类型时就需要包装类。当希望数据类型变得简单时就使用原始类型。

原始类型不能为null,但包装类可以为null。包装类可用于实现多态性。

2.1.基本数据类型包装成包装类的实例 —— 装箱

基本数据类型 --->包装类:调用包装类的构造器

@Test
//基本数据类型 --->包装类:调用包装类的构造器
public void test0(){
    //通过包装类的构造器实现
    int i = 300;
    Integer t = new Integer(i);
    System.out.println(i);

    //通过字符串参数 构造 包装类对象
    Float f0 = new Float(3.88);
    Float f1 = new Float(3.88f);
    Float f2 = new Float("3.88");
    System.out.println(f0);
    System.out.println(f1);
    System.out.println(f2);

    Boolean b0 = new Boolean(true);
    Boolean b1 = new Boolean("TrUe");
    Boolean b2 = new Boolean("ture333");
    System.out.println(b0);
    System.out.println(b1);
    System.out.println(b2);

}

输出结果:

300
3.88
3.88
3.88
true
true
false

Process finished with exit code 0

2.2. 获得包装类对象中包装的基本类型变量 —— 拆箱

包装类--->基本数据类型:调用包装类的.xxxValue()方法

@Test
    public void test1(){
        Integer integer = new Integer(38);
        int i = integer.intValue();
        System.out.println(i);

        Float aFloat = new Float(13.14);
        float f = aFloat.floatValue();
        System.out.println(f);

        Boolean aBoolean = new Boolean(true);
        boolean b = aBoolean.booleanValue();
        System.out.println(b);
    }

输出结果:

38
13.14
true

Process finished with exit code 0

2.3.自动装箱,自动拆箱

JDK5.0之后,支持自动装箱,自动拆箱。但类型必须匹配。

@Test
    public void test2(){
        //自动装箱:基本数据类型 --->包装类
        int i = 10;
        Integer integer = i;//自动装箱

        boolean b = true;
        Boolean aBoolean = b;//自动装箱

        //自动拆箱:包装类--->基本数据类型
        System.out.println(integer);
        int i1 = integer;//自动拆箱
    }

2.4.基本数据类型、包装类与String之间的转换

2.4.1.基本数据类型、包装类--->String类型

  • 连接运算

  • 调用String重载的valueOf(Xxx xxx)

    @Test
    public void test3(){
        int num1 = 3;
        Byte num2 = new Byte("12");
        //连接运算
        String str1 = num1 + "";
        String str2 = num2 + "";
        //调用String重载的valueOf(Xxx xxx)
        String str3 = String.valueOf(num1);
        String str4 = String.valueOf(num2);
    }

2.4.2. String类型 --->基本数据类型、包装类

  • 调用包装类的parseXxx(String s)
@Test
public void test4(){
    String str1 = "123";
    int num1 = Integer.parseInt(str1);
    System.out.println(num1);

    String str2 = "true123";
    String str3 = "TrUE";
    boolean b1 = Boolean.parseBoolean(str2);
    boolean b2 = Boolean.parseBoolean(str3);
    System.out.println(b1);
    System.out.println(b2);
}

输出结果:

123
false
true

Process finished with exit code 0