关闭

黑马程序员Java基础之泛型(Genric)、拆箱与装箱、享元模式

标签: javaintegerclassstringlistandroid
796人阅读 评论(0) 收藏 举报
分类:

---------------------- android培训java培训、期待与您交流! ----------------------

 基础要点

1、  泛型特点:是给是给编译器看的,运行时会去掉,原因:为了使程序更安全,可以再运行中暴露错误,让程序员有统一的规范。

2、  使用拆箱与装箱的原因:当试图将一个值类型的数据添加到Collection里时就需要装箱,因为Collectionadd()对象只接受对象,又有些时候只需数值,所以就凸显出拆箱与装箱的必要性。拆箱就是声明一个基本数据对象将包装类的值给这个对象;装箱就是把一个数据对象给一个包装类对象。

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也可以是33在常量池,ab虽然不是同一个变量但可以有相同的指向,这个常量池是共享的,这就是共享模式。同时这个常量池是有范围的(-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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37676次
    • 积分:872
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:11篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论