JDK1.5 新特性
2024-08-22 01:14:25
1:自动装箱与拆箱
自动装箱:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。
自动拆箱:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方法。
2:枚举
简单用法:JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。
复杂用法:Java为枚举类型提供了一些内置的方法,同时枚举常量还可以有自己的方法。可以很方便的遍历枚举对象。
public enum Color {
RED, GREEN, BLANK, YELLOW
}
3:静态导入
import xxxx 和 import static xxxx的区别是前者一般导入的是类文件如import java.util.Scanner;后者一般是导入静态的方法,import static java.lang.System.out;
import static java.lang.System.out;//导入java.lang包下的System类的静态方法out;
public class HelloWorld{
public static void main(String[] args){
out.print("Hello World!");//既是在这里不用再写成System.out.println("Hello World!")了,因为已经导入了这个静态方法out。
}
}
4:可变参数(Varargs)
可变参数的简单语法格式为:
methodName([argumentList], dataType... argumentName);
比如你想定义一个方法,但是不知道以后要用的时候想传几个参数进去,比如求和,你想定义一个传几个int数据都能给你算出和的方法,可以在方法的参数列表中这样写(参数类型... 数组名),然后在方法内部直接用操作数组的方式操作。在你调用的时候可以随便传几个参数进去,JVM都能将这些数据封装成一个数组,然后按照你方法内的操作进行操作。
举我上面说的求和的例:
public static int Sum(int... arr){
int sum=0;
for(int i=0;i<arr.length-1;i++){
sum+=arr[i];
}
return sum;
}
调用:
Sum(1,2,3,4,5,6)
使用可变参数的一个注意:可变参数的定义,必须是放在参数列表的最后面,否则编译失败!
5:内省(Introspector)
内省是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter /setter方法,通过这些API可以使你不需要了解这个规则(但你最好还是要搞清楚),这些API存放于包java.beans中。
一 般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器 (PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来 调用这些方法。
反射和内省操作很多时候都是在做框架的时候作用非常大。
大部分是面向对象编程,即:你所写代码都能够找到对应的类或接口,找到具体的方法写出对应的代码。
但是以后学面向抽象编程的时候,即:我们所写的代码完全抽象,比如我们写的框架所要面向的类或方法目前并没有的,而是以后别人用我们的框架写出来的类。但是我们又怎么调用去他们的类get/set方法呢?所以这个时候要用到反射和内省进行抽象编程
public class Person {
private int age;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void run() {
System.out.println("111");
}
}
public class IntrospectorTest {
@Test
public void tes1() throws Exception {
Class<?> cl = Class.forName("com.zbq.javaNewFeature.java5.introspector.Person");
// 在bean上进行内省
BeanInfo beaninfo = Introspector.getBeanInfo(cl, Object.class);
PropertyDescriptor[] pro = beaninfo.getPropertyDescriptors();
Person p = new Person();
System.out.print("Person的属性有:");
for (PropertyDescriptor pr : pro) {
System.out.print(pr.getName() + " ");
}
System.out.println("");
for (PropertyDescriptor pr : pro) {
// 获取beal的set方法
Method writeme = pr.getWriteMethod();
if (pr.getName().equals("name")) {
// 执行方法
writeme.invoke(p, "xiong");
}
if (pr.getName().equals("age")) {
writeme.invoke(p, 23);
}
// 获取beal的get方法
Method method = pr.getReadMethod();
System.out.println(method.invoke(p) + " ");
}
}
@Test
public void test2() throws Exception {
PropertyDescriptor pro = new PropertyDescriptor("name", Person.class);
Person preson=new Person();
Method method=pro.getWriteMethod();
method.invoke(preson, "xiong");
System.out.println(pro.getReadMethod().invoke(preson));
}
}
6:泛型(Generic)
泛型(generic),泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。通俗点说就是一个盒子本来只能放int,改成泛型之后就可以灵活地根据你的要求放你的类型,如int,double,char,string等。
7:For-Each循环
For-Each循环的加入简化了集合的遍历
long[] a = {2L, 3L, 5L};
for (long i : a) {
System.err.println(i);
}
最新文章
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(15)-权限管理系统准备
- squid 2.7 通过域名反向代理多个服务器的配置方法
- SqlServer-无限递归树状图结构设计和查询
- [uva11722&;&;cogs1488]和朋友会面Joining with Friend
- sql之left join、right join、inner join的区别
- 有关Gcd,Lcm的一点小结论
- Week3(9月23日):例子更Powerful更完整了,哇咔咔
- rm: 无法删除 ";xxxxx.o"; : 输入/输出错误.
- Lua快捷键
- ios WKWebView 与 JS 交互实战技巧
- 简单的接口测试类和测试生成报告工具HTMLTestRunner.py
- 快速搭建MQTT服务器(MQTTnet和Apache Apollo)
- 配置NTP网络时间自动校对系统时间和创建备份文件
- 服务器、应用框架、MVC、MTV
- mysql进制之间的转换
- python 使用 sorted 对 列表嵌套元组的数据进行排序
- vue 数据管道
- hihoCoder week14 无间道之并查集
- MongoDB从3.0.6升级到MongoDB3.4.9
- 【推荐】介绍两款Windows资源管理器,Q-Dir 与 FreeCommander XE(比TotalCommander更易用的免费资源管理器)