文章目录
(一)JDK1.5新特性
1.1方法的可变参数
设计一个方法,可以接收任意个数的整数,并返回他们的相加结果
public class Test {
public static void main(String[] args) {
System.out.println(add(1,2,3,4,5)); //15
System.out.println(add(-2,-1,0,1,2)); //0
System.out.println(add(new int[]{1,2,3,3,5})); //可以接收数组,所以可变参数实质还是数组
System.out.println(add(new int[]{1,-1}));
}
public static int add(int... data) {
int result = 0;
for (int temp : data) {
result += temp;
}
return result;
}
}
可变参数-语法
数据类型 ... 可变参数名称
eg:int … data
可变参数本质上还是数组,因为它可以接收数组
一个方法中只允许有一个可变参数,可变参数只能有一个,如果有多个参数,可变参数要写在最后
1.2 foreach循环
只用于数组,类集内容的取得,不能修改原数组,类集内容。
for(数据类型 临时变量 :数组名/类集名称)
eg: for(int temp :data)
1.3 静态导入(了解)
将一个类的所有静态域全部导入到使用类中,此时使用类调用该类的方法和属性不用再带类名
(二)泛型 ->避免classcastexception
(向下强转产生)
2.1 泛型类
(1)指的是在类定义时不会设置类中属性或方法的参数的具体类型,而是在类使用时再设置。
(2)语法:< >中的T被称为类型参数,用于指代任何类型。
class MyClass<T> {
T t;
}
常见的大写字母代表类型参数:
T:用在泛型类声明上,指代泛型类
E:一般用于属性
K,V:键值对
(3)当泛型类需要多个不同类型的变量时,< >以 , 分隔声明不同大写字母即可
class MyClass<T,E>
jdk1.7 钻石修饰符,后面的类型参数可以省 MyClass<String> myClass = new MyClass<>();
(4)泛型只能使用引用数据类型,基本类型用包装类
2.2 泛型方法
(1)语法:public <T> void testMethod(T t) {}
返回值前有 < T >
(2)泛型方法与泛型类没关系,普通类也可以有泛型方法
(3)泛型类与泛型方法可以共存。两者类型参数无关。
规范起见,两者共存时,使用不同类型参数来区分。
class MyClass<T> {
//泛型类里的普通方法
public T method1(T t) {
return t;
}
//泛型类例里的泛型方法
public <E> E method2(E e) {
return t;
}
}
public class Test {
public static void main(String[] args) {
MyClass<String> myClass = new MyClass<>();
System.out.println(myClass.method1("呵呵呵"));
System.out.println(myClass.method2(22223));
}
}
2.3 通配符 - 解决泛型的参数统一化问题(重要)
2.3.1 ?
通配符 - 作用于方法参数声明
public static void print(MyClass<?> myClass)
此时方法参数可以接受任意类型的Myclass对象
由于无法确定入参的类型,因此 ?
通配符下的泛型参数,只能取得类中属性值,无法进行属性值设置。
2.3.2 设置泛型上限 - 用于泛型类的声明,可也用于方法参数
泛型类声明:T extends 类
方法参数:? extends 类
eg:? extends Number
: 表示入参只能接收Number及其子类
***** 方法参数设置泛型上限依然只能取得类中属性值,无法设置,因为设置父类值子类不一定能使用(父类不一定能向下转型变为子类)
2.3.3 设置泛型下限 -只能用于方法参数
?super 类
表示方法入参只能接受类以及其父类对象
方法参数设置泛型下限不仅可以取得类中属性值,还可以设置参数值,因为向上转型是安全的
2.4 泛型接口
(1)子类实现接口时继续保留泛型
class InterfaceImpl<T> implements IInterface<T>
(2)子类实现接口时就确定好类型
class InterfaceImpl implements IInterface<String>
interface IInterface<T> {
T test(T t);
}
//1.子类实现接口时继续保留泛型
//class InterfaceImpl<T> implements IInterface<T>{
// @Override
// public T test(T t) {
// return t;
// }
//}
//2.子类实现接口时就确定好类型
class InterfaceImpl implements IInterface<String>{
@Override
public String test(String s) {
return s;
}
}
public class Test {
public static void main(String[] args) {
// 1.IInterface<String> iInterface = new InterfaceImpl<>();
IInterface iInterface = new InterfaceImpl();
System.out.println( iInterface.test("hiusi"));
}
}
2.5********* 类型擦除(重要)*********
泛型信息仅存在代码编译阶段,进入JVM之前,与泛型类相关的信息会被擦除掉。
泛型类与普通类在JVM中没有区别。
泛型类进入JVM前会进行擦除,泛型类的类型参数如果没有指定类型上限,则擦除为Object类;如果类型参数指定上限,擦除为相应类型上限。
<T> ->Object
<T extends String> -> String