码迷,mamicode.com
首页 > 编程语言 > 详细

java基础知识

时间:2015-03-15 12:12:28      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

 

静态导入:import static 包名.类名.静态属性|静态方法|*

自动装箱/拆箱
  自动装箱:可以把一个基本数据类型直接赋给对应的包装类
  eg:Integer i = 1 //装箱 实际为 Integer i = new Integer(1); 自动把1封装成一个Integer对象
  自动拆箱:可以把一个包装类对象直接赋给对应的基本数据类型
  eg:Integer i = 1;int j = i //拆箱
  运用:
  Integer i = 1;
  int j = i;

1 List list = new ArrayList();
2 list.add(1); //可以添加任何对象。
3 list.add(3);
4 list.add(2);
5 Iterator it = list.iterator();
6 while(it.hasNext()){ //遍历
7     int k = (Integer) it.next();
8 }

 

增强for循环:取数组和集合的数据---只适合取数据。只能用在数组,或实现iterable接口的集合
      语法格式:for(变量类型 变量 :需迭代的数组或集合){}

package cn.lcp.eclipse;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.junit.Test;

public class Demo3 {
    /*
     *1
     *2
     *3
     */
    @Test
    public void test(){
        int arr[] = {1, 2, 3};
        for(int num : arr){
            System.out.println(num);        
        }
    }
    
/* *1 *2 *3 */ @Test public void test2(){ List list = new ArrayList(); list.add(1); list.add(2); list.add(3); for(Object obj : list){ int i = (Integer) obj; System.out.println(i); } }


@Test
public void test3(){ Map map = new HashMap(); map.put("1", "aaa"); map.put("2", "bbb"); map.put("3", "ccc"); //传统方式1 /* * 3=ccc * 2=bbb * 1=aaa */ Set set = map.keySet(); //得到一个set集合,保存了map里面的所有的key Iterator it = set.iterator(); //通过迭代器取到所有的key while(it.hasNext()){ String key = (String) it.next(); //把取到的的key强转成字符串 String value = (String) map.get(key); //得到key所对应的值 System.out.println(key + "=" + value); } } @Test public void test3_2(){ Map map = new LinkedHashMap(); map.put("1", "aaa"); map.put("2", "bbb"); map.put("3", "ccc"); //传统方式2 /* * 1=aaa * 2=bbb * 3=ccc */ Set set = map.keySet(); //得到一个set集合,保存了map里面的所有的key Iterator it = set.iterator(); //通过迭代器取到所有的key while(it.hasNext()){ String key = (String) it.next(); //把取到的的key强转成字符串 String value = (String) map.get(key); //得到key所对应的值 System.out.println(key + "=" + value); } } /* *1=aaa *2=bbb *3=ccc */ @Test public void test4(){ Map map = new LinkedHashMap(); map.put("1", "aaa"); map.put("2", "bbb"); map.put("3", "ccc"); //传统方式3 Set set = map.entrySet(); //里面存放的都是一个个键值对 Iterator it = set.iterator(); //通过迭代器取到所有的key,和value while(it.hasNext()){ Map.Entry entry = (Entry) it.next(); //获取的是一个Map.Entry String key = (String) entry.getKey(); //得到key String value = (String) entry.getValue(); //得到value System.out.println(key + "=" + value); } } /* *1=aaa *2=bbb *3=ccc */ @Test public void test5(){ Map map = new LinkedHashMap(); map.put("1", "aaa"); map.put("2", "bbb"); map.put("3", "ccc"); //增强for循环1 /* * 因为map集合不能直接迭代,所以先把map集合转成set集合 */ for(Object obj : map.keySet()){ //先把map集合转成set集合,每个obj都是一个key String key = (String) obj; String value = (String) map.get(key); //拿到key所对应的值 System.out.println(key + "=" + value); } } /* *1=aaa *2=bbb *3=ccc */ @Test public void test6(){ Map map = new LinkedHashMap(); map.put("1", "aaa"); map.put("2", "bbb"); map.put("3", "ccc"); //增强for循环2 /* * 因为map集合不能直接迭代,所以先把map集合转成set集合 */ for(Object obj : map.entrySet()){ //每一个obj都是一个object的键值对 Map.Entry entry = (Entry) obj; //把obj转化成entry,获取的是一个Map.Entry String key = (String) entry.getKey(); //得到key String value = (String) entry.getValue(); //得到value System.out.println(key + "=" + value); } } @Test public void test7(){ //增强for循环 /* * 注意事项:只适合取数据 * 1 * 2 * 3 */ int arr[] = {1, 2, 3}; for(int i : arr){ i = 10; } //只能通过传统的方式改变数组里面的值。 for(int i = 0; i < arr.length; i ++){ arr[i] = 10; } System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); List list = new ArrayList(); list.add("1"); for(Object obj : list){ obj = "10"; //定义变量有原来指向1,现在指向10.并没有改变集合里面的东西 } System.out.println(list.get(0)); } }

可变参数

package cn.lcp.eclipse;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class Demo4 {
    
    //可变参数
    @Test
    public void testSum(){
        //这两种调法都是一样的结果
        1)sum(1, 2, 3, 4, 5, 8);
        
        2)int arr[] = {1, 2, 3, 4, 5, 8};
        sum(arr);  
    }
    public void sum(int ...num){   //可变参数可以把它看成一个数组
        int sum = 0;
        for(int i : num){
            sum += i;
        }
        System.out.println(sum);
    }
    
