`

java基础拾遗

    博客分类:
  • j2se
 
阅读更多
. 电梯直达   楼主
发表于 2012-1-28 13:02:26 |只看该作者 |倒序浏览 Code 属性用于 method_info 结构中。

4. Exceptions : attribute_info 被替代为 :

Exceptions_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 number_of_exceptions;

u2 exception_index_table[number_of_exceptions];

}

5. InnerClasses : attribute_info 被替代为 :

InnerClasses_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 number_of_classes;

{ u2 inner_class_info_index;

u2 outer_class_info_index;

u2 inner_name_index;

u2 inner_class_access_flags;

} classes[number_of_classes];

}

6. Synthetic : attribute_info 被替代为 :

Synthetic_attribute {

u2 attribute_name_index; // 不用废话了吧 ?

u4 attribute_length; // 必须为 0

}

Synthetic 用在 field_info 、 method_info 中,

一个没有出现在源程序中的变量必须使用 Synthetic 标记。

7. LineNumberTable : attribute_info 被替代为 :

LineNumberTable_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 line_number_table_length;

{ u2 start_pc; // 代码数组中的开始处

u2 line_number; // 源文件中的行号 ( 对于每一非空行都有这么一项 )

} line_number_table[line_number_table_length];

}

LineNumberTable 用于 Code 属性中,通常用于调试。

8. LocalVariableTable : attribute_info 被替代为 :

LocalVariableTable_attribute {

u2 attribute_name_index;

u4 attribute_length;

u2 local_variable_table_length;

{ u2 start_pc;

u2 length; // 当解释到代码数组的 [start_pc,start_pc+length]

// 时变量必须被赋值 ??

u2 name_index;

u2 descriptor_index;

u2 index; // 到本地变量数组的一个索引

} local_variable_table[local_variable_table_length];

}

 

9. Deprecated : attribute_info 被替代为 :

Deprecated_attribute {

u2 attribute_name_index;

u4 attribute_length; // 必须为 0

}

当然也可以定义自己的属性,但要你自己的编译器和虚拟机实现。 JVM 将忽略自己不认可的属性。

以上是关于 Javaclass 文件的一个基本结构的分析。主要是对书上关于这一章的总结,同时参考了 : http://hi.baidu.com/52dege/blog/item/f33a3cf4092491dbf3d3854f.html 等网上资料。

看一个 java classfile 有助于我们理解的实际例子:
代码 1 :

[java] view plaincopyprint?
public class StringTest { 
    /**
     * @param args
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub  
        String a = "aaabbb"; 
        String b = "aaabbb"; 
        System.out.println(a == b); 
        System.out.println(a.equals(b)); 
    } 
  
}  
public class StringTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String a = "aaabbb"; String b = "aaabbb"; System.out.println(a == b); System.out.println(a.equals(b)); } }

运行结果为 :true true

代码 2 :

[java] view plaincopyprint?
public class StringTest { 
    /**
     * @param args
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub  
        String a = "aaabbb"; 
        String b = "aaa"; 
        b += "bbb"; 
        System.out.println(a == b); 
        System.out.println(a.equals(b)); 
    } 
  
}  
public class StringTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String a = "aaabbb"; String b = "aaa"; b += "bbb"; System.out.println(a == b); System.out.println(a.equals(b)); } }

运行结果为 :false true

关于代码 1 和代码 2 的解释:


Java 编译器在生成 class 文件的时候对代码里面定义的字符串都会作为一个字符串常量存放在常量池中。

对于代码 1 中的   String a = "aaabbb"; 和 String b = "aaabbb"; 预处理在编译处理后, a 和 b 都指向了常量池里的 ”aaabbb” ,所以 a==b 是 true.

对于代码 2 中的 String b = "aaa"; b += "bbb"; 编译处理后会在常量池里面生成 ”aaa” 和 ”bbb”, 同时, b += "bbb"; 语句会导致 Jvm 去重新创建一个 string 对象,相当于 b=new String(“aaabbb”); 自然, aaa==bbb 是 false 。这也是为什么不推荐使用加号来拼接字符串了
分享到:
评论

相关推荐

    11.java基础拾遗--匿名内部类语法详解.mp4

    11.java基础拾遗--匿名内部类语法详解.mp4

    09.java基础拾遗--类的加载和对象的构造过程.mp4

    09.java基础拾遗--类的加载和对象的构造过程.mp4

    10.java基础拾遗--匿名内部类的应用--实现scala中的集合map方法.mp4

    10.java基础拾遗--匿名内部类的应用--实现scala中的集合map方法.mp4

    java知识拾遗-三大框架的技术起源.docx

    Struts框架是在JSP+Servlet+Javabean模式的基础上发展起来的,为了解决JSP页面中Java代码混乱、Servlet和Javabean耦合度过高、程序复用性低等问题。Struts引入了一个中央控制器Servlet,Action类负责业务逻辑,Form...

    Java JDK 6.0 学习笔记.pdf

    Java JDK(Java Development Kit)是Java编程语言的核心组件,包含Java运行环境、编译器、类库以及各种工具,是开发者进行Java程序开发的基础。Java JDK 6.0是Oracle公司发布的一个重要版本,提供了许多新的特性和...

    超值个人java学习笔记

    【Java基础】 Java语言是面向对象的编程语言,其基础包括语法、数据类型、变量、运算符、控制结构等核心概念。在"Java基础"部分,你可以学习到如何声明和初始化变量,如整型(int)、浮点型(float)、字符型(char)和...

    java面试进阶讲义

    #### 一、Java语言拾遗 ##### 1、Vector与ArrayList - **起源与版本**:`Vector` 类自 JDK 1.0 就已存在,从 Java 2 平台 v1.2 开始进行了改进,实现了 `List` 接口,使其成为 Java Collections Framework 的一...

    浙江大华笔试题Java-learn:前端学习

    基础拾遗 1.1. JavaScript 1.2. CSS 1.3. 浏览器 工程化与工具 2.1. webpack 2.2. Gulp 2.3. Linter 2.4. 静态类型(Typescript/Flow) 2.5. Babel 2.6. CSS预处理与模块化 性能优化 3.1. 加载性能 3.2. 运行时性能 ...

    jdktools .zip

    这个文件包含了Java开发工具集(Java Development Kit, JDK)中众多命令行工具和基础服务的实现,如编译器(javac)、反编译器(javap)、打包工具(jar)等。本文将深入探讨`tools.jar`的内容及其在Java开发中的...

    《UML建模实例教程》【PPT】

    第2章面向对象技术和建模基础 2.1面向对象方法 2.1.1面向对象方法的基本思想 2.1.2面向对象方法的发展 2.2面向对象的基本概念与特征 2.2.1面向对象的基本概念 2.2.2面向对象的主要特征 2.3面向对象分析 ....

    2018年下半年软件设计师真题和答案.rar

    2. **编程语言和框架**:可能涉及到主流编程语言(如Java、C++、Python)的基本语法和特性,以及常用的开发框架(如Spring、Django等)的应用。 3. **数据结构与算法**:理解并应用基本的数据结构(如数组、链表、...

Global site tag (gtag.js) - Google Analytics