您现在的位置:首页 >> 基础 >> Java语法 >> 内容

JDK1.5以后提供的新特性--Java自学网

时间:2015-1-9 21:06:17

  核心提示:java基础增强JDK1.5以后提供的新特性。1,自动拆箱/装箱好处:简化基本数据类型包装类的编写。Integer i = 30;//自动装箱。i = i + 3;//拆箱:intValue(),将运...

java基础增强
JDK1.5以后提供的新特性。
1,自动拆箱/装箱
 好处:简化基本数据类型包装类的编写。
 Integer i = 30;//自动装箱。
 i = i + 3;//拆箱:intValue(),将运算完的结果进行装箱。
 注意:Integer i = null;NullPointerException().
 
 --------------------------------------------------
2,静态导入:
 好处:简化代码编写。
 import导包动作用来简化类的书写。
 为了简化工具类中的静态方法调用。
 import static java.lang.System.*;  out.println("demo");


--------------------------------------------------
3,可变参数。
 好处:简化书写。
 void methodName(类型... 参数)
 三个点代表什么?代表的是接收一个该类型的数组。
 注意:可变参数必须写在参数列表的末尾。


--------------------------------------------------
4,泛型:jdk1.5推出一个安全机制。
 好处:将运行时期出现的问题(ClassCastException)转移到编译时期
   避免了强转的麻烦。
   优化了程序设计。
 格式:<T>,相当于给类或者方法传递一个引用数据类型参数。
   ArrayList<String>
 泛型的应用:在操作对象的时候指定对象的类型。
 泛型类的设计:
   早期:通过Object完成的。但是这种方式需要强制,容易出现类型转换异常。
   有了泛型类以后:在定义类时直接定义该类对象所操作的引用数据类型。
   class Demo<Q>
   {
    private Q obj;
    public void setObj(Q obj)
    {
     this.obj = obj;
    }
   }
 泛型方法的设计:
   在类上定义时,代表着该类对象调用方法时操作的是同一种指定数据类型。
   可是现在的需求是:每一个方法操作的类型有可能不同。但还不确定是哪一种类型。
   那么这时将泛型定义在方法上。
   public <T> void show(T t){},
   通常用在静态方法中。可以参照API文档中的Collections。
 泛型的限定:
  <? extends E>: 可以接收E类型或者E的子类型。
  <? super E>: 可以接收E类型或者E的父类型。
  
 什么时候使用泛型呢?
  当描述对象或者描述功能时,其中操作的引用数据类型不确定的时候,使用泛型。不使用泛型可以使用Object。
  
----------------------------------------------------------

5,增强for循环
 好处:简化了遍历。
 和老式for循环有什么区别?
  新式for循环,需要有一个被变量的目标。或者集合或者数组。
  

----------------------------------------------------------

6,反射
 特点:动态获取类以及类中成员。
 好处:通常在程序扩展时,会使用父类或者接口完成,其实就是多态。
   在这种情况,运行时,还是需要给其传递一个自定义的子类对象。需要自己new来完成。
   虽然修改动作已经很少了,但还是需要修改部分细节。

  interface Inter{void show();}
  class Demo
  {
   void function(Inter in)
   {
    in.show();
   }
  }
  main()
  {
   Demo d = new Demo();
   
   d.function(new InterImpl());//这里还要做一个小小的改动,传入一个新的后期子类对象。
  }
  class InterImpl implements Inter{public void show(){}}
  
  能不能完全不改动源程序,就可以运行后期子类内容呢?
  对外暴露一个配置文件,该配置文件可以是键值对形式的.ini文件。xml文件。config.txt
  通过反射机制动态获取子类字节码文件。并动态创建其对象。
 
  
  main()
  {
   Demo d = new Demo();
   
   BufferdReader bufr = new BufferedReader(new FileReader("config.txt"));
   String className = bufr.readLine();
   Class clazz = Class.forName(className);
   
   Inter in = (Inter)clazz.newInstance();
   
   
   d.function(in);
  }
  
  前期设计完成。
  
  在配置文件中只要将子类字节码名称,写入即可。
  config.txt
  className=InterImpl
  
  通过上面示例,可以看到反射进一步增强了程序的扩展性。
  --------------------------------------
  Class类将字节码文件封装成对象。
  那么就可以指挥该对象做事情,字段Field,函数Method,构造函数Constructor,都被封装成了对象。
  
  public class Person
  {
   private String name;
   private int age;
   public Person(String name,int age)
   {
    
   }
   public void show()
   {
    System.out.println("name="+name+",age="+age);
   }
  }
  
  main()
  {
   //1,获取指定类的字节码对象。
   //a,对象.getClass();
   //b,类名.class.
   //c,Class.forName("类名");
   
   Class clazz = Person.class;
   
   //获取示例,示例是不是要先构造初始化。
   //没有空参数的,就要收到获取但参数的构造函数。
   Constructor cons = clazz.getConstructor(String.class,int.class);
   
   //指挥这个构造函数示例化。
   Person  p = (Person)cons.newInstance("zhangsan",30);
   
   
   //获取类中的方法对象。
   Method m = clazz.getMethod("show",null);
   //指挥方法对象做事情。调用invoke方法。
   m.invoke(p,null);
  }
  
----------------------------------------------------------------
7,枚举类型 
 好处:是一种简化形式。
   将常见的具体值进行了封装。限定了取值范围。
   将运行时出现的问题,转移到了编译时期。
   可以直接用switch语句对枚举的值进行选择。
 特点:  
  enum是新特性中提供的一个新的引用数据类型。
  每一个枚举值都是一个enum类型的子类对象。
  在枚举中可以定义一般方法和抽象方法。
  还可以定义构造函数。但构造函数不可以共有。
  那么定义了抽象方法,该如何实现呢?
  因为枚举的子类对象已经是定义好的,可以在每一个值中进行抽象方法的复写。
  
  public enum Demo{
   //GOOD,PASS;//调用枚举中空参数构造函数初始化。
   
   GOOD("良好")
   {
    public int getNum()
    {
     return 4;
    }
   },
   PASS("及格")
   {
    public int getNum()
    {
     return 3;
    }
   };
   private String name;
   private Demo(String name)
   {
    this.name = name;
   }
   public String getName()
   {
    return name;
   }
   public abstract int getNum();
  }
  
  //什么时候用枚举?
  当分析事物时,值是固定时,可以用枚举类型来将值的范围固定。
  比如:性别,星期,月份等。
  
  
  
  而早期没有枚举的时候,怎么来描述具体固定值这样的应用场景呢?
  通过接口的形式来描述。每一个值有可能不是基本数据类型。因为基本数据类型描述过于简单。
  通过对象来描述。参考MyEnum.java
  
  新出的enum类型要间的多。
  
-----------------------------------------------------------------
  
  
   
   

Java免费学习  Java自学网  http://www.javalearns.com

好好生活网  http://www.haohaosh.com

作者:不详 来源:网络
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号