补五月四号java基础知识

2023-07-12,,

1.在JDK5中新增了自动包装和自动解包功能:
当编译器发现程序再应该使用包装类对象的地方却使用基本数据类型的数据时
,编译器将自动把该数据包装为该基本数据对应的包装类的对象,这个过程成为自动包装。
如类型参数T所接收的是int、double或char等基本数据类型时,T所代表的类型自动包装成
Integer、double、character等类型
当编译器发现在使用基本类型数据的地方却使用了包装类的对象,则会把该包装类对象解包,
从中取出所包含的基本类型数据,这个过程称为自动解包。如一个对象是包装类型Integer、
double或character等类型时,那么可直接将这个元素赋值给一个基本类型的变量
2.当一个泛型有多个类型参数时,每个类型参数在泛型中都应该是唯一的。如不能定义形如
Map<K,K>形式的泛型,但可以定义Map<K,v>形式的泛型
3.泛型方法:
要定义泛型方法,只需将泛型的类型参数<T>置于方法返回值类型前即可。在java中任何方法
(包括静态方法和构造方法)都可声明为泛型方法。泛型方法除了定义不同,
调用时与普通方法相同
4.在调用泛型方法时,为了强调是泛型方法,也可将实际类型放在尖括号内作为方法名的前缀
app12_2.<String>display(str);app12_2.<Integer>display(num);
5.推荐使用返回值类型和参数类型一致的泛型方法。java泛型方法广泛使用在方法返回值和
参数均是容器类对象
6.说明:一个static方法,无法访问泛型类的类型参数,所以如果static方法需要使用泛型能力
必须使其成为泛型方法
7.在使用泛型类时,必须在创建泛型对象的时候指定类型参数的实际值,而调用泛型方法时,
通常不必指明参数的类型,因为编译器有个功能为类型参数推断,此时编译器会找出具体的
类型。类型推断支队赋值操作有效,其他时候并不起作用
8.设计泛型方法的目的主要是针对具有容器类型参数的方法的。
泛型方法与泛型类之间的一个重要区别是:对于泛型方法,不需要把实际的类型传递给
泛型方法;但泛型类恰恰相反,即必须把实际的类型参数传递给泛型类
9.限制泛型的可用类型:
在定义泛型类时,默认可以使用任何类型来实例化一个泛型类对象,但java语言也可以在用
泛型类创建对象时对数据类型做出限制。其语法如下:
class ClassName<T extends anyClass>
其中anyClass是指某个类或接口
该语句表示T是ClassName类的类型参数,且T有一个限制,即T必须是anyClass类或是继承了
anyClass类的子类或是实现了anyClass接口的类。
这意味着该类创建对象时,类型实际参数必须是anyClass类或其子类或是实现了anyClass接口
的类。且无论anyClass是类或接口。在进行泛型限制时都必须使用extends关键字
10.说明:在定义泛型类时若没有使用extends关键字限制泛型的类型参数时,默认是Object
类下的所有子类,即<T>和<T extends Object>是等价的
11.在使用<T extends anyClass>定义泛型类时,若anyClass是接口,那么创建泛型对象时,
若给出的类型参数不是实现接口anyClass的类,则编译不能通过。
例如我们定义了泛型类class LIstGeneral<T extends List>,因List是接口,所以在用该类创建
泛型对象时的实际参数必须是实现List接口的类。
12.java.util.LinkedList与java.util.ArrayList均是实现了接口java.util.List的类
ListGeneral<LinkedList> x = new ListGeneral<LinkednList>();
ListGeneral<ArrayList> y = new ListGeneral<Arrat=ynList>();
但由于HashMap没有实现List接口,所以以下语法是错误的
ListGenneral<HashMap> z = new ListGeneral<HashMap>();
13.泛型的类型通配符和泛型数组的应用:
泛型通配符?其重要作用有两个方面:
一是用于可重新赋值但不可修改其内容的泛型对象;
二是用在方法的参数中,限制传入不想要的类型实参
14.当需要在一个程序中使用同一个泛型对象名去引用不同泛型对象时,就需要使用通配符"?"
创建泛型类对象,但条件是被创建的这些不同泛型对象的类型实参必须是某个类或继承该类的
子类又或是实现某个接口的类。也就是说,只知道通配符"?"表示某个类或是继承该类的子类
又或是实现某个接口的类,但具体是什么类型不知道
15.下列语句是用泛型类创建泛型类对象:
泛型类名<? extends T> o =null;//声明泛型类对象o
16.直接用通配符<?>创建泛型对象,有两个特点
1)具有通用性,即该泛型类的其他对象可以赋值给通配符“?”创建的泛型对象,因为“?”
等价于“?extends Object”
2)用通配符“?”创建的泛型对象,只能获取或删除其中的信息,但不可为其添加新的信息
17.通配符有上限通配和下限通配
由于T被认为是类型参数“?”的上限,所以“?extends T”也被称为上限通配
“?super T”表示是T或T的一个未知父类型,T表示类型参数“?”的下限,所以被称为
下限通配
18.引用通配符的主要目的是支持泛型中的子类,从而实现多态
19.泛型方法的目的主要是为了适用于多种不同类型或支持多态,则应选用通配符
20.JVM在编译时对泛型进行安全检查,所以强调这几点
1)不能使用泛型的类型参数T创建对象。如T obj = newT()这是错误的
2)在泛型中可以使用类型参数T声明一个数组,但不能使用类型参数T创建数组对象
21.不能在静态环境中使用泛型类的类型参数T。例如:
public class Test<T>{
public static T obj;
public static void m(T obj);
{ }
static {T obj2;}}
22.异常类不能是泛型的,即泛型类不能继承java.lang.Throwable类。
如public class MyException<T>extends Exception{}是错误的
23.继承泛型类与实现泛型接口
被定义为泛型的类或接口可被继承与实现。例如:
public class ExtendClass<T1>
{ }
class SubClass<T1,T2,T3>extends ExtendClass<T1>
24.在定义泛型接口时,泛型接口也可被实现:
interface Face<T1>
{ }
class SubClass<T1,T2>implements Face<T1>
{ }

总结:今天了解了JDK5的自动包装和自动解包

泛型方法的使用以及注意事项

泛型类类接口的限制,以及可限制的泛型类

通配符的使用和注意事项

继承泛型类以及实现泛型类接口

补五月四号java基础知识的相关教程结束。

《补五月四号java基础知识.doc》

下载本文的Word格式文档,以方便收藏与打印。