JAVA基础加强(张孝祥)_Eclipse的使用以及JDK1.5的新特性(静态导入、可变参数、For增强、基本数据类型的自动装箱与拆箱、枚举、注解、泛型)...

一、Eclipse的讲解

1、用人单位判断你的能力如何,也是看你的这些基础知识的深度,看你的学习新知识的能力(课程开始,张老师的说教,鄙人认为比较有水平)

Eclipse是什么开发的呢?用Java,我怎么感觉Java做不出,这么漂亮的工具来,呵呵

Eclipse是一种IDE,IDE:整合发展环境(Integrated Development Environment),JMS:Java消息服务(Java Message Service),Java EE:Java平台企业版本(Java Platform,Enterprise Edition),JMX:即Java管理扩展(Java Management Extensions)

2、Eclipse的使用技巧MyEclipse是Eclipse的增强版

配置Eclipse的快捷键:

在不同的情况下有不同的透视图(perspective),view就是小窗口

3、Eclipse的编译和配置

高版本的java能否运行低版本的javac编译的程序?可以、低版本的java能否运行高版本的javac编译的程序?不可以

举例子:Microsoft Office2007能够打开Microsoft Office2003文档(doc格式); 
但是Microsoft Office2003打不开MicrosoftOffice2007文档(docx格式)(除非装个插件!)

4、模板代码(就是像这种syso这样的快捷输出System.out.println())

 那这时候就有了,那有了呢?

二、JDK1.5的新特性

1、JDK1.5的新特性_静态导入

注意点:import static java.lang.Math.*;在下面要调用Math里面的方法的时候,直接写方法名字,max(3, 8)

例子:StaticImport.java

 1 package com.shanhw.javaEnhance.ninthDay;
 2 
 3 import static java.lang.Math.*;
 4 
 5 public class StaticImport {
 6 
 7     /**
 8      * 静态导入
 9      */
10     public static void main(String[] args) {
11         System.out.println(max(3, 8));
12         System.out.println(min(3,6));
13     }
14 }

2、JDK1.5的新特性_可变参数

·问题:一个方法接收的参数个数不固定,例如:

System.out.println(add(2,5));

System.out.println(add(2,5,3));

·可变参数的特点:

1、只能出现在参数列表的最后

2、... 位于变量类型和变量名之间,前后有无空格都可以

3、调用可变参数的方法的时候时,编译器为该可变参数隐含创建一个数组,在方法中以数组的形式访问可变参数

例子:TestVariableParameter.java

 1 package com.shanhw.javaEnhance.ninthDay;
 2 
 3 public class TestVariableParameter {
 4     /**
 5      * 2、可变参数
 6      */
 7     public static void main(String[] args) {
 8         System.out.println(add(2,3));
 9         System.out.println(add(2,3,5));
10     }
11     public static int add(int x,int  ... args){
12         int sum = x;
13         for(int i=0;i<args.length;i++){
14             sum +=args[i];
15         }
16         return sum;
17     }
18 }

3、JDK1.5的新特性_For增强

·注意事项:1、迭代变量必须在()中定义 2、集合变量可以是数组或实现了Iterator接口的集合类

例子:TestForEnhanced.java

 1 package com.shanhw.javaEnhance.ninthDay;
 2 
 3 public class TestForEnhanced {
 4 
 5     /**
 6      * For循环增强
 7      */
 8     public static void main(String[] args) {
 9         System.out.println(add(2,3));
10     }
11     public static int add(int x,int  ... args){
12         int sum = x;
13         for(int a : args){
14             sum += a;
15         }
16         return sum;
17     }
18 
19 }

 4、JDK1.5的新特性_基本数据类型的自动装箱与拆箱

· 自动装箱:Integer num = 1;

· 自动拆箱:System.out.println(num + 1);

· 基本数据类型的对象缓存:

Integer num1 = 12; Integer num2 = 12; System.out.println(num1 == num2);

Integer num3 = 129; Integer num4 = 129; System.out.println(num3 == num4);

Integer num5 = Integer.valueOf(12); Integer num6 = Integer.valueOf(12); System.out.println(num5 == num6);

注意点: Integer i1 = 13; Integer i2 = 13;System.out.println(i1 == i2); // TRUE  Integer i3 = 137; Integer i4 = 137; System.out.println(i3 == i4);// FALSE 那为什么呢?正解:如果装箱在[-128~127]之间的这些数字,一旦我把它包装成为一个Integer对象之后,就把它缓存起来,缓存在一个池里面,如果下一次又要把另外包装成为一个Integer对象,先看缓存池里面有没有,这样就节省了内存空间,这是一种设计设计模式。享元模式(Flyweight),如果很小的对象,有很多属性相同就可以编辑成一个对象,那些不同的属性,变成方法的参数称之为外部状态,那些相同的属性称之为这个对象的内部状态

