存在这么一个类:
public class test2 {
public int noStaticNum = printNoStaticNum();
public static int staticNum = printStaticNum();
public static final int aaa = 111 ;
public final int bbb = 222 ;
static {
System.out.println("执行静态块!");
}
public static int printStaticNum() {
System.out.println("execute printStaticNum() method !");
return 1;
}
public int printNoStaticNum() {
System.out.println("execute printNoStaticNum() method !");
return 1;
}
public static void main(String[] args) {
}
}
1、类的实例化 test2 t1 = new test2() ;
实例化的结果是打印:
execute printStaticNum() method !
执行静态块!
execute printNoStaticNum() method !
实例化过程其实分开了说有两个过程:类加载和实例化的过程
类加载的过程大概包括以下过程(详情可以参考深入JVM这本书):
* 1、把字节码文件转换为二进制文件
* 2、在方法区中形成内部数据结构.(类中局部变量、方法、父类引用等)
* 3、验证类文件中数据合法性
* 4、初始化的过程(主要给静态变量和静态块初始化)
实例化的过程包括:
* 1、实例化主要的工作是在内存堆中生成一个对象实例
* 2、生成的实例会进行内部局部变量的初始化等
进行运行结果的验证:
直接执行这个类的结果是:
execute printStaticNum() method !
执行静态块!
可以发现运行main()并没有对局部变量进行初始化,那么是否运行main()没有实例化呢?内存中是否存在test2的对象呢?如果存在,又是一个什么样的形态呢?今天没时间了,以后验证吧!
2、Class.forName()和newInstance()
Class.forName()方法是加载的过程
newInstance()是一个实例化的过程
//利用默认的构造器生成对象
test2 t2 = (test2)Class.forName("com.sudongyuan.test2").newInstance();
//如果类中有多个构造器可以选择相应的构造器生成对象
test2 t3 = (test2)Class.forName("com.sudongyuan.test2").getConstructors()[0].newInstance("");
3、反射机制,利用方法名调用对象方法
Class a = Class.forName("com.sudongyuan.test2") ;
Method b = a.getMethod("printNoStaticNum",null);
b.invoke(a.newInstance(), null);
4、验证静态变量和非静态变量的区别(还有final变量)
/* 验证静态变量和非静态变量的区别
* 1、静态变量是所有的类实例共享,其中一个实例对其进行了修改会在别的类实例中反映出来
* 2、非静态变量是实例独享,对其的改动不会反映到别的对象中
* 3、final变量不能进行重新附值,所以在使用中final int a = 0 和final static int a = 0
* 应该是一样的。区别是
* */
test2 f = (test2)a.newInstance() ;
f.staticNum = 99000 ;
f.noStaticNum = 29999 ;
System.out.println(((test2)a.newInstance()).staticNum + " " + ((test2)a.newInstance()).noStaticNum );
打印的结果是:99000 1
类中有这两个final变量
public static final int aaa ;
public final int bbb ;
对static final aaa,根据有的书中介绍说在编译时候就会把aaa转换为常量定义形式,但是在编译后的Class文件中,aaa并没有转换(这个还有待以后验证)。
那么aaa和bbb有什么区别呢?根据static的区别,是不是aaa是所有实例共享呢?
但是既然是常量,那么就无所谓共享不共享了。因为所有aaa都是相同的值。所以,aaa和bbb在使用上是完全一样的了。
只不过bbb是对象实例私有的,存放在堆空间的对象中,而aaa则是和一般的static一样存放在方法区中,以待对象的调用,加了一层限制,不允许调用的对象改变值罢了。
分享到:
相关推荐
2.我们发现main()方法在X类中,要执行main()方法,还得先将X类加载到内存中。 3.X类加载完成后,会做什么事情呢?别急,先来看看static的作用,不知道吧。告诉你:static就是在类被第一次加载的时候执行,以后就...
java 类加密 使用类加载器解密加载类 反射执行main
非常不错的参考资料,看过了,现在分享一下
最近项目需要,自己根据网上找的代码,自己改了一下,主要是把jar包的加载改成了循环加载,而不是一句句写。亲测可用。
主要介绍了Vue.js 关于页面加载完成后执行一个方法的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
非static,存在于对象,所以,一个类加载就有的方法里,使用一个新建对象后才有的方法或变量,那是很不合理的。类里面的static代码块,会在类加载后按顺序执行
第一章从开机加电到Main函数执行前 ...BIOS --创建中断向量和中断描述符表,加载第一扇区代码bootsect bootsect 规划内存,加载第2--5扇区 setup,加载之后的大约240个扇区内核 开始向32位模式转变,为main的执行做准备
方法区保存已加载的类信息、常量、静态变量和编译后的代码数据;栈是线程私有的内存区域,每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接等信息;程序计数器是线程私有的,用于记录当前...
SpringBoot特性以及它与Spring、SpringMVC的区别 Jvm类加载机制 Java中的锁机制 Java按行读取txt中的内容 ... - 当虚拟机启动时,用户需要指定一个需要执行的主类(包含main方法的那个类)虚拟机会先初始化这个类
可执行WAR文件的演示这是可执行WAR文件的演示。 它使用自定义类加载器从Web存档(WAR)中的备用路径或JAR加载类。... 它包含Main-Class条目,以表示包含main()方法的类。 此外,还有一个Bootstrap类,负责从备
本文通过四种方法给大家介绍java命令执行jar包的方式,每种方法通过实例代码给大家详解,需要的朋友参考下吧
下载导入就可以用,执行test类的main方法加载spring applicationContext.xml配置文件,启动Quartz定时器.修改spring配置文件的配置时间.详细看注释
写一个单元测试类,命名方式:XxxTest(测试类没有main方法) 2. 导入包,Junit4包 选中项目,右键 => Build Path => Add Library => 选中Junit 选中Junit4 => finish 3. 在测试类中,设计测试方法,...
任务九:使用集合的方法(ArryList集合对类对象Member和Goods类) 完成淘宝shopping”购物管理系统购物结算模块和客户管理模块 1.需要完成的任务 开发“淘宝Shopping购物管理系统”: (1)实现系统数据传递 (2)...
在main.js中引入 import Vant from 'vant'; import 'vant/lib/index.css'; Vue.use(Vant); 3.在页面中使用 官方写的比我写的好多了,大家可以借鉴,看源代码可能比官方给的文档更直观 官方文档 我在文件中的使用,...
如何在main方法执行前输出”hello world” java程序的初始化顺序 请说出作用域public,private,protected,以及不写时的区别 为什么java中有些接口没有任何方法 java中的clone方法有什么作用 面向对象有哪些特征 ...
MiniJVMMiniJVM是一款使用python编写的简易JVM,...如下:[-h] ==> 查看帮助[-v] ==> 查看版本信息[-d] ==> 开启指令执行debug,开启之后可以看到类加载和指令执行的过程[-cp] ==> class文件的目录路径[-cn] ==> 目标
print 'this is our main function' if __name__ == '__main__': mymain() 相反,你可以这样做: from automain import * # will only import the automain decorator @automain def mymain(): print 'this is ...
1:虚拟机加载OOPDemo类(省略详细加载过程(装载、链接、初始化)),提取类型信息(具体保存哪些类型信息查看博文:Java虚拟机体系结构),存储到方法区中,对应图中的绿色矩形区域。 2:通过保存在方法区的字节...
运行一个.NET应用程序或者运行库宿主时,OS会首先建立一个进程,然后会在进程中加载CLR(这个...程序的Main方法就是在这里执行,这个默认的AppDomain是唯一且不能被卸载的,当该进程消灭时,默认AppDomain才会随之消失。