泛型、静态导入、可变参数、增强for()循环、自动拆装箱

一、泛型

1、概述:将原来具体的类型参数化,将数据类型(只能是引用数据类型)作为一种参数传递,提高代码的安全性;

2、格式:<数据类型>

3、位置:1)数组、集合在创建对象的时候

ArrayList<String> al = new ArrayList<String>();//后面的String叫作泛型推断

ArrayList集合使用泛型<String>限定后则该集合就只能存储String类型的元素,否则就会报错

2)泛型定义在类、接口上

public class ObjectDemo<T>{//在类中就可以把T 当做Ojbect类型来使用

private T t;

public T get(){

return t;

}

}

3)泛型定义在方法上

public <T> void show(T t){//相当与需要传入的参数是Object类型的

System.out.println(t);

}

4、通配符

<?>代表任意数据类型:可以是Object类型以及Java类

<? extends E>向下限定,要么跟当前类型一样,要么是它的子类

<? super E>向上限定,保持当前类型一致,或者是他的父类

一般用在方法的参数中:

wKioL1mDI4zhlFt1AABM1fGnV_w430.png

5、作用

1)将运行时期的异常提前到了编译期间

2)不用再强制类型转换

3)解决了一个×××警告线的问题

egg:

wKiom1mDJBeDLfjvAABuq9aHqbQ801.png

二、增强for()循环 ———— 用于遍历数组、集合

1、格式

for(数据类型 名称 :需要遍历的集合或者数组名){

System.out.println(名称);//相当于循环了 集合.size() 多次,每次打印一个元素

}

2、注意事项

增强for()循环如同集合的迭代器遍历方法,不能在循环内用集合的方法修改集合内的元素,否则就会报java.util.ConcurrentModificationException异常

egg://集合内如有bb就给集合添加元素dd

public class ForDemo {

public static void main(String[] args) {

ArrayList<String> al = new ArrayList<String>();

al.add("aa");

al.add("bb");

al.add("cc");

for(String s : al){

if(s.equals("bb")){

al.add("dd");//错误的写法

}

}

}

}

3、嵌套遍历

格式:ArrayList<ArrayList<String>> al = new ArrayList<ArrayList<String>>();

for(ArrayList arr : al){

for(String s : arr){

}

}

egg:

 wKioL1mDJNjjArAoAAB0P1NWDwE195.png

三、自动拆装箱

1、概述:基本数据类型与其包装类之间的自动相互转换,无需强制转型;

装箱:就是自动将原始类型值转换成对应的对象;

拆箱:将基本数据类型的对象自转换成基本数据类型;

2、基本数据类型与其对应的包装类

byte--------->Byte

short------->Short

int--------->Integer

long-------->Long

float------->Float

double------>Double

boolean----->Boolean

char-------->Character

3、优缺点

优点:降低代码量,方便使用

弊端:有可能会影响程序的性能

egg:Integer num = 0;

for(int i = 0;i < 1000;i++){

num += i;

}

在这里,num每次循环进去时候是Integer类型,num += i;时候自动拆箱成int类型,出循环再自动装箱成Integer类型,在庞大的循环中会大大的降低程序的性能,生成无用对象增加GC压力;

所以,在使用中尽量避免。

四、静态导入

1、概述一个类中只要有静态方法就能使用静态导入,使其静态方法在本类中直接可见

2、格式:import static java.包名.类名.方法;

egg:import static java.lang.Math.random;//静态导入Math类中的random()方法;

import static java.lang.Math.*;//静态导入Math类中的所有静态方法;

3、使用:直接使用方法名调用

egg:import static java.lang.Math.*;

public class MathDemo {

public static void main(String[] args) {

random();

abs(-1);

pow(3, 2);

sqrt(4);

}

}

4、注意事项:

1)如果要使用静态导入,为了防止在一个类中出现同名的方法,那么调用的时候需要前缀来区别开来;

2)过度的使用静态导入会使代码的可读性降低。

五、可变参数

1、概述:参数类型相同,个数不确定时,将其看作一个数组处理————可变参数

2、格式:修饰符 返回值类型 方法名(参数类型...变量名){}

egg:public static int add(int ... x){//这里的 int...x 相当与一个暂时不知道长度的数组 int[]x;

int num = 0;//在使用add()方法时候,添加几个参数,数组长度就是多少;

for(int i = 0; i < x.length;i++){

num += x[i];

}

return num;

}

3、特点

1)如果方法中有多个参数,那么可变参数必须在最后一个;

2)可变参数在实际传参的时候就知道到底有多少个了;

3)在使用时,相当与创建了一个数组,可使用循环遍历,如上egg。

六、枚举类

1、枚举概述: 就是一个类只能存在几个固定的对象,那么这个就是枚举.我们就可以使用这些对象可以表示一些固定的值.

    举例:一周只有7天,一年只有12个月等。

2、枚举类:

    定义枚举类要用关键字enum

    所有枚举类都是Enum的子类

    枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略

    枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”);

    枚举类也可以有抽象方法,但是枚举项必须重写该方法

    枚举在switch语句中的使用