文档章节

Final关键字对JVM类加载器的影响

chenganshi
 chenganshi
发布于 2016/09/10 19:12
字数 469
阅读 11
收藏 0

当一个类中有声明为static final的变量,这样的变量对类的加载器有一定的影响,首先看看下面的例子。

package com.bird.classLoad;

class FinalTest{
	
	public static final int a = 6/3;
	
	static{
		System.out.println("FinalTest static block");
	}
}

public class Test3 {
	public static void main(String[] args) {
		System.out.println(FinalTest.a);
	}
}

因为a是static final变量,且它等于6/3,在编译的时候就可以知道它的值,所以直接访问a的值不会引起FinalTest类的初 始化。作为表现,也就是static静态代码快不会被加载。 运行结果为 2

在看一个例子

package com.bird.classLoad;

import java.util.Random;

class FinalTest4{
	
	public static final int a = new Random().nextInt(100);
	
	static{
		System.out.println("FinalTest4 static block");
	}
}

public class Test4 {

	public static void main(String[] args) {
		System.out.println(FinalTest4.a);
	}
}

这个static final变量a因为i在编译的时候无法知道它的确切的值,所以只有等到运行的时候才能知道,所以自己访问 FinalTest4.a会引起FinalTest4类的初始化。也就是static静态代码快的加载。 运行结果为

FinalTest4 static block

82

下面的例子是讲,当子类被主动访问的时候,会引起其直接父类的初始化

package com.bird.classLoad;

class Parent{
	
	static int a = 3;
	
	static{
		System.out.println("Parent static block");
	}
}

class Child extends Parent{
	
	static int b = 4;
	static{
		System.out.println("Chind static block");
	}
}

public class Test5 {
	
	public static void main(String[] args) {
		System.out.println(Child.b);
		
	}
}

因为直接访问Child,b,会先初始化Parent类,然后初始化Child类。 运行结果为

Parent static block

Chind static block

4

如果通过子类直接访问父类的变量,只会初始化父类而不会初始化子类

package com.bird.classLoad;

class Parent{
	
	static int a = 3;
	
	static{
		System.out.println("Parent static block");
	}
}

class Child extends Parent{
	
	static{
		System.out.println("Chind static block");
	}
}

public class Test5 {
	
	public static void main(String[] args) {
		System.out.println(Child.a);
		
	}
}

直接访问Parent类的a变量,则只会直接初始化parent类,不会初始化Child类 运行结果如下

Parent static block

3

本文转载自:http://blog.csdn.net/a352193394/article/details/7342583

chenganshi
粉丝 2
博文 106
码字总数 38150
作品 0
闵行
程序员
私信 提问
两道面试题,带你解析Java类加载机制

文章首发于【博客园-陈树义】,点击跳转到原文《两道面试题,带你解析Java类加载机制》 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: 请写出最后的输出字符...

陈树义
2018/06/12
0
0
两道面试题,带你透彻解析Java类加载机制

  在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:   class Grandpa { static { System.out.println("爷爷在静态代码块"); } } class Father extends Gran...

java进阶架构师
2018/12/06
0
0
深入理解Java中的final关键字

final关键字的含义? final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再...

SkyWaiting
2014/01/04
248
2
Java基础-关键字final static与类加载分析

一、关键字final static 介绍 1. final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需...

陶邦仁
2012/12/01
1K
0
JVM系列第7讲:JVM 类加载机制

当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析、运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制。JVM 虚拟机执行 class 字节码的过...

陈树义
2018/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

15、SpringMVC进行json交互

SpringMVC进行json交互 json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。 请求json、输出json。要求请求的是json串,前端页面中需要将请求的内容转成json,...

快乐的瓶子
24分钟前
6
0
delphi版插apc杀进程驱动源码

从c代码转的,备份一下,里面有硬编码unit MyDriver;{$HINTS OFF}{$WARNINGS OFF}interfaceusesnt_status, ntoskrnl, native, winioctl, fcall, macros;typeTKILL = ...

simpower
28分钟前
3
0
带你上手一款下载超 10 万次的 IDEA 插件

作者 | 倪超(银时) 阿里云开发者工具产品专家 本文整理自 11 月 7 日社群分享,每月 2 场高质量分享,点击加入社群。 导读:Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效地开发、测试...

阿里云官方博客
29分钟前
3
0
GMAT语法7个常考重要考点分析

GMAT语法考点多,并非所有考点都值得重点关注。实际上GMAT语法存在一些高频考点,考生需要优先掌握它们才能更好地保证得分。同时GMAT备考中大家还需要培养连续做题的耐力。下面小编就来做具体...

bole6
33分钟前
3
0
最佳实践 | RDS & POLARDB归档到X-Pack Spark计算

X-Pack Spark服务通过外部计算资源的方式,为Redis、Cassandra、MongoDB、HBase、RDS存储服务提供复杂分析、流式处理及入库、机器学习的能力,从而更好的解决用户数据处理相关场景问题。 RD...

一肥仔
35分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部