java5的一些简单新特性
1.静态导入
(1)普通import语句导入一个类或某个包中的所有类。
(2)import static语句导入一个类中的某个静态方法或所有静态方法。
(3)例如:语句Math.max(3,6);当导入一个import static java.lang.Math.max;时,语句可写成max(3,6);。
2. 可变参数与OverLoad相关面试题
(1)当一个方法接受的参数个数不固定时候使用可变参数。
(2)overload与override区别:
overload:重载 看两个参数的个数,参数类型,与返回类型无关。
override:重写 如果父类方法是私有的,子类方法重写类方法。
(3)可变参数的特点:
只能出现在参数列表的最后;
…位于变量类型和变量名之间,前后有无空格都可以;
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
示例:打印和。
public static void main(String[] args) {
System.out.println(add(2,3));
System.out.println(add(2,3,5));
}
public static int add(int x,int ... args){
int sum=x;
for (int i=0;i<args.length;i++)
{
sum+=args[i];
}
return sum;
}
3. 增强for循环
(1)语法:for(type 变量名 : 集合变量名){…}
(2)注意事项:迭代变量必须在()中定义!集合变量可以是数组或实现了Iterable的集合类。
示例:将上面的for循环改成增强for的写法
for(int arg:args){
sum+=arg;
}
4. 基本数据的自动拆装箱及享元设计模式
(1) Integer iobj = 3;//装箱 将基本数据类型装成Integer对象在赋给iobj引用变量。
System.out.println(iobj +12);//拆箱
(2) String s1 = new String("abc");
String s2 = new String("abc");
Integer i1 = 137;
Integer i2 = 137;//-128~127之间的数字是true
System.out.println(i1== i2);
System.out.println(s1== s2);//会分配不同空间
(3)享元模式—flyweight:就是很多个小的对象,他们有很多属性相同,把他们变成一个对象,称之为内部状态。那些不同的属性,把他们变成方法的参数,称之为外部状态。
java5的枚举(enum)
1.枚举:定义一个类型,以后这个类型定义的值只能是我以前规定好的值,如果不是那些值,编译器就不能通过,在编译时就告诉你不合法。
2.枚举是一种特殊的类,其中每个元素都是该类的一个实例对象。其中也可以定义构造方法,成员变量,普通方法和抽象方法。
3.注意:枚举的成员方法或变量等放在枚举元素的前面,否则编译器报错。
4.带构造方法的枚举:构造方法必须定义成私有的。如果有多个方法,就调用默认的构造方法。
5.枚举只有一个成员时,就可以作为一种单例的实现方式。
示例:定义一个WeekDay的枚举。
public enum WeekDay{
SUN(),MON(),TUE,WED,THI,FRI,SAT;//元列表后面有东西就加分号,没有可以不加。
private WeekDay(){System.out.println("first");}//定义一个构造方法
private WeekDay(int day){System.out.println("Second");}//指定参数列表
}
java5的注解(Annotation)
1.注解相当于一种标记,在程序中加了注解就等于为程序打上可某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无任何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
2.@SuppressWarning:压缩警告
@SuppressWarnings("deprecation")
public static void main(String[] args) {
System.runFinalizersOnExit(true);
}
2.@Deprecated:标记某个方法过时。
@Deprecated
public static void sayHello(){
System.out.println("hi,传智播客");
}
3.@Override:子类覆盖父类方法。
@Override
public boolean equals(Object obj)
java5的泛型
1.泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据。
集合中的泛型
2.ArrayList< E >类定义和ArrayList<Integer>类引用中涉及术语:
整个称为ArrayList< E >泛型类型。
ArrayList<E>中的E称为类型变量或类型参数。
整个ArrayList<Integer>称为参数化的类型。
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数。
ArrayList<Integer>中的<>念typeof。
ArrayList称为原始类型。
3.参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型对象,编译报告警告。
eg:Collectoin<String> c = new Vector();
原始类型可以引用一个参数话类型的对象,编译报告警告。
eg:Collection c = new Vector<String>();
4.参数化类型不考虑类型数的继承关系:
eg:Vector<String> v = new Vector<Object>();//错
Vector<Object> v = new Vector<String>();//错
5.在创建数组示例时数组的元素不能使用参数化类型。
6.泛型中?通配符
泛型限定:上限,下限
? extends Number —>必须是Number的子类。
? super Integer —>必须是Integer的父类。
限定通配符?总是包括自己,不能把?给一个具体类型 ,可以把具体类型给一个?。
7.类型推断取交集
eg:integer float —> number integer String —>Object
方法中的泛型
普通方法、构造方法和静态方法中都可以使用泛型。用于放置泛型的类型参数的尖括号应出现在方法的其他所有修饰符之后,在方法的返回类型之前,也就是紧邻返回值之前,按照惯例类型参数通常用单个大写字母表示,可以有多个类型参数,在定义他们的尖括号中用逗号隔开。
eg:public static <K,V> V getValue(K key){return map.get(Key);}
类中的泛型
1.如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型时,这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型。
eg:public calss GenericDao<T>{
private T field;
public void save(T obj){}
public T getByld(int id){}
}
2.注意:在对泛型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。当一个变量声明为泛型时,只能被实例变量和方法调用(还有内嵌类型)而不能被静态变量和静态方法调用。因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。
|