黑马程序员---JAVA基础加强(十七)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

 

一、JDK1.5新特性
1、 静态导入:
(1)import语句可以导入一个类或某个包中的所有类。
(2)import static语句导入一个类中的某个静态方法或所有静态方法。
语法举例:
import static java.lang.Math.sin;//导入Math类中的sin静态方法。
import static java.lang.Math.*; //导入Math类中的所有静态方法。

2、可变参数
可变参数的特点:
(1)只能出现在参数列表的最后;
(2)...位于变量类型和变量名之间,前后有无空格都可以;
(3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
例如:System.out.println(countScore(2,3,5));                        System.out.println(countScore(1,2,3,5));

3、枚举
(1)为什么要有枚举?
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
(2)用普通类如何实现枚举功能
私有的构造方法:每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
(3)扩展:枚举类的values,valueOf,name,toString,ordinal等方法。
(4)总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
枚举元素时SUN(1)和SUN()效果一样,都是调用的默认的构造函数。
枚举只有一个成员时,就可以作为一种单例设计模式的实现方式。

4、枚举的高级应用:
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
(1)带构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
(2)带方法的枚举
定义枚举TrafficLamp
实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
枚举只有一个成员时,就可以作为一种单例的实现方式。
《注意》如果枚举元素后面没有大括号对,那是不会生成内部类的。先看有内部类的效果,再看没有内部类的效果,eclipse自动删除原来的内部类。
(3)写带有抽象方法的枚举步骤和技巧:
1)enum TrafficLamp{RED,GREEN,YELLOW}
        2)enum TrafficLamp{RED,GREEN,YELLOW;public abstract next();}
        3)enum TrafficLamp{RED{},GREEN{},YELLOW{};public abstract next();}
        4)填充各个{}中的next方法。

5、Class类
Java程序在运行时,系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。
Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。其实对象是对应各个类在内存中的字节码。
虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。
每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
(1)各个字节码对应的实例对象(Class类型)获取方法,即获取Class对象的三种方式
1)类名.class,例如,System.class;
2)对象.getClass(),例如,new Date().getClass();
3)Class.forName("类名"),例如,Class.forName("java.util.Date");

6、反射
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field(成员字段)、Method(方法)、Contructor(构造方法)、Package(包)等等。
(1)反射技术:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性以及方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简单一句话:反射技术可以对类进行解剖。
(2)反射作用
1)在运行时判定任意一个类所具有的成员变量和方法;
2)在运行时构造任意一个类的对象;
3)在运行时判定任意一个对象所属的类;
4)在运行时调用任意一个对象的方法;
5)生成动态代理。

7、Constructor类
Constructor类代表某个类中的一个构造方法
(1)得到某个类所有的构造方法:Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
(2)得到某一个构造方法:Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);//获得方法时要用到类型
(3)创建实例对象:
1)通常方式:String str = new String(new StringBuffer("abc"));
2)反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型的实例对象

 

//Person类  
package com.itheima;  
  
public class Person {  
    private String name;  
    public int age;  
    public Person(){  
        System.out.println("Person is run");  
    }  
    public Person(String name,int age){  
        this.age=age;  
        this.name=name;  
    }  
      
    public String toString(){  
        return name+":"+age;  
    }  
}  
//示例  
package cn.itheima;  
  
public class CreateClassDemo {  
    public static void main(String[] args) throws Exception {  
        createPersonClass();  
    }  
       //通过Class对象创建类实例方法  
    public static void createPersonClass() throws Exception{  
        //获取Person类的Class对象  
        String className="cn.itheima.Person";  
        Class clazz=Class.forName(className);  
        //通过newInstance方法获取类的无参构造函数实例  
        Person p=(Person)clazz.newInstance();  
    }  
}  


 

8、Field类
Field类代表某个类中一个成员变量。
1)Field getField(String s);//只能获取公有和父类中公有
Field getDeclaredField(String s);//获取该类中任意成员变量,包括私有
setAccessible(ture); //如果是私有字段,要先将该私有字段进行取消权限检查的能力。也称暴力访问。
set(Object obj, Object value);//将指定对象变量上此Field对象表示的字段设置为指定的新值。
Object get(Object obj);//返回指定对象上Field表示的字段的值。

//获取Person对象的成员变量  
public static void getPersonField() throws Exception{     
//如果想要给该变量赋值,必须先要有对象。  
    Class clazz=Class.forName("cn.itheima.Person");  
    Person p=(Person)clazz.newInstance();  
          
    //获取所以的成员变量  
    Field[] fs=clazz.getFields();  
    for(Field f:fs){  
        System.out.println(f);  
    }  
          
    //获取指定的成员变量  
    Field fage=clazz.getField("age");  
    Field fname=clazz.getDeclaredField("name");  
          
    //显示改变后的值  
    fage.set(p, 20);  
    System.out.println(fage.get(p));  
          
    //暴力访问私有变量  
    fname.setAccessible(true);  
    fname.set(p, "zhangsan");  
    System.out.println(fname.get(p));  
}  



 

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值