    //可变参数注意事项:public void sum(int ...num, int i)这样错误
    //public void sum(int i, int ...num)这样可以
    @Test
    //asList参数是一个或多个对象,即为可变对象。
    public void bb(){
        List list = Arrays.asList("1", "2", "3");  //""是一个对象
        System.out.println(list);
        
        String arr[] = {"1","2","3","5"};
        list = Arrays.asList(arr);
        System.out.println(list);
        
        int nums[] ={1, 2, 4};
        list = Arrays.asList(nums);  //把数组当成一个对象往里面放
        System.out.println(list);
        
        Integer nums_2[] ={1, 2, 4};   //对象数组
        list = Arrays.asList(nums_2);  //把对象数组往里面放
        System.out.println(list);
        
        /*
         * [1, 2, 3]
         * [1, 2, 3, 5]
         * [[I@3cb243d7]
         * [1, 2, 4]
         */
    }
}

 

枚举值

  作用:程序运行时,需要的数据不能是任意的,而必须是一定范围内的值,可以直接采用枚举解决
  用enum关键字定义一个枚举类。
  一个枚举可以有构造函数,字段和方法。
  是一样的效果。
  class Grade{
    public static final Grade A = new Grade();
  }
  enum Grade{ //相当于一个类
    A, B, C, D; //是一个Object,这里的A是通过调用无参构造函数public static final Grade A = new Grade();
  }

package cn.lcp.enumeration;

    import org.junit.Test;
    public class Demo {
        
        @Test 
        public void test(){
            print(Grade.B);
        }
        public void print(Grade g){
            String value = g.getValue();
            System.out.println(value);
        }     
    }

    enum Grade{            //相当于一个类
        A("100-90"), B("89-80"), C("79-70"), D("69-0");        //是一个Object
        private String value;      //封装每个对象对应的分数
        private Grade(String value){     //定义枚举的构造函数,字段,方法
            this.value = value;
        }
        public String getValue(){
            return this.value;
        }
    }

带抽象方法的枚举:

枚举常用方法:
  枚举类特征:枚举类是一个特殊的java类/声明的每一个枚举值代表枚举类的一个实例对象/声明枚举类时,可以声明属性,方法和构造函数,但构造函数必须为私有的。
        枚举类也可以实现接口,或继承抽象类/switch语句可以接受一个枚举类型/若枚举类只有一个值,则可以作为单态设计模式使用
  java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。
  常用name()-返回枚举的常量名称; ordinal()-返回当前枚举值在枚举中的位置,校表从0开始;
  valueof(class enumname, String name)-将某个字符串转成枚举;value()-遍历枚举的所有的值;