例子:TestAutoBox.java

 1 package com.shanhw.javaEnhance.ninthDay;
 2 
 3 public class TestAutoBox {
 4     
 5     /**
 6      * 自动拆箱与装箱
 7      */
 8     public static void main(String[] args) {
 9         Integer iObj = 1;// 自动装箱
10         System.out.println(iObj + 3); // 自动拆箱
11          // 如果装箱在-128~127之间的这些数字,一旦我把它包装成为一个Integer对象之后,
12          // 就把它缓存起来,缓存在一个池里面,如果下一次又要把另外包装成为一个Integer
13          // 对象,先看缓存池里面有没有,这样就节省了内存空间
14          // 设置模式:享元模式(Flyweight),如果很小的对象,有很多属性相同,
15          // 就可以编辑成一个对象,那些不同的属性,变成方法的参数称之为外部状态,
16          // 那些相同的属性称之为这个对象的内部状态
17          Integer i1 = 13;
18          Integer i2 = 13;
19          System.out.println(i1 == i2); // TRUE
20          // 以为大的整数是的频率比较低 创建两个对象
21          Integer i3 = 137;
22          Integer i4 = 137;
23          System.out.println(i3 == i4); // FALSE
24          Integer i5 = Integer.valueOf(13);
25          Integer i6 = Integer.valueOf(13);
26          System.out.println(i5 == i6); // TRUE
27          Integer i7 = Integer.valueOf(213);
28          Integer i8 = Integer.valueOf(213);
29          System.out.println(i7 == i8); // FALSE
30     }
31 }

5、JDK1.5的新特性_枚举

·为什么要用枚举?问题:要定义星期几或者性别的变量,该怎么定义?假设用1-7表示星期一到星期日,但是有人可能写成,int weekDay = 0;

 枚举就是让某个类型的变量的取值只能为若干个值中的一个,否则编译器就会报错。枚举可以让编译器在编译的时候就能控制源程序的非法值;

·普通类来模仿枚举类:

  注意点:采用抽象方法定义nextDay,就将大量的if和else语句转换成了一个个独立的类,匿名内部类:匿名内部类 必须用WeekDay的子类去new对象,写上一对打括号表示用这个类的子类来创建实例对象,这个子类没有名字,所以称之为匿名内部类,这个子类的具体代 码:大括号和里面的代码

例子:TestEnum.java

 1 package com.shanhw.javaEnhance.ninthDay;
 2 
 3 public class TestEnum {
 4 
 5     /**
 6      * 普通类模拟枚举类
 7      */
 8     public static void main(String[] args) {
 9         // 每一个枚举都是对象
10         WeekDay mon = WeekDay.MON;
11         System.out.println(mon);
12     }
13 }
14 
15 abstract class WeekDay {
16     private WeekDay(){}
17     
18     // 匿名内部类 必须用WeekDay的子类去new对象,写上一对打括号
19     // 表示用这个类的子类来创建实例对象,这个子类没有名字,所以
20     // 称之为匿名内部类,这个类的具体代码:大括号和里面的代码
21     public static final WeekDay SUN = new WeekDay(){
22 
23         public WeekDay nextDay() {
24             return MON;
25         }
26         
27     };
28     public static final WeekDay MON = new WeekDay(){
29 
30         public WeekDay nextDay() {
31             return SUN;
32         }
33         
34     };
35     // 采用抽象方法定义nextDay,就将大量的if和else语句转换成了一个个独立的类
36     public abstract WeekDay nextDay();
37 
38     /*public WeekDay nextDay(){
39         if(this == SUN){
40             return MON;
41         }else{
42             return SUN;
43         }
44     }*/
45 
46     // 打印枚举对象
47     public String toString(){
48         return this==SUN?"SUNDAY":"MONDAY";
49     }
50 }

·基本的枚举类的应用

注意点:只要用到了、枚举类,里面所有的静态变量都会被初始化

 例子:TestEnum.java

 1 package com.shanhw.javaEnhance.ninthDay;
 2 
 3 public class TestEnum {
 4 
 5     /**
 6      * 普通枚举
 7      */
 8     public static void main(String[] args) {
 9         WeekEnum weekDay = WeekEnum.FRI;
10         System.out.println(weekDay);
11         System.out.println(weekDay.name());
12         System.out.println(weekDay.ordinal());
13         // 把字符串FRI变成WeekEnum里面的一个对象
14         System.out.println(WeekEnum.valueOf("FRI"));
15         // 把WeekEnum转换成数组
16         System.out.println(WeekEnum.values().length);
17     }
18     public enum WeekEnum{
19         SUN,MON,TUE,WED,THI,FRI,SAT;
20     }
21 }

 ·带有构造方法的枚举

 例子:TestEnum.java

 1 package com.shanhw.javaEnhance.ninthDay;
 2 
 3 public class TestEnum {
 4 
 5     /**
 6      * 带构造方法的枚举,而且构造方法里面有参数
 7      */
 8     public static void main(String[] args) {
 9         WeekEnum weekDay = WeekEnum.FRI;
10         System.out.println(weekDay);
11         System.out.println(weekDay.name());
12         System.out.println(weekDay.ordinal());
13         // 把字符串FRI变成WeekEnum里面的一个对象
14         System.out.println(WeekEnum.valueOf("FRI"));
15         // 把WeekEnum转换成数组
16         System.out.println(WeekEnum.values().length);
17         
18     }
19 }
20 enum WeekEnum{
21     SUN(1),MON(),TUE,WED,THI,FRI,SAT;
22     private WeekEnum(){
23         System.out.println("First");
24     };
25     private WeekEnum(int day){
26         System.out.println("Second");
27     };
28 }

