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

原创 2012年03月28日 11:54:44

---------------------- 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

Java_枚举、自动拆装箱和泛型

Java_枚举和泛型 1.枚举:关键字 enum  问题:对象的某个属性的值不能是任意的,必须为固定的一组取值其中的某一个;  解决办法:  1.在setGrade方法中做判断,不符合格式要求就抛...
  • qq_28511837
  • qq_28511837
  • 2015年05月31日 01:07
  • 551

详解Java的自动装箱与拆箱(Autoboxing and unboxing)

一、什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程//自动装箱 Integer total = 99;//自定拆箱 int totalprim = total;简单一点说,装箱就是...
  • hp910315
  • hp910315
  • 2015年09月22日 15:27
  • 4764

C# - 再谈C#的装箱和拆箱

上一篇写了一下装箱拆箱的定义和IL分析,这一篇我们看下使用泛型和不使用泛型引发装箱拆箱的情况 1. 使用非泛型集合时引发的装箱和拆箱操作  看下面的一段代码: 1 2 3 ...
  • honey199396
  • honey199396
  • 2016年08月31日 11:35
  • 504

Java学习笔记之自动装箱与拆箱

更多博文可参考我的个人独立博客:贱贱的梦想 什么是自动装箱与拆箱自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Intege...
  • GongchuangSu
  • GongchuangSu
  • 2016年05月28日 22:28
  • 1101

深入剖析Java中的装箱和拆箱

原文出处: 海子 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相...
  • zf0512305
  • zf0512305
  • 2016年03月19日 14:39
  • 4130

C#--三行代码带你理解神秘的拆箱和装箱

一、在说拆箱和装箱之前的准备知识首先,我们需要知道c#中有两种类型:值类型和引用类型 名称 值类型 引用类型 表示类型 基本类型 类,数组,接口 ,C#特有的委托. 存储内容...
  • qq_32452623
  • qq_32452623
  • 2016年12月29日 17:22
  • 2464

深入剖析Java中的装箱和拆箱

深入剖析Java中的装箱和拆箱   自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的...
  • carolzhang8406
  • carolzhang8406
  • 2015年05月27日 14:07
  • 2957

Java自动装箱和自动拆箱

Java自动装箱和拆箱
  • liamao16
  • liamao16
  • 2016年04月27日 08:59
  • 816

装箱和拆箱的基本原理

3.1.4 简述装箱和拆箱原理 40 · 装箱和拆箱的基本概念 · 装箱拆箱对性能的影响 · 如何有效避免装箱拆箱   分析问题 1.装箱和拆箱的基本概念 在第3.1.3节中,笔者已经介...
  • szyzxcv5689
  • szyzxcv5689
  • 2013年04月21日 16:31
  • 2669

C#装箱和拆箱(Boxing 和 UnBoxing)

1、什么是装箱和拆箱? 简单来说:       装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型。(网上广为流传)  C#中值类型和引用类型的最终基类都是Object类型(它本身是一个引用...
  • qiaoquan3
  • qiaoquan3
  • 2016年05月17日 21:44
  • 2683
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员Java基础之泛型(Genric)、拆箱与装箱、享元模式
举报原因:
原因补充:

(最多只允许输入30个字)