- 浏览: 253321 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
mabusyao:
漠北空城 写道请问下,你这个是JDK版本是多少呢?!忘记了,应 ...
HashMap 源码解读 -
漠北空城:
请问下,你这个是JDK版本是多少呢?!
HashMap 源码解读 -
schumee:
完美团队~
项目沉思录 - 1.1 -
winie:
整理下 搞成引擎嘛 国产需要这样的engine
简单工作流引擎 -
mabusyao:
某位同学给我提供的堪称完美的解决方案:1. 将三个int数组放 ...
CraneWork
今天在论坛上看到的几个题,有几个貌似还挺有意思的。
x == hello:true
a == helloworld:true
a == x+y:false
请看翻译过的源码:
对于String常量,包括“hello”+“world”这种方式的的值(第54行),都被设置为常量。然而对于x+y这种方式,其实首先是创建了一个StringBuilder,然后把两个变量都加到StringBuilder内,再转换成String。此时,就形成了一个新的String对象了。equals方法也就不适用了。
三、Override覆盖
parent static say
child say
所谓静态方法,并不仅仅指该方法在所有实例中只有一份,同时也指该方法是“静态”加载的,即在编译期就已决定其行为。此处p的静态类型为Parent,所以它所调用的方法也在编译期和Parent的say()方法绑定:
六、提前引用
first = 0
这段代码有点诡异,但明白万变不离其宗,只要牢记静态方法&变量是“静态”加载的,即编译时就决定的即可。当然,对于静态变量的这种先定义后赋值的行为,还是需要小心:
看这段代码也许更加直观点:
编译后的代码:
七、对象引用
ab,b
ab,ab
这段代码就十分简单了,明白了引用拷贝就知道原因了。
public static void test() { String x = "hello"; String y = "world"; String z = new String("helloworld"); String a = "helloworld"; System.out.println("x == hello:" + (x == "hello")); System.out.println("a == helloworld:" + (a == "hello" + "world")); System.out.println("a == x+y:" + (a == (x + y))); }
x == hello:true
a == helloworld:true
a == x+y:false
请看翻译过的源码:
public static void test(); 0 ldc <String "hello"> [15] 2 astore_0 [x] 3 ldc <String "world"> [17] 5 astore_1 [y] 6 ldc <String "helloworld"> [19] 8 astore_2 [a] 9 getstatic java.lang.System.out : java.io.PrintStream [21] 12 new java.lang.StringBuilder [27] 15 dup 16 ldc <String "x == hello:"> [29] 18 invokespecial java.lang.StringBuilder(java.lang.String) [31] 21 aload_0 [x] 22 ldc <String "hello"> [15] 24 if_acmpne 31 27 iconst_1 28 goto 32 31 iconst_0 32 invokevirtual java.lang.StringBuilder.append(boolean) : java.lang.StringBuilder [34] 35 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38] 38 invokevirtual java.io.PrintStream.println(java.lang.String) : void [42] 41 getstatic java.lang.System.out : java.io.PrintStream [21] 44 new java.lang.StringBuilder [27] 47 dup 48 ldc <String "a == helloworld:"> [47] 50 invokespecial java.lang.StringBuilder(java.lang.String) [31] 53 aload_2 [a] 54 ldc <String "helloworld"> [19] 56 if_acmpne 63 59 iconst_1 60 goto 64 63 iconst_0 64 invokevirtual java.lang.StringBuilder.append(boolean) : java.lang.StringBuilder [34] 67 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38] 70 invokevirtual java.io.PrintStream.println(java.lang.String) : void [42] 73 getstatic java.lang.System.out : java.io.PrintStream [21] 76 new java.lang.StringBuilder [27] 79 dup 80 ldc <String "a == x+y:"> [49] 82 invokespecial java.lang.StringBuilder(java.lang.String) [31] 85 aload_2 [a] 86 new java.lang.StringBuilder [27] 89 dup 90 aload_0 [x] 91 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [51] 94 invokespecial java.lang.StringBuilder(java.lang.String) [31] 97 aload_1 [y] 98 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [57] 101 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38] 104 if_acmpne 111 107 iconst_1 108 goto 112 111 iconst_0 112 invokevirtual java.lang.StringBuilder.append(boolean) : java.lang.StringBuilder [34] 115 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38] 118 invokevirtual java.io.PrintStream.println(java.lang.String) : void [42] 121 return
对于String常量,包括“hello”+“world”这种方式的的值(第54行),都被设置为常量。然而对于x+y这种方式,其实首先是创建了一个StringBuilder,然后把两个变量都加到StringBuilder内,再转换成String。此时,就形成了一个新的String对象了。equals方法也就不适用了。
三、Override覆盖
public class Parent { public static String say() { return "parent static say"; } public String say2() { return "parent say"; } } public class Child extends Parent { public static String say() { return "child static say"; } public String say2() { return "child say"; } } public class OverrideTest { public static void main(String[] args) { Parent p = new Child(); System.out.println(p.say()); System.out.println(p.say2()); } }
parent static say
child say
所谓静态方法,并不仅仅指该方法在所有实例中只有一份,同时也指该方法是“静态”加载的,即在编译期就已决定其行为。此处p的静态类型为Parent,所以它所调用的方法也在编译期和Parent的say()方法绑定:
// Method descriptor #15 ([Ljava/lang/String;)V // Stack: 2, Locals: 2 public static void main(java.lang.String[] args); 0 new com.ibm.oneteam.Child [16] 3 dup 4 invokespecial com.ibm.oneteam.Child() [18] 7 astore_1 [p] 8 getstatic java.lang.System.out : java.io.PrintStream [19] 11 invokestatic com.ibm.oneteam.Parent.say() : java.lang.String [25] 14 invokevirtual java.io.PrintStream.println(java.lang.String) : void [31] 17 getstatic java.lang.System.out : java.io.PrintStream [19] 20 aload_1 [p] 21 invokevirtual com.ibm.oneteam.Parent.say2() : java.lang.String [37] 24 invokevirtual java.io.PrintStream.println(java.lang.String) : void [31] 27 return
六、提前引用
public class ForwardReference { static int first = test(); static int second = 2; static int test() { return second; } public static void main(String[] args) { System.out.println("first = " + first); } }
first = 0
这段代码有点诡异,但明白万变不离其宗,只要牢记静态方法&变量是“静态”加载的,即编译时就决定的即可。当然,对于静态变量的这种先定义后赋值的行为,还是需要小心:
public class com.ibm.oneteam.Main { // Field descriptor #6 I static int first; // Field descriptor #6 I static int second; // Method descriptor #9 ()V // Stack: 1, Locals: 0 static {}; 0 invokestatic com.ibm.oneteam.Main.test() : int [11] 3 putstatic com.ibm.oneteam.Main.first : int [15] 6 iconst_2 7 putstatic com.ibm.oneteam.Main.second : int [17] 10 return Line numbers: [pc: 0, line: 5] [pc: 6, line: 6] [pc: 10, line: 3] // Method descriptor #9 ()V // Stack: 1, Locals: 1 public Main(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [22] 4 return Line numbers: [pc: 0, line: 3] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.ibm.oneteam.Main // Method descriptor #14 ()I // Stack: 1, Locals: 0 static int test(); 0 getstatic com.ibm.oneteam.Main.second : int [17] 3 ireturn Line numbers: [pc: 0, line: 9]
看这段代码也许更加直观点:
public class Main { static int first = test(); static int second = 2; static int test() { return second; } static int third = 3; public static void main(String[] args) { System.out.println("first = " + first); } }
编译后的代码:
// Compiled from Main.java (version 1.6 : 50.0, super bit) public class com.ibm.oneteam.Main { // Field descriptor #6 I static int first; // Field descriptor #6 I static int second; // Field descriptor #6 I static int third; // Method descriptor #10 ()V // Stack: 1, Locals: 0 static {}; 0 invokestatic com.ibm.oneteam.Main.test() : int [12] 3 putstatic com.ibm.oneteam.Main.first : int [16] 6 iconst_2 7 putstatic com.ibm.oneteam.Main.second : int [18] 10 iconst_3 11 putstatic com.ibm.oneteam.Main.third : int [20] 14 return Line numbers: [pc: 0, line: 5] [pc: 6, line: 6] [pc: 10, line: 12] [pc: 14, line: 3] // Method descriptor #10 ()V // Stack: 1, Locals: 1 public Main(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [25] 4 return Line numbers: [pc: 0, line: 3] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.ibm.oneteam.Main // Method descriptor #15 ()I // Stack: 1, Locals: 0 static int test(); 0 getstatic com.ibm.oneteam.Main.second : int [18] 3 ireturn Line numbers: [pc: 0, line: 9] // Method descriptor #30 ([Ljava/lang/String;)V // Stack: 4, Locals: 1 public static void main(java.lang.String[] args); 0 getstatic java.lang.System.out : java.io.PrintStream [31] 3 new java.lang.StringBuilder [37] 6 dup 7 ldc <String "first = "> [39] 9 invokespecial java.lang.StringBuilder(java.lang.String) [41] 12 getstatic com.ibm.oneteam.Main.first : int [16] 15 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [44] 18 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [48] 21 invokevirtual java.io.PrintStream.println(java.lang.String) : void [52] 24 return Line numbers: [pc: 0, line: 15] [pc: 24, line: 16] Local variable table: [pc: 0, pc: 25] local: args index: 0 type: java.lang.String[] }
七、对象引用
public class TestRef { public static void main(String[] args) { StringBuffer a = new StringBuffer("a"); StringBuffer b = new StringBuffer("b"); append(a, b); System.out.println(a.toString() + "," + b.toString()); b = a; System.out.println(a.toString() + "," + b.toString()); } public static void append(StringBuffer a, StringBuffer b) { a.append(b); b = a; } }
ab,b
ab,ab
这段代码就十分简单了,明白了引用拷贝就知道原因了。
发表评论
-
各种语言写的wordcount
2015-09-24 16:07 0Java版本: String input ... -
数组双指针算法的研究
2015-07-14 16:59 2461双指针算法在数组/链 ... -
初识ThreadLocal
2015-07-07 13:15 1516最近公司在进行Java开发人员的招聘活动,其中有一道面试题 ... -
摩尔投票法
2015-06-30 20:13 18413摩尔投票法 提问: 给定一个int型数组,找出该数 ... -
小心寄存器
2012-11-08 13:53 4试试这段代码就知道了 public cla ... -
简单工作流引擎
2012-07-06 16:58 2414从公司的一个项目中挖出来的工作流引擎的代码,虽然是一个很简单的 ... -
Always clean the ThreadLocal variables.
2012-05-24 09:16 1217Any variable stored in ThreadLo ... -
STRUTS2 源码 - Logging System
2012-05-24 08:51 1405看了STRUTS2的源码,了解了它的logging系统,觉得还 ... -
在线词典的数据结构实现。
2012-05-18 08:37 0昨天在网上看到了一道百度的面试题: Baidu写道 ... -
Log4j 代码学习 - Factory
2012-05-17 08:47 1110我们最早提到,Log4j的初始代码在LogManager的静态 ... -
Log4j 代码学习 - Appender
2012-05-16 09:09 1356在上一篇文章里,我们 ... -
Log4j 代码学习
2012-05-15 14:58 1162最近闲来无事,正好手头上有Log4j的代码,于是就拿来学习了下 ... -
java7中的ThreadLocalRandom(转)
2012-01-20 09:08 4348今天早上看到一个关于java7中的ThreadLocalRan ... -
(转)追MM与23种设计模式
2011-11-16 14:13 9991、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德 ... -
(转)Java 参数列表
2011-11-05 19:48 2926下面的讨论以Windows ... -
(转)TOMCAT源码分析
2011-10-17 16:06 2136TOMCAT源码分析(启动框架 ... -
java写的四则运算器
2011-08-19 22:19 2723本打算做一个从RE到NFA的转换器,思路已经理清了,但是在动手 ... -
MBeanServer中instantiate 和 invoke的区别
2011-06-02 11:52 1304JMX中有两种方式调用另一个MBean中的方法 先创建一个M ... -
JMX 的一个简单例子
2011-05-30 17:41 1063废话不多说,上代码: HelloWorldMBean接口 ... -
执行JAR文件的一些问题(转)
2011-03-25 13:41 1385大家都知道一个java应用项目可以打包成一个jar,当然你必须 ...
相关推荐
#### 知识点详解 ### 谜题:`SimpleQuestion` #### 源代码解析 ```java public class SimpleQuestion { static boolean yesOrNo(String s) { s = s.toLowerCase(); if (s.equals("yes") || s.equals("y") || s...
以下是一些关键知识点的详细说明: 1. **MySQL连接**: 其中可能包含了MySQL的JDBC驱动(如mysql-connector-java.jar),这是Java程序连接MySQL数据库的基础,通过JDBC API实现数据的增删查改。 2. **Spring框架**:...
对于初学者来说,通过学习这些小动画程序,你可以了解到以下几个重要的Java知识点: 1. **Java基础**:这包括变量、数据类型、控制结构(如if语句、循环)、函数和类等基本概念。这些都是编写任何Java程序的基础。 ...
下面我们将详细探讨这些常见面试知识点,并分享一些有趣的Java谜题。 1. **Java基础语法**:Java的基础包括变量、数据类型、运算符、流程控制(如if-else、switch-case、for、while、do-while)以及方法的定义和...
### 知识点一:Java类与对象的基本概念 #### 类定义 - **定义格式**: ```java public class ClassName { // 属性声明 // 方法声明 } ``` - 在示例中,“`public class People`”定义了一个名为`People`的...
下面我们将深入探讨这个程序可能涉及的Java知识点。 首先,`TextBouncer.java`是这个项目的主文件,它可能包含了一个类,这个类用于生成和控制动态文字效果。在Java中,类是对象的蓝图,用于封装数据和行为。在这个...
这道Java机试题主要涉及到以下几个知识点: 1. **树形数据结构**:题目中的图A展示了树状结构,其中每个节点都有一个标题、ID以及一个上级节点ID(upid)。在计算机科学中,树是一种非线性的数据结构,由节点(或...
JavaGuide面试突击最新版知识点总结 JavaGuide面试突击最新版是JavaGuide的最新版本,旨在提供详细的Java知识总结和面试指导。该项目已经获得了90k+ Star,成为Java类别项中Star数量第二的开源项目。 一、Java...
综上所述,这个项目涵盖了Java Web开发的多个重要知识点,包括但不限于Java Servlet、JSP、MySQL数据库操作、MVC设计模式、Web安全框架的使用、前端技术以及项目管理和文档编写。对于学习Java Web开发的学生或开发者...
Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java...
JavaScript,简称JS,是...通过学习和实践这些JavaScript的知识点,你将能够创建有趣的、互动性强的网页应用,并分享你的编程经验。"有意思js程序"不仅是一个分享的主题,也是鼓励我们探索JavaScript无限可能性的口号。
综上所述,这个“圣诞礼物”背后蕴含的知识点包括但不限于:编程语言和技术选型、应用开发流程、前端和后端开发工具、跨平台开发、安全性和隐私保护、用户体验设计以及文件打包和分发策略。这些都是IT行业中重要的...
【描述】提到"Java游戏很有意思",这暗示了教程可能包含一些实际的游戏项目,通过实践来激发学习者的兴趣。在学习过程中,理论知识与实际操作相结合,使得学习过程更加生动有趣,同时也强化了编程技能的掌握。 ...
在Android逆向工程的学习过程中,我们经常会遇到各种有趣且富有挑战性的知识点。这些知识点涵盖了从基本的APK分析到复杂的代码反编译、调试以及安全防护等多方面内容。在这个"记录一些我自己在学习Android逆向过程中...
在Java手机游戏开发中,以下几个核心知识点是必不可少的: 1. **Java基础**:了解并熟练掌握Java语言的基本语法,如类、对象、继承、多态等,这是开发任何Java应用程序的基础。 2. **Android SDK**:对于Android...
【知识点详解】: 1. **Java编程**:Java是一种跨平台的面向对象编程语言,其强类型、垃圾回收机制和丰富的类库使得它适合开发复杂的应用程序,包括游戏。在这个项目中,Java用于编写游戏引擎、用户界面、网络通信...
知识点: 1.Java 中的 Long 数据类型是一个 64 位有符号的原始数据类型。 2.Long 数据类型的范围是 -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 (-2^63 至 2^63-1)。 3.Long 类型的整数字面量总是...
结合标签“控件、源码、系统相关类、资源”,我们可以推测以下几个知识点: 1. **控件**:在编程中,控件通常指的是用户界面(UI)中的元素,如按钮、滑块、日历等,用于用户与应用程序交互。在这个闹钟程序中,...
以下是对【有意思的入职自我介绍精选.doc】中所包含的知识点的详细说明: 1. **自我介绍的结构**: - 开场白:通常以"大家好"开头,表示尊重和友好。 - 基本信息:包括姓名、毕业院校、专业等,如"我叫XXX,来自...
Swing 桌面程序开发的知识点 1. Swing 是什么?:Swing 是一门开发桌面程序的技术,通过学习 Swing,可以开发界面程序。 2. 学习 Swing 的目标: * 了解 Swing 开发的基本过程。 * 掌握如何创建窗口、面板、标签...