package cn.lcp.enumeration;

        import org.junit.Test;

        public class Demo2 {
            
            @Test 
            public void test(){
                print(G.B);
            }
            public void print(G g){
                String value = g.localValue();
                System.out.println(value);
            }
                    
                    public void test2(){
                System.out.println(G.A.name());//得到C的枚举类名称
                System.out.println(G.A.name());//得到枚举的位置,下标从0开始
                
                String str = "B";              //把字符串转化成枚举,在实际开发中,需要将表单中的值改变为枚举值
                G g = G.valueOf(G.class, str);
                G g_2 = G.valueOf(str);
                System.out.println(g);
                
                G[] g_3 = G.values();        //返回的是一个枚举类的数组,存储的是枚举值
                for(G gg : g_3){
                    System.out.println(gg);
                }
            }
        }

        enum G{            //相当于一个类
            A("100-90"){    //new出每一个对象,都要把这个枚举的抽象方法实现了 
                public String localValue(){
                    return "优";
                }
            }
            , B("89-80"){
                public String localValue(){
                    return "良";
                }
            }
            
            , C("79-70"){
                public String localValue(){
                    return "中";
                }
            }
            
            , D("69-0"){
                public String localValue(){
                    return "差";
                }
            };        //是一个Object
            private String value;      //封装每个对象对应的分数
            private G(String value){     //定义枚举的构造函数,字段,方法
                this.value = value;
            }
            public abstract String localValue();
        }
public void test2(){
    System.out.println(G.A.name());//得到C的枚举类名称
    System.out.println(G.A.name());//得到枚举的位置,下标从0开始

    String str = "B"; //把字符串转化成枚举,在实际开发中,需要将表单中的值改变为枚举值
    G g = G.valueOf(G.class, str);
    G g_2 = G.valueOf(str);
    System.out.println(g);

    G[] g_3 = G.values(); //返回的是一个枚举类的数组,存储的是枚举值
    for(G gg : g_3){
      System.out.println(gg);
    }
  }

 

反射:反射就是加载类,并解剖出类的各个组成部分。一个类有多个组成部分,如:成员变量,成员方法,构造方法,是基于配置文件,是做框架的
加载类:Class类代表某一个类的字节码。
  Class类代表某个类的字节码,提供加载某个类的字节码的方法:forName()--用于加载某个类的字节码到内存中,并使用class对象进行封装。
  得到class对象的方法: 类名.class; 对象.getClass()
  3种方法获取类的字节码文件
  //1 这里已经有一个Person类了
  Class class_1 = Class.forName("cn.lcp.reflect.Person");//把硬盘里面的字节码,加载到内存里面了。并使用class_1对象进行封装,所以就保存了这个类的字节码。
  //2
  Class class_2 = new Person().getClass();
  //3
  Class class_3 = Person.class;
解剖类:getConstructor,getMethod,getField,这是获取公共的构造函数,方法,成员变量(属性)。解剖出来的成员分别使用Constructor,Method,Field对象表示。
getDeclaredConstructor,getDeclaredMethod,getDeclaredField,这是获取私有的构造函数,方法,成员变量(属性)

 

 

利用Constructor创建对象:
//反射构造函数:public Person()
        @Test
        public void test1()throws Exception{
            //获取Person类的字节码文件
            Class clazz = Class.forName("cn.lcp.reflect.Person");
            //反射的是一个public无参构造函数
            Constructor c = clazz.getConstructor(null);
            //利用反射出的无参构造函数实例化一个Person对象
            Person p = (Person) c.newInstance(null);
            //检测调用是否成功
            System.out.println(p.name);
        }
        
        //反射构造函数:private Person(List list)
         @Test
         public void test2()throws Exception{
             //获取Person类的字节码文件
             Class clazz = Class.forName("cn.lcp.reflect.Person");
             //反射的是一个private无参构造函数
             Constructor c = clazz.getDeclaredConstructor(List.class); 
             //利用反射出的无参构造函数实例化一个Person对象
             //可以加上这句:c.setAccessible(true);    //暴力反射,
             Person p = (Person) c.newInstance(new ArrayList());
             //检测调用是否成功
             System.out.println(p.name);
         }
            
        //创建构造函数的另外的一种方法,与test1相同
            public void test4() throws Exception{
                Class clazz = Class.forName("cn.lcp.reflect.Person");
                Person p = (Person) clazz.newInstance();     //这里是实例化无参的构造函数
            }
