您的位置:首页 > 编程语言 > Java开发

Java学习笔记

2015-12-20 21:32 441 查看
package com.hust;


public class TestMain {


/**
* @param args
*/
public static void main(String[] args) {


// 第一题
Integer a = 1000, b = 1000;
Integer c = 100, d = 100;
System.out.println(a == b);
System.out.println(c == d);
// 解释:
// 1、首先Integer是一个类,和基本数据类型int是不同的;
// 2、其次,Integer a = 1000 和 int a = 1000是不同概念的;具体区别在于,前者是一个引用类型,而后者只是一个自动变量,它完全没有类的概念和引用对象。
// 3、那么我们就可以知道,此处的a和b都是引用类型,指向堆中不同的内存区域;明显地,a和b是不等的;
// 4、但是在Integer包装类中,对于在-128到128之间的数,会单独用一个256大小的固定数组存储,所以此处的c和d是指向同一个数组元素,明显相等。


// 第二题
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
// 解释
// 1、首先,String并不是基本数据类型,所以s1、s2、s3是三个引用类型;
// 2、其次,注意String使用直接等于和new关键字是不同,前者是把值存放在常量池,后者是把值存放在堆中。
// 3、接下来,我们需要明白,常量池就像一个集合,里面的元素是互异的,并且每个元素的地址是唯一的;然而,堆却是严格按照new关键字的,一个new就在堆中分配一个地址,不管内容是否相同;


// 第三题
TestMain testMain = new TestMain();
testMain.mRun("luopan");


}


// 解释
// 1、首先,内部类和局部变量的概念;此处,回忆一下成员变量,描述类的属性,也是全局变量;那么,局部变量定义在局部范围,生命周期与范围绑定。
// 2、根据定义,这里的String name 就是mRun()方法的局部变量。为什么参数要加final关键字?
// 3、在这个方法里面有一个内部类,如果内部类要访问方法的局部变量,那么这个局部变量必须使用final关键字修饰。
// 4、在这里,name的生命周期与方法mRun()绑定,当方法执行完毕之后,这个局部变量name 是要被释放的。
// 5、这个函数里面是一个延时1秒,1秒之后,这个方法早就执行完毕,同时所有的局部变量都已经被销毁,如果还要访问,那就要bug了。
// 6、使用final关键字以后,相当于把局部变量的复制品保存下来,原件销毁,需要访问,就调用复制品。
public void mRun(final String name) {

new Runnable() {


public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name);
}
}.run();
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: