运行时与编译时

运行时与编译时

博文转载: 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) {
		List<String> list = new ArrayList<String>();
		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)其他内容

猜你喜欢

转载自mingyundezuoan.iteye.com/blog/2211948