利用Method执行方法:
//反射类的方法
        /*public void a1(){
            System.out.println("a1");
        }*/
        @Test
        public void test1() throws Exception{
            Person p = new Person();
            Class clazz = Class.forName("cn.lcp.reflect.Person");
            Method method = clazz.getMethod("a1", null);    //确定反射的哪个方法,第一个是方法名,第二个为函数参数的个数。
            method.invoke(p, null);            //第一个为对象,第二个调用方法的参数
        }
@Test
/*public void a1(String name, int password){ System.out.println(name + ":" + password); }*/ public void test2() throws Exception{ Person p = new Person(); Class clazz = Class.forName("cn.lcp.reflect.Person"); Method method = clazz.getMethod("a1", String.class, int.class); //确定反射的哪个方法,第一个是方法名,第二个为函数参数的个数。 method.invoke(p, "lcp", 38); //第一个为对象,第二个调用方法的参数 } @Test /*public Class[] a1(String name, int[] password){ return new Class[]{String.class}; }*/ public void test3() throws Exception{ Person p = new Person(); Class clazz = Class.forName("cn.lcp.reflect.Person"); Method method = clazz.getMethod("a1", String.class, int[].class); //确定反射的哪个方法,第一个是方法名,第二个为函数参数的个数。 Class cs[] = (Class[]) method.invoke(p, "lcp", new int[]{1, 2, 3}); //第一个为对象,第二个调用方法的参数 System.out.println(cs[0]); //因为那个方法返回一个值。 } @Test /*private void a1(InputStream in){ System.out.println(in); }*/ public void test4() throws Exception{ Person p = new Person(); Class clazz = Class.forName("cn.lcp.reflect.Person"); Method method = clazz.getDeclaredMethod("a1", InputStream.class); //确定反射的哪个方法,第一个是方法名,第二个为函数参数的个数。 method.setAccessible(true); //强制打开访问权限 method.invoke(p, new FileInputStream("C:\\1.txt")); //第一个为对象,第二个调用方法的参数 } @Test /*public static void a1(int num){ System.out.println(num); }*/ public void test5() throws Exception{ Class clazz = Class.forName("cn.lcp.reflect.Person"); Method method = clazz.getMethod("a1", int.class); //确定反射的哪个方法,第一个是方法名,第二个为函数参数的个数。 method.invoke(null, 23); //第一个为对象,第二个调用方法的参数,静态方法调用时不需要对象 }
反射main方法:
        @Test
        /*public static void main(String[] args) {
            System.out.println("main");
        }*/
        public void test() throws Exception{
            Class clazz = Class.forName("cn.lcp.reflect.Person");
            Method method = clazz.getMethod("main", String[].class);    //确定反射的哪个方法,第一个是方法名,第二个为函数参数的个数。
            //method.invoke(null, (Object)new String[]{"aa", "bb"});            //第一个为对象,第二个调用方法的参数,静态方法调用时不需要对象
            method.invoke(null, new Object[]{new String[]{"aa", "bb"}});
        
        }
反射类的字段:
//反射字段
    //public String name = "aaa";
    @Test
    public void test1() throws Exception{
        Person p = new Person();
        Class clazz = Class.forName("cn.lcp.reflect.Person");
        Field f = clazz.getField("name");     //确定某个字段名
        Object value = f.get(p);              //获取字段值
        Class type = f.getType();             //获取字段的类型
        if(type.equals(String.class)){
            String svalue = (String) value;   //把字段转换成String
            System.out.println(svalue);
        }
        f.set(p, "lop");                      //设置某个对象的字段值
    }
    
    //private int password = 123;
    @Test
    public void test2() throws Exception{
        Person p = new Person();
        Class clazz = Class.forName("cn.lcp.reflect.Person");
        Field f = clazz.getDeclaredField("password");     //确定某个字段名
        f.setAccessible(true);                            //强制打开访问权限
        System.out.println(f.get(p));                     //得到字段值
    }
    
    //private static int age = 22;
    @Test
    public void test3() throws Exception{
        Person p = new Person();
        Class clazz = Class.forName("cn.lcp.reflect.Person");
        Field f = clazz.getDeclaredField("age");     //确定某个字段名
        f.setAccessible(true);                            //强制打开访问权限
        System.out.println(f.get(p));                     //得到字段值
    }

 

内省操作javabean的属性:

public class Person {   //javabean
        private String name;       //字段
        private String password;   //字段
        private int age;
        
        //属性1:ab
        public String getAb(){
            return null;
        }
        //属性2:name
        public String getName(){
            return name;
        }
        //属性2:name
        public void setName(String name){
            this.name = name;
        }
        //属性3:password
        public String getPassword(){
            return name;
        }
        //属性3:password
        public void setPassword(String password){
            this.password = password;
        }
        //属性4:age
        public int getAge(){
            return age;
        }
        public void setAge(int age){
            this.age = age;
        }
        //属性5:class。因为任何类都是都是object的孩子。里面自动继承了Object的属性。里面有一个getClass方法。
    }
package cn.lcp.introspector;

    import java.beans.BeanInfo;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;

    import org.junit.Test;

    public class Demo {

        @Test
        /**
         * 得到bean的所有属性
         * @throws Exception
         */
        public void test1() throws Exception{
            //内省某个类,拿到类的所有属性--是某个set或get方法
            //因为任何类都是都是object的孩子。里面自动继承了Object的属性。里面有一个getClass方法。
            BeanInfo info = Introspector.getBeanInfo(Person.class);
            //得到bean自己的属性,出去从父类继承的属性
            BeanInfo info2 = Introspector.getBeanInfo(Person.class, Object.class);
            //拿到属性描述器
            PropertyDescriptor[] pds = info2.getPropertyDescriptors();
            for(PropertyDescriptor pd : pds){
                System.out.println(pd.getName());
            }
        }
        
        
        /**
         * 操作bean的指定属性
         * @throws Exception
         */
        @Test
        public void test2() throws Exception{
            Person p = new Person();
            PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);   //使用指定的age属性
            //相当于Person的public void setAge(int age)属性
            //得到属性的写方法,为属性赋值
            Method method = pd.getWriteMethod();
            method.invoke(p, 44);
           
            //获取属性值
            method = pd.getReadMethod();   //public int getAge();
            System.out.println(method.invoke(p, null));   //getAge这个函数没有参数
        }
        
        /**
         * 获取当前操作的属性类型
         * @throws Exception
         */
        @Test
        public void test3() throws Exception{
            PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
            System.out.println(pd.getPropertyType());
        }
    }

