java--------学习之《JDK1.5新特性,枚举,反射机制》

Myeclipse于eclipse的区别:

    eclipse是开发java的一款专业ide,它本身就是由java程序所开发,myeclipse本身是eclipse的插件(用于开发javaee的平台),后来myeclipse把eclipse集成进去了,所以本人自己理解Myeclipse是一个加强版的Eclipse。

 

 

java(JDK1.5新特性:静态导入)

好处:静态导入后,可以在不写类名的情况下,直接调用自己所导入类里面已经定义好了的类方法。提高的代码编写的效率,

代码演示:

//非静态导入的代码:
public class TestStatic{   
	public static void main(String[] args){   
      		System.out.println(Integer.toHexString(42)); 
   	}
}
//静态导入之后的代码:
import static java.lang.System.out;
public class TestStaticImport {
	public static void main(String[] args){
	      out.println(Integer.toHexString(42));  
	}
}


 

 

java (JDK1.5新特性:可变参数和增强for循环)

适用于参数个数不确定,类型确定的情况。

调用可变参数的方法时,编译器为该可变参数隐含创建一个数组。

注意:可变参数必须写在参数列表的最后面。

可变参数结合增强for代码演示:

public class VarableParameter
{
    public static void main(String[] args)
    {
        System.out.println(add(1,2,3,5,6,8,9,10));
<span style="white-space:pre">	</span>System.out.println(add(4,5,8,10));
    }
    <span style="white-space:pre">	</span>//当参数类表的最后,变量类型和和变量名出现了...这个就是一个可变参数,
<span style="white-space:pre">	</span>//它能接收不确定个数的参数,但是确定变量类型
    public static int add(int x,int...args)
    {
        int sum = x;
        //调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,
        //在方法体中以数组的形式访问可变参数,那么我们就用到了遍历数组来进行操作。
        //因此就用到了增强for
        for(int arg : args)
        {
            sum+= arg;
        }
        return sum;
    }
}


 

Java(JDK1.5新特性:基本数据自动拆装箱及享元设计模式)

例如:

    Integer iObj = 3;//这个在1.5之前是非法操作,编译不通过的,

    然而1.5开始:基本类和基本数据类型可以无需转换直接参与计算

那么在程序中,两个Integer对象的值都为3,但是它们比较的结果为true,但是数值一旦超过-128~127这个范围时,比较结果为false。

 

这时就涉及到了java的享元设计模式了(flyweight)

因为小的数字重复使用的频率比大的数据高,如果一出现就封装成对象,那么最后对象越来越多,占用的内存会显得很臃肿,而把这些重复属性的对象(数值在一个字节之内-128~127之间时)进行封装成一个对象,它就在内存中只占用一个对象的空间,而把它们不同的属性变成方法的参数传递进来进行操作,实现共享。

代码演示:

public classAutoBox
{
    public static void main(String[] args)
    {
        //自动装箱
        IntegeriObj = 3;
        //自动拆箱
        System.out.println(iObj + 12);
       
        Integeri1 = 13;
        Integeri2 = 13;
        System.out.println(i1 == i2);
        //两个对象对比的结果是true
        //如果超出数值在一个字节之内-128~127之间时就会为false
    }
}


 

java(JDK1.5新特性:枚举)

作用: 枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。 

枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标

Java中的枚举并不是简单常量的集合,而是一个对象,其本质依然是类,所以Java中的枚举除了提供一系列相关值以外,还提供了一些额外功能,甚至还可以根据需要自行添加一些功能

代码演示:

public classEnumTest {
    public static void main(String[] args){
       
    //WeekDay1 weekDay = WeekDay1.MON;
    //System.out.println(weekDay.nextDay());
   
    WeekDayweekDay2 = WeekDay.FRI;
    System.out.println(weekDay2);//默认就是获取对象的名称
    System.out.println(weekDay2.name());//也可以指定用name方法,获取对象的名称
    System.out.println(weekDay2.ordinal());//这个变量对应引用类型的排序位置,从0开始排的
    System.out.println(WeekDay.valueOf("SAT"));//根据字符串封装为对象
    System.out.println(WeekDay.values().length);//得到枚举类中的所有的枚举元素长度,并用增强for循环遍历
   
   
   
    }
    //enum可以理解成为是特殊的class,
    //它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。
    public enum WeekDay{
        //元素列表必须位于枚举类的最前面
        SUN,MON,TUE,WED,THI,FRI,SAT;
        //枚举的构造方法必须是私有private的
        private WeekDay(){System.out.println("first");}
        private WeekDay(int day){System.out.println("sencond");}
    }
   
    public enum TrafficLamp{
        RED(30){
            public TrafficLamp nextLamp(){
                return GREEN;
            }
        },
        GREEN(45){
            public TrafficLamp nextLamp(){
                return YELLOW;
            }
        },
        YELLOW(5){
            public TrafficLamp nextLamp(){
                return RED;
            }
        };
        public abstract TrafficLampnextLamp();
        private int time;
        private TrafficLamp(int time){this.time=time;}
    }
}
 


 

反射的基石-àClass类(此特性从JDK1.2就开始出现了。)

java程序中的各个java类属于同一类事物,那么这类事物就称之为Class类。

详细的的说Class类就是描述内存中的字节码文件的,该类的对象就是内存中加载的字节码文件。

获取Class类常见的几种方式

    ClassforName(“String”);  //通过字符串的形式获取Class对象。

    类名.class;                //直接通过类名获取Class对象。

    new Object().getClass();   //通过对象调用getClass方法获取Class对象。

 

反射的作用是把类中的各种成分,映射到相应的类,

 

获取Constructor类对象(代表某一个类中的构造函数)

代码演示:

//获取这个类的所有构造方法。

Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();

//获取某一个构造方法:
Constructor constructor = String.class.getConstructor(StringBuffer.class);

 

获取Field类对象(代表获取一个类中的某一个成员变量)

代码演示:

//假设有一个ReflectPoint类,里面有x和y变量类型为int类型,而且都具备了get

//方法,获取其中一个变量并打印

ReflectPoint point = new ReflectPoint(4,9);

Field fieldX = point.getClass().getField(“x”);

System.out.println(fieldX.get(point));

 

获取Method类对象(代表获取一个类中的某个成员方法)

代码演示  

//获取这个类的一个成员方法

//定义一个字符串变量,并且设值。

String x = “abc”;

Method  methodCharAt =String.class.getMethod(“charAt”,int.class);

System.out.println(methodCharAt.invoke(a,1));

 

 

数组的反射

数组的Class对象:具有相同的元素类型和相同的维度代表是相同的Class实例对象。

数组的Class对象调用getSuperClass可以返回一个父类对应的Class类型对象。

基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用,非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。

 

反射的价值

Java中工具类是被用户所调用,而框架是调用用户提供的类。要实现框架这种功能,就必须要解决:无法知道用户类的名称,不能创建用户类的对象这些问题,那么就需要通过反射的方式来解决。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值