Java学习(五)
目录:
1、泛型:
2、JDK5.0的新特性:
3、泛型的上限与下限:
4、TreeSet类学习:
1、泛型:
答:泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(类型形参),然后在调用时传入具体的类型(类型实参)。
2、JDK5.0的新特性:
答:①泛型(Generics)
②增强的“for”循环(Enhanced For loop)
③自动装箱/自动拆箱(Autoboxing/unboxing)
④类型安全的枚举(Type safe enums)
⑤静态导入(Static import)
⑥可变参数(Var args)
注意事项:
(1)泛型:变量类型的参数化。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。
(2)增强的for循环,For-Each循环的加入简化了集合的遍历,其语法如下:
for(type element : array) {
System.out.println(element)....
}
图2.1 增强的for循环程序
运行结果:
图2.2 增强的for循环运行结果
(3)当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息。
(4)自动装箱:基本数据类型自动转为包装类.(int >> Integer)
自动拆箱:包装类自动转为基本数据类型.(Integer >> int)
(5)在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存放在内存中被重用,始终只存在一个对象。所以:Integer a =3 ;Integer b=3 中a==b为true。而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象。如Integer num1 = 297; Integer num2 = 297; num1==num2结果为false。
图2.3 自动装拆箱程序
运行结果:
图2.4 自动装拆箱运行结果
(6)当使用“enum”定义枚举类型时,实质上定义出來的类型继承自java.lang.Enum类型,而每个枚举的成员其实就是定义的枚举类型的一个实例(Instance),他们都被预设为final,所以无法改变它们,它们也是static成员,所以可以通过类型名称直接使用它们,它们都是public的。
(7)Enum可以用于常量,switch,向枚举中添加新方法,覆盖枚举的方法,实现接口,使用接口组织枚举等。
图2.5 枚举示例程序
运行结果:
图2.6 枚举程序运行结果
(8)枚举的使用场景:类型确定。与常量相比,枚举显得更规范,限制了方法中传入的参数值。
(9)可变参数:可变参数本质上就是一个数组,对于某个声明了可变参数的方法来说,我们既可以传递离散的值,也可以传递数组对象。但如果将方法中的参数定义为数组,那么只能传递数组对象而不能传递离散的值。
(10)可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是方法声明中的最后一个参数,即一个方法不可能具有两个或两个以上的可变参数。
图2.7 可变参数示例程序
运行结果:
图2.8 可变参数程序运行结果
(11) 要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
1). import static 包名.类名.静态成员变量名; // 导入静态成员变量
2). import static 包名.类名.静态成员方法名; // 导入静态方法
注意:使用import static时,要一直导入到类中的静态成员变量或静态方法。
图2.9 静态导入示例程序代码1
图2.10 静态导入示例程序代码2
运行结果:
图2.11 静态导入示例程序运行结果
(12)过度使用静态导入会一定程度上降低代码的可读性
3、泛型的上限与下限:
答:①设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类:
声明对象:类名<?extends 类>对象名
定义类:类名<泛型标签extends 类>{}
②设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类:
声明对象:类名<?super 类>对象名称
定义类:类名<泛型标签super类>{}
4、TreeSet类学习:
答:①继承关系:
Java.lang.Object
------java.util.AbstractCollection
------------java.util.AbstractSet
------------------java.util.TreeSet
②TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储。访问和检索是很快的。在存储了大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。
③示例:
父类:Dengqinyi
子类:HandsomeBoy
测试类:HashSetTest
图4.1 程序代码1
图4.2 程序代码2
图4.3 程序代码3
运行结果:
图4.4 运行结果
PS:可以对各个参数分别进行排序,此处设置了按照第一个参数顺序排序,也可以设置为按照第二个参数来设置排序。