JAVA中静态引用及发现的问题

JAVA中静态引用及发现的问题

java中静态引用

首先,看下下面的代码:

package com.mdjin.part5;

import static com.mdjin.util.Print.*;
import static java.lang.Math.abs;
/**
 * 演示finalize方法的使用
 * @author jinmaodong
 * @date 2020/5/24
 * @since 1.0.0
 **/
public class TerminationCondition {
    /**
     * main method
     */
    public static void main(String[] args) {
        Book book1 = new Book(true);
        book1.checkIn();
        new Book(true);
        System.gc();
    }
}


class Book{
    private boolean checkOut = false;

    Book(Boolean checkOut){
        this.checkOut = checkOut;
    }

    public void checkIn(){
        this.checkOut = false;
    }

    public boolean isCheckOut() {
        return checkOut;
    }

    public void setCheckOut(boolean checkOut) {
        this.checkOut = checkOut;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Error:check out");
        if(this.checkOut){
            //静态引用的方法打印不出来?
//            print("Error:check out");
            System.out.println(abs(-1));
        }
        super.finalize();
    }
}

看第二行、第三行代码,此处即是对指定包的指定方法执行静态引用;其关键在于import后面的static

import static com.mdjin.util.Print.*;
import static java.lang.Math.abs;

再看使用的代码,非静态引用和静态引用的区别在于要不要写对应的类名(节省代码量,但是增加了阅读难度)

            //未使用静态引用的调用方式
//          System.out.println(Math.abs(-1));
            //使用静态引用的调用方式
            System.out.println(abs(-1));

以上,MARK的关于静态引用的内容

发现的问题

接着看代码

package com.mdjin.part5;

import static com.mdjin.util.Print.*;
import static java.lang.Math.abs;
/**
 * 演示finalize方法的使用
 * @author jinmaodong
 * @date 2020/5/24
 * @since 1.0.0
 **/
public class TerminationCondition {
    /**
     * main method
     */
    public static void main(String[] args) {
        Book book1 = new Book(true);
        book1.checkIn();
        new Book(true);
        System.gc();
    }
}


class Book{
    private boolean checkOut = false;

    Book(Boolean checkOut){
        this.checkOut = checkOut;
    }

    public void checkIn(){
        this.checkOut = false;
    }

    public boolean isCheckOut() {
        return checkOut;
    }

    public void setCheckOut(boolean checkOut) {
        this.checkOut = checkOut;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Error:check out");
        if(this.checkOut){
            //静态引用的方法打印不出来?
//            print("Error:check out");
            //未使用静态引用的调用方式
//            System.out.println(Math.abs(-1));
            //使用静态引用的调用方式
            System.out.println(abs(-1));
            System.out.println("我是静态引用方法之后的代码。");
        }
        super.finalize();
    }
}

其输出为

"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" -javaagent:C:\work\soft\ideaIU-2019.2.1\lib\idea_rt.jar=57761:C:\work\soft\ideaIU-2019.2.1\bin -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar;D:\WORK\code\git\thinkInJava\target\classes" com.mdjin.part5.TerminationCondition
Error:check out

Process finished with exit code 0

可以发现以下代码没有输出结果

            System.out.println(abs(-1));
            System.out.println("我是静态引用方法之后的代码。");

现在,调整下代码,如下:

package com.mdjin.part5;

import static com.mdjin.util.Print.*;
import static java.lang.Math.abs;
/**
 * 演示finalize方法的使用
 * @author jinmaodong
 * @date 2020/5/24
 * @since 1.0.0
 **/
public class TerminationCondition {
    /**
     * main method
     */
    public static void main(String[] args) {
        Book book1 = new Book(true);
        book1.checkIn();
        new Book(true);
        System.gc();
    }
}


class Book{
    private boolean checkOut = false;

    Book(Boolean checkOut){
        this.checkOut = checkOut;
    }

    public void checkIn(){
        this.checkOut = false;
    }

    public boolean isCheckOut() {
        return checkOut;
    }

    public void setCheckOut(boolean checkOut) {
        this.checkOut = checkOut;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Error:check out");
        if(this.checkOut){
            //静态引用的方法打印不出来?
//            print("Error:check out");
            //未使用静态引用的调用方式
            System.out.println(Math.abs(-1));
            //使用静态引用的调用方式
//            System.out.println(abs(-1));
            System.out.println("我是静态引用方法之后的代码。");
        }
        super.finalize();
    }
}


输出结果为:

"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" -javaagent:C:\work\soft\ideaIU-2019.2.1\lib\idea_rt.jar=58455:C:\work\soft\ideaIU-2019.2.1\bin -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar;D:\WORK\code\git\thinkInJava\target\classes" com.mdjin.part5.TerminationCondition
Error:check out
1
我是静态引用方法之后的代码。

Process finished with exit code 0

对比以上,发现在finalize方法中,静态引用方式导入的方法及之后的代码是没有执行的。

mark一下

这个问题,尚未明确,待确认。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值