使用beanUtils操作javabean:需要commons-logging的jar包和 beanUtilsjar包。
    在java文件与src相同等级新建一个lib文件夹,把两个jar包放到这个地方,选中这两个jar包,右击build path->add to build path

package cn.lcp.beanutils;

import java.util.Date;

public class Person {   //javabean
    private String name;       //字段
    private String password;   //字段
    private int age;
    private Date birth;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    
}
package cn.lcp.beanutils;

import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.junit.Test;

//使用beanutils操纵bean属性
public class Demo {
    @Test
    public void test() throws IllegalAccessException, InvocationTargetException{
        Person p = new Person();
        BeanUtils.setProperty(p, "name", "xcc");
        System.out.println(p.getName());
    }
    
    @Test
    public void test2() throws IllegalAccessException, InvocationTargetException{
        String name = "xxcc";       
        String password = "123";   
        String age = "11";
        String birth = "1990-09-09";
        
        Person p = new Person();
        BeanUtils.setProperty(p, "name", name);     //只支持8种基本数据类型
        BeanUtils.setProperty(p, "password", password);
        BeanUtils.setProperty(p, "age", age);
        
        
        System.out.println(p.getName());
        System.out.println(p.getPassword());
        System.out.println(p.getAge());
    }
    
    @Test
    public void test3() throws IllegalAccessException, InvocationTargetException{
        
        String birth = "1990-09-09";
        //为了让日期赋值到bean的birth属性上,我们给beanUtils注册一个日期转换器。
        ConvertUtils.register(new Converter(){
            public Object convert(Class type, Object value){
                if(value == null){
                    return null;
                }
                if(!(value instanceof String)){
                    throw new ConversionException("只支持String类型的转换");
                }
                String str = (String) value;
                if(str.trim().equals("")){
                    return null;
                }
                //设置日期格式
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                try {
                    return df.parse(str);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    throw new RuntimeException(e);  //异常链不能断
                }
                
            }
        }, Date.class);
        
        Person p = new Person();
        BeanUtils.setProperty(p, "birth", birth);
        System.out.println(p.getBirth());
        
    }
    
