博文转载: http://www.importnew.com/1796.html
总结:
1.
public class ConstantFolding { static final int number1 = 5; static final int number2 = 6; static int number3 = 5; static int number4= 6; public static void main(String[ ] args) { int product1 = number1 * number2; //line A int product2 = number3 * number4; //line B } }
win+r -> javac ConstantFolding.java -> 使用反编译器打开 ConstantFolding.class
public class ConstantFolding { static final int number1 = 5; static final int number2 = 6; static int number3 = 5; static int number4 = 6; public static void main(String[ ] args) { int product1 = 30; int product2 = number3 * number4; System.out.println(product1 + " "+product2); } }
说明:
(1)执行java ConstantFolding,两者结果都为30
但product1的值是在编译期计算的,product2则是在运行时计算的
(2)原因:常量折叠是一种Java编译器使用的优化技术。由于final变量的值不会改变,因此就可以对它们优化。
2.编译时与运行时
说明:
(1)一个java文件的编译执行过程
Test.java(Java文件) -> javac.exe -> Test.class(字节码文件)-> java -> 运行结果
注:java 执行时,文件不加后缀名.class
原因:java执行中规定,java xxx.yyy ,xxx.yyy表示yyy类在xxx包内,即 java Test.class表示执行 Test包中的class类
小技巧:
在java源文件所在文件夹建立一个记事本文档,输入以下3行代码
javac HelloWorld.java
java HelloWorld
@pause
将其保存为"Java运行批处理.bat"
然后双击这个批处理文件,将出现cmd窗口下的编译运行结果
(2)图中概念解析
a.JDK(java development kit)Java 语言的软件开发工具包
具体参考:
百度知道JDK
b.JRE(Java Runtime Environment,Java运行环境)
具体参考:
百度知道JRE
c.JVM(Java Virtual Machine,Java虚拟机)
具体参考:
百度知道JVM
d.JIT Compiler(Just-in-time Compiler) 即时编译
具体参考:
百度知道JIT
e.
JDK、JRE与JVM的区别
JIT的概念
3.常见发生在编译时或运行时的概念
编译时 | 运行时 |
方法重载 | 方法重写 |
@Override | @Test |
泛型构造 | 代理 |
继承 | 组合 |
(1)查看编译过的代码的作用
a.代码优化
b.解决泛型相关的问题
(2) 方法重载与方法重写
(3)泛型
Test.java
public static void main(String[] args) { Listlist = new ArrayList (); list.add("1"); list.add("1"); list.add("1"); list.add("1"); list.add("1"); for(String str : list){ System.out.println(str); } }
Test.class
public static void main(String[] paramArrayOfString) { ArrayList localArrayList = new ArrayList(); localArrayList.add("1"); localArrayList.add("1"); localArrayList.add("1"); localArrayList.add("1"); localArrayList.add("1"); for (Iterator localIterator = localArrayList.iterator(); localIterator.hasNext(); ) { String str = (String)localIterator.next(); System.out.println(str); } }
(4)
继承 – 发生在编译时,因为它是静态的
代理或者组合 – 发生在运行时,因为它更加具有动态性和灵活性。
(5)注解
@Override是一个简单的编译时注解,它可以用来捕获类似于在子类中把toString()写成tostring()这样的错误。在Java 5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译时进行处理。到了Java 6,这个功能已经是编译器的一部分了。
@Test是JUnit框架用来在运行时通过反射来决定调用测试类的哪个(些)方法的注解。
(6)其他内容