静态导入:
当需要用到一个工具类,而这个类中的方法大多是静态方法的时候,为了方便书写,免去写静态类类名的麻烦,可以导入这个类的静态方法,比如Arrays类,可以在程序开头写importstatic java.util.Arrays.*;导入这个类的静态方法,就可以不用写Array.xxxx(),而是直接写xxxx()。但如果有可能导入的两个类有同名的方法,这时候就需要写上所属的对象或者类。
增强for循环:
格式:
for(数据类型变量名 : 被遍历的集合(Collection)或者数组)
{
}
底层封装了迭代器。所以使用有局限性。
以数组为例比较一般for循环和增强for循环
int[] arr = {3,5,1};
for(intx=0; x<arr.length; x++)
{
System.out.println(arr[x]);
}
for(inti : arr)
{
System.out.println("i:"+i);
}
可变参数:
public int sum(int a,int b){}
public int sum(int a,int b,int c){}
public int sum(int [] arr){}
在没有泛型的当一个方法通用但参数不固定时,非常麻烦,可变参数可以自动把参数封装成数组,床多少参数都行
public int sum(int …args/*如果还有其他参数,可变参数必须放在最后*/){}
基本数据类型自动拆箱,装箱:
Integer x = 4;//自动装箱。相当于Integer x = new Integer(4)
x = x/* x.intValue() */ + 2;//x+2:x 进行自动拆箱。变成成了int类型。和2进行加法运算。
//再将和进行装箱赋给x。
泛型:
好处
1.将运行时期出现问题ClassCastException,转移到了编译时期。,
方便于程序员解决问题。让运行时问题减少,安全。,
2,避免了强制转换麻烦。
class Utils<QQ>
{
private QQ q;
public voidsetObject(QQ q)
{
this.q = q;
}
public QQgetObject()
{
return q;
}
}
定义泛型后,当我们需要用这个Utils类,即创建Utils的对象时,就得给qq指定类型,这样这个类的类型就固定了,比如Utils<String>ex =new Utils<String>();创建这么个对象。那上面那个类相当于变成这个样子:
class Utils
{
private String q;
public voidsetObject(String q)
{
this.q = q;
}
public String getObject()
{
return q;
}
}
而如果要用Object的话相当于把传入的对象向上提上成Object了,也就是你得到的是一个Object对象,那以后要用就需要在向下转型,这种转换是要求开发者对实际参数类型可以预知的情况下进行的。用泛型就避免这样的麻烦。
枚举:
枚举实质上还是一个类,他里面定义的成员是这个枚举类的实例对象。因为枚举不能有其他对象所以他的构造方法必须是私有的。我们在定义带参数的枚举构造方法时需要注意。
package cn.itcast.day1;
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
WeekDay2 weekDay = WeekDay2.SUN;
System.out.println(weekDay.nextDay());
WeekDay weekDay2 = WeekDay.FIR;
System.out.println(weekDay2);
}
public enum WeekDay{
SUN(2),MON,TUE,WED,THI,FIR,STA;
private WeekDay(){
System.out.println("First");
}
private WeekDay(int x){
System.out.println("second");
}
}
public enum TraffickLamp{
RED(30){
@Override
public TraffickLamp nextLamp() {
// TODO Auto-generatedmethod stub
returnGREEN;
}
},
YELLOW(5){
@Override
public TraffickLamp nextLamp() {
// TODO Auto-generatedmethod stub
returnRED;
}
},
GREEN(45){
@Override
public TraffickLamp nextLamp() {
// TODO Auto-generatedmethod stub
returnYELLOW;
}
};
public abstract TraffickLamp nextLamp();
private int time;
private TraffickLamp(int time){this.time = time;}
}
}
反射:
Java程序中的各个Java类,它们是否属于同一类事物,也可以用一个类来描述这类事物。这个类的名字就是Class。他是反射的基石。每个java类都是Class的一个实例对象,它们的内容不同,但是,它们的特征相同,方法,字段,父类,包。反射就是把Java类中的各种成分映射成相应的java类。
得到字节码的三种方法:
类名.class
对象. getClass()
Class.forName("类名")。
获取构造方法:
getConstructor()方法,
Constructor constructor =Class.forName(“java.lang.String”).getConstructor(StringBuffer.class)。
当有多个构造方法时可以获取所有构造方法返回一个数组
Constructor [] constructors=Class.forName("java.lang.String").getConstructors();
获取构造方法后就可以用构造方法创建这份字节码的对象了
String str =(String)constructor.newInstance(new StringBuffer("abc"));
获取字段:即字节码中的成员变量
使用getField("变量名");方法。getDeclardField方法可以获得字节码中的私有变量,通过setAccessible方法可以暴力发射得到私有变量的值
获取方法:
使用getMethod()。Method charAt =Class.forName("java.lang.String").getMethod("charAt",int.class);
得到一个类中的方法后就可以用invoke方法调用这个方法了。
System.out.println(charAt.invoke(str, 1));如果invoke方法的第一个参数为null那说明这个方法是静态方法不需要创建对象也能调用。
------- android培训、 java培训、期待与您交流! ---------- 详细请查看: http://edu.csdn.net/heima/