    @Test
    public void test4() throws IllegalAccessException, InvocationTargetException{
        
        String birth = "1990-09-09";
        //为了让日期赋值到bean的birth属性上,我们给beanUtils注册一个日期转换器。
        //有bug
        ConvertUtils.register(new DateLocaleConverter(), Date.class);
        
        Person p = new Person();
        BeanUtils.setProperty(p, "birth", birth);
        System.out.println(p.getBirth());
        
    }
    
    @Test
    public void test5() throws IllegalAccessException, InvocationTargetException{
        Map map = new HashMap();
        map.put("name", "aa");
        map.put("password", "123");
        map.put("age", "23");
        map.put("birth", "1980-09-09");
        
        ConvertUtils.register(new DateLocaleConverter(), Date.class);
        Person bean = new Person();
        BeanUtils.populate(bean, map);   //把map集合中的值填充到bean的属性上
        

        System.out.println(bean.getName());
        System.out.println(bean.getPassword());
        System.out.println(bean.getAge());
        System.out.println(bean.getBirth());
    }
}

 

 

 

泛型://前面定义变量指定一个集合,通过泛型<String>指定的集合处理类型必须是String类型
  List<String> list1 = new ArrayList<String>();
  list1.add("qqq");
  String s = list1.get(0);
  System.out.println(s);

@Test
    public void test(){
        List<String> list = new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        
        //集合迭代器
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String value = it.next();
            System.out.println(value);
        }
        
        //增强for循环
        for(String s : list){
            System.out.println(s);
        }
        
        
    }
    
    @Test
    public void test2(){
        //定义一个变量,指向一个map集合。指向一个map集合,关键字是Integer,值是String类型
        Map<Integer, String> map = new LinkedHashMap();
        map.put(1, "aa");
        map.put(2, "bb");
        map.put(3, "cc");
        map.put(4, "dd");
        
        //传统keyset,entryset
        Set<Map.Entry<Integer, String>> set = map.entrySet();
        Iterator<Map.Entry<Integer, String>> it = set.iterator();
        while(it.hasNext()){
            Map.Entry<Integer, String> entry = it.next();
            int key = entry.getKey();
            String value = entry.getValue();
            
            System.out.println(key + " : " + value);
        }
        //增强for循环<重点>
        for(Map.Entry<Integer, String> entry : map.entrySet()){
            int key = entry.getKey();
            String value = entry.getValue();
            
            System.out.println(key + " : " + value);
        }
    }

 

自定义泛型:自定义泛型方法,自定义泛型类
自定义泛型方法:
  @Test
  //先声明T 再使用T。
  public <T> void a(T t){

  }
  //设置3个泛型,在使用方法的时候为TKE赋予具体的类型
  public <T, K, E> void a(T t, K k, E e){

  }

  //如果很多个方法都使用到同一泛型:那么可以将泛型声明在类上面。作用域就是整个类的范围。只作用在这个类的非静态成员上面
  public class Demo3<T> {

    public void a(T t){

    }

    public <K ,E> void a(T t, K k, E e){

    }

    public static <T> void c(T t){

    }
  }

例子:
        编写一个泛型方法,实现指定位置上的数组元素的交换
        public <T> void swap(T arr[], int post1, int post2){
            T temp = arr[post1];
            arr[post1] = arr[post2];
            arr[post2] = temp;
        }
        编写一个泛型方法,实现跌倒数组中的所有元素
        public <T> void reverse(T arr[]){
            int start = 0;
            int last = arr.length - 1;
            for(start; start <= last; start ++,last--){
                T temp = arr[start];
                arr[post1] = arr[last];
                arr[last] = temp;
            }
        }
    

 

java基础知识

标签:

原文地址:http://www.cnblogs.com/lcpholdon/p/4338912.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!