Java基础再进阶学习总结2015(一)

本文详细介绍了Java基础进阶的学习要点,包括方法可变参数的使用、增强for循环、枚举的基本使用、反射的基础知识如Class类、Constructor类、Field类、Method类以及数组的反射应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java基础再进阶学习总结(一)


小五游侠 8/3/2015 10:51:04 PM

1. 方法可变参数使用方法:

public int add(int x,int ... args){
    ......
}

2. 增强for循环:

for(int arg:args){
    ......
}

3. 枚举的基本使用

public enum WeekDay{
    SUN,MON,TUE,WED,THI,FRI.SAT
}

私有的构造方法:

抽象的构造方法:

public enum Trafficlamp{
    RED(30){
        public Trafficlamp nextlamp(){
            return GREEN;
        }
    },
    GREEN(30){
        public Trafficlamp nextlamp(){
            return YELLOW;
        }
    },
    YELLOW(30){
        public Trafficlamp nextlamp(){
            return RED;
        }
    };

    public abstract Trafficlamp nextlamp();

    private int time;

    private Trafficlamp(int time){this.time=time;}

}

枚举只有一个成员是,就可以作为一种单例的实现方式.

4. 反射的基础Class类

众多的类可以用class表示,当程序使用到某一个类的时候,会将这个类装成字节码存放到硬盘里面再转到内存里面.

Person p = new Person();

Class cls = Person.class;//字节码  p.getClass();  Class.forName("java.lang.String");  forName()的作用是返回字节码

返回字节码的方式有三种:

  • 类名.class.例如System.class

  • 对象.getClass,例如,new Date().getClass()

  • Class.forName(“类名”), 例如,Class.forName(“java.lang.String”);

有九个预定义Class实例对象,八个基本对象类型+一个void

Class.isPrimitive() 是否基本类型

Class.isArray() 是否数组类型

反射就是把java类中的各种成分映射成相应的java类

  • Constructor类(构造方法) 注意区分编译时,运行时

    //String.class.getConstructor(StringBuffer.class,int.class);

    Constructor constructor1 = String.class.getConstructor(StringBuffer.class);

    String str2 = (String)constructor1..newInstance(new StringBuffer(“abc”));

    System.out.println(str2.charAt(2));

  • Field类(成员变量)

    public class Point{
    
        public String str = "ccw";
    
        private int x;
    
        public int y;
    
        public Point(int x,int y){
    
            this.x = x;
            this.y = y;
        }
    }
    
    Point p = new  Point(3,5);
    
    //getField()获取可见的成员变量
    Fied fieldY = p.getClass.getField("y");
    
    //获取成员y的值,fieldY不是对象身上的变量,而是类上,要用它
    fieldY.get(p);
    
    //获取不可见成员变量
    Field fieldX = p.getClass().getDeclareField("x");
    //暴力反射
    fieldX.setAccessible(true);
    
    fieldX.get(p);
    
    //反射的一个综合实例
    Field[] fields = p.getClass.getFields();
    for(Field f:fields){
        //判断字节码相等,用==  语义才正确
        if(f.getType() == String.class){
            String oldValue = (String)f.get(p);
            String newValue = oldValue.replace("c","w");
            f.set(p,newValue);
        }
    }
    
  • Method类(成员方法)

    String str = "ccw";
    
    Method methodCharAt = String.class.getMethod("charAt",int.class);
    //(执行对象,参数)  调用静态方法是(null,参数)
    methodCharAt.invoke(str,1);
    
    
    String stratingClassName = arg[0];
    Method mainMethod = Class.forName(startingClassName).getMehtod("main",String[].class);
    //new String[]{"111","222"} 会报错  (Object)new String[]{"111","222"}
    mainMethod.invoke(null,new Objec[]{new String[]{"111","222"}});
    
  • 数组的反射应用

    每一个具有相同维数(一维数组,二维数组),及具有相同的元素类型,及类型相同的数组都属于同一个class。与元素个数无关
    java.util.Arrays 类,有大量的对数组进行操作的静态方法

    public class ReflectArray{
        public static void main(String args[])throws Exception{
           int [] a1 = new int[3];
           int [] a2 = new int[5];
           int [][] a3 = new int[2][3];
           String [] a4 = new String[4];
    
           System.out.println(a1.getClass() == a2.getClass()); //true
           //System.out.println(a1.getClass() == a3.getClass()); //false
           //System.out.println(a1.getClass() == a4.getClass()); //false
           System.out.println(a1.getClass().getName()); //结果:[I  [:表示数组 I:表示整型
          //获得父类名字,,先通过字节码获得父类字节码,在通过父类字节码获得名字
           System.out.println(a3.getClass().getSuperclass().getName());   //java.lang.Object
           System.out.println(a4.getClass().getSuperclass().getName());   //java.lang.Object
           Object aObj1 = a1;
           Object aObj2 = a4;
           //基本类型的一维数组不能转换为Object数组
           //Object[] aObj3 = a1;
           //int[] a1 可以理解为一个数组,里面装int, int是不属于Object,所以会报错
           Object[] aObj4 = a3;
           //int [][] a3 可以理解为 int[] 里面装 int[]
           Object[] aObj5 = a4;
           //String [] a4 可以理解为 一个数组,里面装 String,String属于Object
           a1[0]=1; a1[1]=2; a1[2]=3;
           a4[0]="a"; a4[1]="b"; a4[2]="c"; a4[3]="d";
           System.out.println(a1);
          //[I@35ce36  [I:int类型数组,@35ce36:hashcode值
           System.out.println(a4);
          //[Ljava.lang.String;@757aef:String类型数组,hashcode值为@757aef
           //Arrays类的asList方法,将数组转换成list
           System.out.println(Arrays.asList(a1));//[[I@35ce36],
           //因为jdk1.4中asList方法接收的是Object数组,int不属于Object
           System.out.println(Arrays.asList(a4));
          //[a,b,c,d],成功输出 //打印数组内容
        }
    }
    

    代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
    基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。

    java.lang.reflect.Array 用于反射数组
    例:数组反射的应用

    //使用反射得到数组的值, 长度
    public class ReflectArray2{
    public static void main(String args[])throws Exception{
       int [] a1 = new int[3];
       int [] a2 = new int[5];
       int [][] a3 = new int[2][3];
       String [] a4 = new String[4];
       a1[0]=1; a1[1]=2; a1[2]=3;
       a4[0]="a"; a4[1]="b"; a4[2]="c";a4[3]="d";
       printObject(a1);
       printObject("abcv");
       printObject(a4);
    }
    public static void printObject(Object obj){
       Class clazz = obj.getClass(); //获取obj的class
       if(clazz.isArray()){ //如果class是数组
       int len = Array.getLength(obj);
      //通过对数组反射的类Array得到数组的长度
       for(int i=0;i<len;i++){
      System.out.println(Array.get(obj,i));
    //逐个取出数组中的数据
       }
       }else{
       System.out.println(obj);
       }
    }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值