·实现带有抽象方法的枚举(最复杂的例子了)

注意:枚举只有一个成员时,就可以作为一种单例的实现方式

 1 package com.shanhw.javaEnhance.ninthDay;
 2 
 3 public class TestEnumTrafficLamp {
 4 
 5     /**
 6      * 实现带有抽象方法的枚举(最复杂的枚举了)
 7      */
 8     public static void main(String[] args) {
 9         TrafficLamp lampR = TrafficLamp.RED;
10         TrafficLamp lampG = TrafficLamp.GREEN;
11         TrafficLamp lampY = TrafficLamp.YELLOW;
12         System.out.println(lampR.nextLamp());
13         System.out.println(lampG.nextLamp());
14         System.out.println(lampY.nextLamp());
15     }
16 }
17 enum TrafficLamp{
18 
19     RED(30){
20         
21         public TrafficLamp nextLamp() {
22             return GREEN;
23         }
24     },
25     GREEN(45){
26 
27         public TrafficLamp nextLamp() {
28             return YELLOW;
29         }
30     },
31     YELLOW(5){
32 
33         public TrafficLamp nextLamp() {
34             return RED;
35         }
36     };
37     private int time;
38     private TrafficLamp(int time ){
39         this.time = time;
40     }
41     public abstract TrafficLamp nextLamp();
42 }

6、JDK1.5的新特性_注解

在http://www.cnblogs.com/shanhouwang/archive/2013/03/20/2972282.html有讲解

7、JDK1.5的新特性_体验泛型

·JDK1.5以前集合类中存在什么问题?ArrayList collection = new ArrayList();collection.add(1);collection.add(1L);collection.add("abc");int i = (Integer)arrayList.get(1);// 编译器要强制转换类型,而且运行时出错

·JDK1.5的集合类希望你在定义集合时,明确表示你要向集合类中装什么类型的数据,无法加入,指定类型之外的数据:ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(1);arrayList.add(1L);//此时会报错 int i = arrayList.get(0);// 不需要类型转换

·泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明集合时会去掉"类型"的信息,使程序效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一致,由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射的到集合,在调用其add方法即可。

入门例子:GenericityTest.java

注意:没有使用泛型时,只是对象,不管是什么类型的对象,都可以存储到同一个集合中,使用泛型集合,可以将一个集合中的数据类型限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全,并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便

 1 package com.shanhw.javaEnhance.twelfthDay;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class GenericityTest {
 6 
 7     /**
 8      * 泛型的入门
 9      */
10     public static void main(String[] args) {
11         ArrayList arrayList1 = new ArrayList();
12         arrayList1.add(1);
13         arrayList1.add(1L);
14         arrayList1.add("abc");
15 
16         int i1 = (Integer) arrayList1.get(1);// Exception in thread "main"
17                                                 // java.lang.ClassCastException:
18                                                 // java.lang.Long cannot be cast
19                                                 // to java.lang.Integer
20         // at
21         // com.shanhw.javaEnhance.twelfthDay.GenericityTest.main(GenericityTest.java:16)
22 
23         ArrayList<String> arrayList2 = new ArrayList<String>();
24         // arrayList2.add(1);
25         // arrayList2.add(1L);
26         arrayList2.add("abc");
27         String i2 = arrayList2.get(0);
28     }
29 
30 }

 利用反射跳过编译器:往有泛型类型的ArrayList中加入不同类型的数据,并打印

 1 package com.shanhw.javaEnhance.twelfthDay;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class GenericityTest {
 6 
 7 
 8     /**
 9      * 泛型的入门
10      */
11     @SuppressWarnings("unchecked")
12     public static void main(String[] args) throws Exception{
13 
14         // 1、反射方式跳过泛型的类型
15         ArrayList<String> arrayList2 = new ArrayList<String>();
16         ArrayList arrayListRef = arrayList2.getClass().newInstance();
17         arrayListRef.add("a");
18         arrayListRef.add(1);
19         System.out.println(arrayListRef.get(0));
20         
21         // 2、反射方式跳过泛型的类型
22         ArrayList<Integer> arrayListRef2 = new ArrayList<Integer>();
23         arrayList2.getClass().getMethod("add", Object.class).invoke(arrayListRef2, "abc");
24         System.out.println(arrayListRef2.get(0));
25     }
26 
27 }

 

转载于:https://www.cnblogs.com/shanhouwang/archive/2013/03/06/HouWang_Shan.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值