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一下
这个问题,尚未明确,待确认。