---------------------- android培训、java培训、期待与您交流! ----------------------
基础要点
1、 泛型特点:是给是给编译器看的,运行时会去掉,原因:为了使程序更安全,可以再运行中暴露错误,让程序员有统一的规范。
2、 使用拆箱与装箱的原因:当试图将一个值类型的数据添加到Collection里时就需要装箱,因为Collection的add()对象只接受对象,又有些时候只需数值,所以就凸显出拆箱与装箱的必要性。拆箱就是声明一个基本数据对象将包装类的值给这个对象;装箱就是把一个数据对象给一个包装类对象。
3、什么叫享元模式
可以先看一个泛型的简单例子,熟悉下起其书写模式:
package horse;
import java.util.AbstractList;
/**这是一个泛型的简单例子
*/
public class GenericSimple {
public static void main(String[] args) {
ArrayList<integer> list = new ArrayList<Integer>();
ArrayList<String> list2 = new ArrayList<String>();
System.out.println(list.getClass()==list2.getClas());
list.add(1);
//可以通过反射穿过泛型的限制
list.getClass().getMethod("add",Object.class).invoke(list."hi");
System.out.println(list);
}
}
再看一个泛型的嵌套例子
首先就得有一个用于嵌套的内层
package horse;
/**这是一个用于泛型嵌套的类与GenricNesting相关
* 被GenricNesting引用
* 无主函数
*/
public class Generic<T> {
private T foo;
public T getFoo() {
return foo;
}
public void setFoo(T foo) {
this.foo = foo;
}
}
还有一个嵌套的外层
package horse;
/**这是一个泛型的嵌套外层
* 以Generic为基础嵌套
*/
public class GenericNesting {
private Generic<T> foo;
public Generic<T> getFoo() {
return foo;
}
public void setFoo(Generic<T> foo) {
this.foo = foo;
}
}
在写一个测试的类
package horse;
/**这个用于测试泛型嵌套的类
* 与之相关的类是Generic和GenricNesting
*/
public class GenericDemo {
public static void main(String[] args) {
//创建Generic的实例(嵌套的内层),
Generic<Integer> g = new Generic<Integer>();
//设置f的属性
g.setFoo(2);
//再创建一个GenericNesting的实例(嵌套的外层),
GenericNesting<Integer> n = new GenericNesting<Integer>();
//将对象传进去
n.setFoo(g);
System.out.println(n.getFoo().getFoo());
}
}
总结:泛型的使用是有局限性的,体现在类型参数不能实例化,参数的数组不能实例化,类型静态变量不能声明类型参数类型,泛型类不能继承自Throwable以及其子类
泛型写完了第二部分是拆装箱
package horse;
/**这是一个装箱拆箱的例子
*/
public class AutoBoxing {
public static void main(String[] args) {
// TODO Auto-generated method stub
//自动装箱,包装成对象
Integer a = 123;
System.out.println(a);
//自动拆箱,其实不过是声明了一个int行对象把包装类给这个对象
int b = a;
System.out.println(b);
System.out.println("---------以下是共享模式的例子----------");
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1==num2);
//若赋值超出共享模式的常量池范围会怎样,试试
num1 = 128;
num2 = 128;
System.out.println(num1=num2);
//给这两个对象装下相看是否一致
num1 = Integer.valueOf(12);
num2 = Integer.valueOf(12);
System.out.println(num1==num2);
}
}
总结:当我们把一个常量给一个变量时,java就会把这个常量放入常量池,谁需要谁就拿走,比如int a ,b;a = 3;b也可以是3;3在常量池,a和b虽然不是同一个变量但可以有相同的指向,这个常量池是共享的,这就是共享模式。同时这个常量池是有范围的(-128~127)超出此范围就是另外的对象了
数据类型与他们的封装类
基本数据类型 | byte | shot | int | long | float | double | char | boolean |
封装类 | Byte | Shot | Integer | Long | Float | Double | Charcter | Boolean |
感受:泛型的学习让我想到了网络里的安全,通过泛型可以把可能的问题扼杀在摇篮里,但在网络的世界却不可能有什么安全机制。系传里说“内外是之惧,又明于忧患,故无有师保,如临父母”,这个社会没有什么可以保证你不受伤害的,不过明于忧患而已,知道没人能罩着你,圣人有此一步便一生无大过矣。存在必有因,Java中的泛型是初学者的福音,对错本来这么不好分辨,但泛型就告诉你这么做就是错的,或是对的。
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima