`
mmdev
  • 浏览: 12915474 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

java加强之jdk1.5新特性

 
阅读更多

jdk1.5新特性:

1、静态导入

package jdk_5new;
/**
* 静态导入是jdk1.5新特性,可以直接导入类中的静态方法
*/
import static java.lang.Math.max;
import static java.lang.Math.abs;

public class StaticImport {

public static void main(String[] args) {
System.out.println(Math.max(3,8));
System.out.println(Math.abs(-21));
}

}

2、可变参数(参数个数不确定)

oveload与override(当父类一个方法定义为private,子类中定义一个与之相同的方法,算不算是重写呢?不算!算是一个全新的方法)

package jdk_5new;

/**
* @author Administrator
*
*/
public class VariableParameter {

public static void main(String[] args) {
System.out.println(add(2,3));
System.out.println(add(2,3,4));
}

public static int add(int x, int...args){
int sum = x;
for(int i=0;i<args.length;i++){
sum = sum+args[i];
}
return sum;
}
}

3、增强的for循环

package jdk_5new;

public class ExtendedFor {
public static void main(String[] args) {
System.out.println(add(2, 3));
System.out.println(add(2, 3, 4));
}

public static int add(int x, int... args) {
int sum = x;
for (int arg:args) {
sum = sum + arg;
}
return sum;
}
}

4、自动装箱与拆箱(-128~127 享元模式 flyWeight)

package jdk_5new;

public class AutoBox {
public static void main(String[] args) {
//自动装箱
Integer num = 3;

//自动拆箱
int sum = num +2;
System.out.println(sum);

Integer num1 = 13;
Integer num2 = 13;
Integer num3 = 128;
Integer num4 = 128;

String s1 = new String("abc");
String s2 = new String("abc");

System.out.println("num1 == num2:"+(num1 == num2));
System.out.println("num3 == num4:"+(num3 == num4));

//s1 == s2 比较的是两个对象的地址
System.out.println("s1 == s2 :"+(s1 == s2));
//这里String的equals方法被重写了,比较的是两个对象的值
System.out.println("s1.equals(s2): "+s1.equals(s2));
}

/**
* 装箱如果数字在-128~127的这些数字,一旦被装箱成Integer对象之后,就会被缓存起来
* 缓冲在一个池里面,到下次如果遇到又要把它封装成对象的时候,先看池子里面有没有,
* 如果有直接从池里面拿出来。因为我觉得小的整数用的频率会非常高,并且经常不会改变。
* 所以就 用一个池存起来,实现重用。
* (享元模式)经常用到的小对象,不会每次都创建!而是放到一个对象池里面。
*/

}

5、枚举

为什么要有枚举?问题:要定义星期几或性别的变量,该怎么定义?枚举就是让某个类型的变量只能为若干个固定值中的一个,否则编译

器就会报错。

package jdk_5new;

public class Enum_1 {
public static void main(String[] args) {

//编译时就发现你输入的值不合法
Week WeekDay = Week.FRI;
//打印一个对象,其实就是打印他的toString

System.out.println(WeekDay);
System.out.println(WeekDay.nextDay());

//通过匿名内部类的方式将众多的if...else分解到不同的方法中。
Week2 week2 = Week2.MON;
System.out.println(week2);
System.out.println(week2.nextDay());
}
}

package jdk_5new;

public class Week {

private Week(){

}

public final static Week SUN = new Week();
public final static Week MON = new Week();
public final static Week TUE = new Week();
public final static Week WEN = new Week();
public final static Week THU = new Week();
public final static Week FRI = new Week();
public final static Week SAT = new Week();

public Week nextDay(){
if(this == SUN){
return MON;
}else if(this == MON){
return TUE;
}else if(this == TUE){
return WEN;
}else if(this == WEN){
return THU;
}else if(this == THU){
return FRI;
}else if(this == FRI){
return SAT;
}else if(this == SAT){
return SUN;
}else
return MON;
}

/**
* 如果没有重写这个toString方法,打印就会有问题。打印Week对象时,会调用这个方法。
* 打印一个对象,就是打印他的toString
*/
public String toString(){
if(this == SUN){
return "今天是星期天!";
}else if(this == MON){
return "今天是星期一!";
}else if(this == TUE){
return "今天是星期二!";
}else if(this == WEN){
return "今天是星期三!";
}else if(this == THU){
return "今天是星期四!";
}else if(this == FRI){
return "今天是星期五!";
}else{
return "今天是星期六!";
}
}
}

6、反射(反射不是jdk1.5的新特性,而是jdk1.2就开始有了)

package jdk_5new;

import java.lang.reflect.*;
import java.util.Arrays;

/**
*
* @author Administrator Class---->代表一种什么样的事物? Person person1 = new Person();
* Person person2 = new Persion();
*
* Class cls1 = new Class()??? 没有这种方法, Class cls2 = ;
*
* Class 实例对象代表内容里的一份字节码
*
* Class cls1 = Date.class //字节码1 Class cls2 = Person.class //字节码2
*
* getClass(); 得到这个类的字节码 Class.forName("java.lang.String");
*
* 得到一个类的字节码有两种方式 : 第一种:这个类的字节码已经加载到内存中,此时直接返回就可以了;
* 第二种:虚拟机中还没有这个类的字节码,于是用类加载器去加载。
* 加载后就把这个类的字节码缓存起来,同时用Class.forName()这个方法 返回刚才加载的字节码
*
* 如何得到各个字节码对应的实例对象?(Class类型) 有三种方法: 1、类名.class,如 System.class
* 2、实例名.class,如 new Date().getClass 3、Class.forName("类名"),如
* Class.forName("java.lang.String");
* 反射的时候最常用的是第三种,因为在写源程序的时候,并不知道要创建实例的类的名称,
* 而是在运行的时候才将类的类型传进来。比如从配置文件里面读取。
*
*/
public class ClassDemo {
public static void main(String[] args) throws Exception {

/**
* Class 类的实例表示正在运行的 Java 应用程序中的类和接口。 枚举是一种类,注释是一种接口。每个数组属于被映射为 Class
* 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java
* 类型8个(boolean、byte、char、short、 int、long、float 和 double)和关键字 void 也表示为
* Class 对象。
*/
System.out.println(void.class);
System.out.println(int.class);

/**
* 用各各方式,得到的是内存中同样一份字节码
*/
String str1 = "abc";
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");

System.out.println(cls1 == cls2);
System.out.println(cls2 == cls3);
System.out.println(cls1 == cls3);

// isPrimitive() 判定指定的 Class 对象是否表示一个基本类型。
System.out.println(cls1.isPrimitive()); // false
System.out.println(int.class.isPrimitive()); // true
System.out.println(int.class == Integer.class); // false
/*
* Object.TYPE 表示所包装的那个基本类型的字节码 static Class<Integer> TYPE 表示基本类型 int 的
* Class 实例。
*/
System.out.println(int.class == Integer.TYPE); // ture
System.out.println(int[].class);
System.out.println(int[].class.isPrimitive());
System.out.println(Array.class);
System.out.println(int[].class.isArray());
// 总之,只要是在程序中出现的类型,都有各自的Class实例对象,例如int[],void

// new String(new StringBuffer("abc"))
Constructor cons1 = String.class.getConstructor(StringBuffer.class);
String str = (String) cons1.newInstance(new StringBuffer("abc"));

// Field 成员变量
ReflectPoint reflectp1 = new ReflectPoint(3, 5);
ReflectPoint reflectp2 = new ReflectPoint(4, 8);
// FieldY不是对象上的变量,而是类上的变量,它去取某个对象上对应的值
Field fieldY = ReflectPoint.class.getField("y");
System.out.println(fieldY.get(reflectp1));
System.out.println(fieldY.get(reflectp2));

// 对私有成员的反射取值
Field fieldX = ReflectPoint.class.getDeclaredField("x");
// 暴力反射
fieldX.setAccessible(true);
System.out.println(fieldX.get(reflectp2));

changeStrValue(reflectp1);
System.out.println(reflectp1);

// 成员方法反射Method
Method methodCharAt = String.class.getMethod("charAt", int.class);

// invoke 列车司机把列车停下来,但并不是司机真正把它停下来。而是列车员踩刹车,
// 给列车发信号,列车自已开启自己的制动系统让自己停下来。所以只有火车自己才更清楚该
// 怎么停下来!String也是,String调用自己的invoke方法截取字符
System.out.println(methodCharAt.invoke(str1, 1));

// 如果第一个参数为null,意味着这个method为静态方法
// System.out.println(methodCharAt.invoke(null,1));

// 1、直接用静态代码的方式调用main
TestArguments.main(new String[] { "111", "222", "333" });
// 2、用反射的方式调用main,为什么要用反射的方式调用?我不知道调用哪个类的main方法,而是以参数传入
String startingClassName = args[0];
Method mainMethod = Class.forName(startingClassName).getMethod("main",
String[].class);
// jdk1.4不把数组而是一个参数,而是当成三个参数
mainMethod.invoke(null, new Object[] { new String[] { "aaa", "bbb",
"ccc" } });
// 哥们,我给你的是一个Object,而不是数组,不要给我拆包啊
mainMethod.invoke(null, (Object) new String[] { "aaa", "bbb", "ccc" });

// 数组的Class类型
int[] a1 = new int[3];
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
String[] a4 = new String[3];
String[] a5 = new String[] { "a", "b", "c" };
int[] a6 = new int[] { 1, 2, 3 };
Integer[] a7 = new Integer[] { 1, 2, 3 };
System.out.println(a1.getClass() == a2.getClass());
System.out.println(a3.getClass().getName());
System.out.println(a1.getClass().getSuperclass().getName());

// 打印数组
System.out.println(Arrays.asList(a5));
/*
* 1.4中没有可变参数,asList中只能是对象(Object)类型,于是自动匹配1.5的asList asList(T...a)
* 这种可变参数的形式,虚拟机就会把int数组当成是一个参数
*/
System.out.println(Arrays.asList(a6));
System.out.println(Arrays.asList(a7));

int []a8 = new int[]{1,2,3,4,5};
printObject(a8);
printObject("abc");

//Object里面可以放不同类型的数据哦!
Object[] a9 = new Object[]{"a",1};
System.out.println(a9[0].getClass().getName());
System.out.println(a9[1].getClass().getName());
}

/**
*
* @param obj
* @throws Exception
* 需求:通过反射将一个对象中的成员变量值换掉
*/
public static void changeStrValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();
for (Field field : fields) {
// 相同的Class类型(字节码)都是一份,比较用"=="
if (field.getType() == String.class) {
String oldStr = (String) field.get(obj);
String newStr = oldStr.replace('b', 'a');
field.set(obj, newStr);
}
}
}

// 数组也是一个对象,是一个特殊的对象
public static void printObject(Object obj) {
Class clazz = obj.getClass();
if (clazz.isArray()) {
int len = Array.getLength(obj);
for (int i = 0; i < len; i++) {
System.out.println(Array.get(obj, i));
}
}else{
System.out.println(obj);
}
}

}

// 自己写程序,调用人家的main方法
class TestArguments {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}

7、泛型 泛型在函数体本身不明确其参数类型,而是在创建对象的时候指定参数具体指定的类型。这样就可以在函数内部不用强制类型转换,并且将

可能在运行阶段出现的问题在编译阶段就暴露出来。

package generic;

import java.io.Serializable;
import java.util.*;

/**
* 泛型类型的确定:
* 1、输入参数什么类型就是什么类型
* 2、多个输入参数不同类型时,取多个参数的公共父类的类型
* 3、有返回值(并且有显示接收返回值)泛型变量值以返回值类型为准。
* @author Administrator
*
* @param <T>
*/
public class GenericTest2{
public static void main(String[] args) {
Demo<String> d = new Demo<String>();
// 泛型的真实类型,取他们共同的父类
//类型变量根据输入参数确定的例子
add(3, 5);
add(3.5, 5);
add(3, "abc");
Object obj = "abc";
//接收返回值的是什么类型我就返回什么类型
//泛型变量根据返回值类型确定的例子
String str = autoConvert(obj);
//此时T为Integer
//Integer n = autoConvert(obj);
//此时T没指定返回原始类型
System.out.println(autoConvert(obj).getClass());
}

public static <M> M add(M x, M y) {
return null;
}

public static <T> T autoConvert(Object obj){
return (T)obj;
}

public static <T> void fillArray(T[]a,T obj){
for(int i=0;i<a.length;i++){
a[i] = obj;
}
}

//Collection<Object> != Collection<Integer>
//泛型是不识别父类子类的,严格相等才是相等的。
//这里的?是指Collection里面可以放什么类型的元素
public static void printCollection(Collection <?> collection){
for(Object obj:collection){
System.out.println(obj);
}
}

//任意类型打印,用?也可以,用类型变量<T>也行,但T更灵活
public static <T>void printCollection2(Collection <T> collection,T t){
for(Object obj:collection){
System.out.println(obj);
}
collection.add(t);
}

public static <T> void copy1(Collection<T> c,T []src){

}

public static <T> void copy2(T[] dest,T[] src ){

}

}

// 泛型的类型只能引用类型作为实际参数,而不能用基本类型
class Demo<T extends Serializable> {

}

8、注释 annotation

package annotation;

import java.util.Arrays;

@ItcastAnnotation(value = "abc", arrayAttr = 2, annotationAttr = @MetaAnnotation("zhougang"))
public class AnnotationTest {

@SuppressWarnings("deprecation")
@ItcastAnnotation(value = "abc", arrayAttr = { 0 })
public static void main(String[] args) {
System.runFinalizersOnExit(true);
if (AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) {
ItcastAnnotation annotation = (ItcastAnnotation) AnnotationTest.class
.getAnnotation(ItcastAnnotation.class);
ItcastAnnotation annotation1 = (ItcastAnnotation) AnnotationTest.class
.getAnnotation(ItcastAnnotation.class);
// 注解
System.out.println(annotation);
System.out.println(annotation.color());
System.out.println(annotation.value());
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp().name());
System.out.println(annotation.annotationAttr().value());
}
}
}

分享到:
评论

相关推荐

    JAVA jdk1.5的新特性

    1.增强的for循环【foreach{}迭代数组或集合】 格式:for(变量的类型 变量名:集合变量名 ){} 注意:集合变量可以是数组或实现了Iterable接口的集合类 2.静态导入(这样调用一个静态方法的时候就不需要【类名....

    jdk1.5 的新特性

    jdk1.5的新特性,java基础加强部分

    JDK1.5中增强for循环

    JDK1.5新特性中的最重要的一点。让你彻底明白增强for循环的强大和方便

    jdk1.5的新特性

    从增强的for循环到诸如泛型(generic)之类更复杂的特性,都将很快出现在您所编写的代码中。我们刚刚完成了一个基于Java 5.0的大型任务,而本文就是要介绍我们使用这些新特性的体验。本文不是一篇入门性的文章,而是对...

    java基础知识加强

    java基础加强,JDK1.5新特性介绍,需要的朋友可以看看哦

    JAVA5新特性介绍.zip

    JDK1.5新特性:自动拆装箱、泛型、增强for循环、静态方法导入、可变参数、枚举

    java基础案例与开发详解案例源码全

    1.2.1 Java语言特性3 1.2.2 JavaApplet4 1.2.3 丰富的类库4 1.2.4 Java的竞争对手5 1.2.5 Java在应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 JavaME微型版11 1.4 ...

    中标麒麟服务器操作系统介绍.pdf

    OpenJDK 1.6、SUN JDK 1.5/1.6、IBM JDK 开发环境 开发环境 Java, C, C++, Python, Perl, Shell, Ruby,PHP, Tcl/Tk, Lisp等,提供全面的Linux开发环境 开发工具 Netbean、jruby、eclipse、kdevelop、glade等集成开 ...

    Java开发技术大全 电子版

    Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    iuhyiuhkjh908u0980

    感兴趣的和我一起搭建,嘻嘻 文档博客地址: http://forum.sinomagazine.com 开发环境: Jcreator-4.5 JDK-1.5 Ant-1.6.1 MYSQL-5 Tomcat-5.5 Spring-2.5.6 Ibatis-2.3.4 问题事项: 1.在windows系统中,命令行中执行ant...

Global site tag (gtag.js) - Google Analytics