Java学习笔记
2015-12-20 21:32
489 查看
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();
}
}
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();
}
}
相关文章推荐
- 我的Thinking in Java学习笔记(2)
- 我的Thinking in Java学习笔记(三)
- Java学习笔记1
- 我的Thinking in Java学习笔记(1)
- java学习笔记7--Polymorphism
- JAVA学习笔记之Collection
- JAVA与模式 学习笔记(一) 统一的建模语言UML介绍(2)
- 我的Thinking in Java学习笔记(五)
- java 学习笔记
- java学习笔记
- JAVA学习笔记之Collection
- effective-java 学习笔记(1)
- java学习笔记,很多tips
- JAVA与模式 学习笔记(一) 统一的建模语言UML介绍(2)
- thinking in java 学习笔记之Composition vs Inheritance
- Java 学习笔记
- 我的Thinking in Java学习笔记(七)
- JAVAGUIDE(学习笔记1)
- java学习笔记5--Hiding implementation
- java学习笔记