- 浏览: 174809 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
yinvent:
谢谢,终于找到一个可以用的例子!
struts2学习之一简单范例 -
锅巴49:
学习了,不错.
使用 Spring 2.5 注释驱动的 IoC 功能 -
fooky:
你好,今天在配置spring secutiry3,想让系统先从 ...
spring security 配置文件小结(逐步深化到url级别) -
lj508:
你好啊 请教你个问题
我用那个纯jsp上传时
怎么运行时根本没 ...
Sturt2学习之十二---文件上传 -
641216927:
我还是一个struts2新手。
有个问题请教一下:
同时在t ...
struts2学习之一简单范例
一泛型
编译时类型安全
运行时更小抛出ClassCastException的可能
以下为详细叙述:
1、先看两个类
public class BooleanFoo { private Boolean foo; public void setFoo(Boolean foo) { this.foo = foo; } public Boolean getFoo() { return foo; } }
public class IntegerFoo { private Integer foo; public void setFoo(Integer foo) { this.foo = foo; } public Integer getFoo() { return foo; } }
以上两个类,类别定义时逻辑完全一样,不同的只是变量的类别
2、没有jdk1.5泛型前的处理方法
public class ObjectFoo { private Object foo; public void setFoo(Object foo) { this.foo = foo; } public Object getFoo() { return foo; } public static void main(String[] args) { ObjectFoo foo1 = new ObjectFoo(); ObjectFoo foo2 = new ObjectFoo(); foo1.setFoo(new Boolean(true)); // 类型转换 Boolean b = (Boolean) foo1.getFoo(); // 类型转换 foo2.setFoo(new Integer(10)); Integer i = (Integer) foo2.getFoo(); ObjectFoo foo3 = new ObjectFoo(); foo3.setFoo(new Boolean(true)); String s = (String) foo1.getFoo(); //若没有转换准确,此处编译器不会知道,但是运行时就会报错了public class ObjectFoo
3、利用泛型后的处理
package com.langsin.jdk5; public class GenericFoo<T> { private T foo; public void setFoo(T foo) { this.foo = foo; } public T getFoo() { return foo; } public static void main(String[] args) { GenericFoo<Boolean> foo1 = new GenericFoo<Boolean>(); GenericFoo<Integer> foo2 = new GenericFoo<Integer>(); foo1.setFoo(new Boolean(true)); Boolean b = foo1.getFoo(); foo2.setFoo(new Integer(10)); Integer i = foo2.getFoo(); GenericFoo foo5 = new GenericFoo(); // foo5.setFoo("hello world"); // Integer str = (Integer)foo5.getFoo(); // System.out.println(str); /** * 如果使用泛型类別,但声明时不指定类型呢? 那麼预设会使用Object,不过需要自己进行类型转换了, * 但编译器会发出警告,告诉您这可能是不安全的操作 * */ // GenericFoo a = new GenericFoo(); // a.setFoo("aa"); // foo1与foo2不是同一个类型了,不能进行赋值 // foo1 = foo2; } }
4、泛型举例
public class Generic<T1, T2> { private T1 foo1; private T2 foo2; public void setFoo1(T1 foo1) { this.foo1 = foo1; } public T1 getFoo1() { return foo1; } public void setFoo2(T2 foo2) { this.foo2 = foo2; } public T2 getFoo2() { return foo2; } public static void main(String[] args) { Generic<Integer, Boolean> foo = new Generic<Integer, Boolean>(); foo.setFoo1(new Integer(1)); foo.setFoo2(new Boolean(false)); System.out.println(foo.getFoo1()); System.out.println(foo.getFoo2()); } }
public class Generic2<T> { private T[] fooArray; public void setFooArray(T[] fooArray) { this.fooArray = fooArray; } public T[] getFooArray() { return fooArray; } public static void main(String[] args) { String[] strs = { "hello", "world", "welcome" }; String[] strs2 = null; Generic2<String> foo = new Generic2<String>(); foo.setFooArray(strs); strs2 = foo.getFooArray(); for (int i = 0; i < strs2.length; i++) { System.out.println(strs2[i]); }
5、限制泛型可用类型
在定义泛型类别时,预设可以使用任何的类型来实例化泛型类型中的类型,但是如果想要限制使用泛型类别时,只能用某个特定类型或者是其子类型才能实例化该类型时,可以在定义
类型时,使用extends关键字指定这个类型必须是继承某个类,或者实现某个接口
参见程序 ListGenericFoo.java
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ListGenericFoo<T extends List> { private T[] fooArray; public void setFooArray(T[] fooArray) { this.fooArray = fooArray; } public T[] getFooArray() { return fooArray; } public static void main(String[] args) { ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>(); ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>(); LinkedList[] linkedList = new LinkedList[10]; foo1.setFooArray(linkedList); ArrayList[] arrayList = new ArrayList[10]; foo2.setFooArray(arrayList); // ListGenericFoo<HashMap> foo3 = new ListGenericFoo<HashMap>();//此处就会报错 } }
6、类型通配声明
使用<?>或是<? extends SomeClass>的声明方式,意味著您只能通过该名称來取得所参考实例的信息,或者是移除某些信息,但不能增加它的信息,因为只知道当中放置的是SomeClass的子类,但不确定是什么类的实例。
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class GenericTest<T> { private T foo; public T getFoo() { return foo; } public void setFoo(T foo) { this.foo = foo; } public static void main(String[] args) { GenericTest<? extends List> ge = null; ge = new GenericTest<ArrayList>(); ge = new GenericTest<LinkedList>(); //ge = new GenericTest<HashMap>(); GenericTest<? super List> ge2 = null; ge2 = new GenericTest<Object>(); GenericTest<String> ge3 = new GenericTest<String>(); ge3.setFoo("hello world"); GenericTest<? extends Object> ge4 = ge3; System.out.println(ge4.getFoo()); ge4.setFoo(null); System.out.println(ge4.getFoo()); //ge4.setFoo("welcome"); } }
7、继承泛型类别 实现泛型接口
参见程序 Parent.java
参见程序 Child.java
参见程序 ParentInterface.java
参见程序 ChildClass.java
public interface ParentInterface<T1, T2> { public void setFoo1(T1 foo1); public void setFoo2(T2 foo2); public T1 getFoo1(); public T2 getFoo2(); } public class Parent<T1, T2> { private T1 foo1; private T2 foo2; public void setFoo1(T1 foo1) { this.foo1 = foo1; } public T1 getFoo1() { return foo1; } public void setFoo2(T2 foo2) { this.foo2 = foo2; } public T2 getFoo2() { return foo2; } } public class ChildClass<T1, T2> implements ParentInterface<T1, T2> { private T1 foo1; private T2 foo2; public void setFoo1(T1 foo1) { this.foo1 = foo1; } public T1 getFoo1() { return foo1; } public void setFoo2(T2 foo2) { this.foo2 = foo2; } public T2 getFoo2() { return foo2; } } public class Child<T1, T2, T3> extends Parent<T1, T2> { private T3 foo3; public void setFoo3(T3 foo3) { this.foo3 = foo3; } public T3 getFoo3() { return foo3; } }
二、for-each
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; public class ForTest { public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; /** * 新式写法 */ for (int element : arr) { System.out.println(element); } System.out.println(); /** * 旧式写法 */ for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } String[] names = { "hello", "world", "welcome" }; for (String name : names) { System.out.println(name); } /** * 数组本身就是对象 */ int[][] arr2 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; for (int[] row : arr2) { for (int element : row) { System.out.println(element); } } Collection<String> collection = new ArrayList<String>(); collection.add("one"); collection.add("two"); collection.add("three"); for(String str : collection) { System.out.println(str); } List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); for(int i = 0 ; i < list.size() ; i++) { System.out.println(list.get(i)); } for(Iterator i = list.iterator(); i.hasNext();) { System.out.println(i.next()); } for(String str : list) { System.out.println(str); } } }
三、自动装包/拆包(Autoboxing/unboxing)
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.(Integer >> int)
参见程序 BoxTest.java
参见程序 Frequency.java
参加程序 BoxTest2.java
import java.util.ArrayList; import java.util.Collection; public class BoxTest { public static void main(String[] args) { int a = 3; Collection<Integer> c = new ArrayList<Integer>(); c.add(a); c.add(a + 3); for(Integer i : c) { System.out.println(i); } } }
注意:如果值在-127-128之内,将比较原始类型int的value
所以有了以下奇怪的例子
public class BoxTest2 { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; if (i1 == i2) System.out.println("i1 == i2"); else System.out.println("i1 != i2"); } } //输出i1 == i2 public class BoxTest2 { public static void main(String[] args) { Integer i1 = 200; Integer i2 = 200; if (i1 == i2) System.out.println("i1 == i2"); else System.out.println("i1 != i2"); } } //输出i1! == i2
四、枚举(Enums)
1、JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enum. 我们可以这样来定义一个枚举类型
public enum Color{Red, White, Blue}
然后可以这样来使用Color myColor = Color.Red
2、枚举类型还提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如
for (Color c : Color.values()) System.out.println(c);
3、例子
public enum Color { Red, White, Blue; public static void main(String[] args) { for(Color color : Color.values()) { System.out.println(color); } } }
public class EnumTest { public static void doOp(OpConstant opConstant) { switch (opConstant) { case TURN_LEFT: System.out.println("向左转"); break; case TURN_RIGHT: System.out.println("向右转"); break; case SHOOT: System.out.println("射击"); break; } } public static void main(String[] args) { doOp(OpConstant.SHOOT); } } enum OpConstant { TURN_LEFT, TURN_RIGHT, SHOOT }
//输出扑克牌 import java.util.*; public class Card { public enum Rank { DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE } public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES } private final Rank rank; private final Suit suit; private Card(Rank rank, Suit suit) { this.rank = rank; this.suit = suit; } public Rank rank() { return rank; } public Suit suit() { return suit; } public String toString() { return rank + " of " + suit; } private static final List<Card> protoDeck = new ArrayList<Card>(); // Initialize prototype deck static { for (Suit suit : Suit.values()) for (Rank rank : Rank.values()) protoDeck.add(new Card(rank, suit)); } public static ArrayList<Card> newDeck() { return new ArrayList<Card>(protoDeck); // Return copy of prototype deck } public static void main(String[] args) { for(Card card : protoDeck) { System.out.println(card); } } } //获得枚举代表的值 public enum Coin { penny("hello"), nickel("world"), dime("welcome"), quarter("nihao"); private String value; public String getValue() { return value; } Coin(String value) { this.value = value; } public static void main(String[] args) { Coin coin = Coin.quarter; System.out.println(coin.getValue()); } }
定义枚举类型时本质上就是在定义一個类别,只不过很多细节由编译器帮您完成了,所以某些程度上,enum关键字的作用就像是class或interface。
当您使用“enum”定义 枚举类型时,实质上您定义出來的类型继承自 java.lang.Enum 类型,而每个枚举的成员其实就是您定义的枚举类型的一個实例(Instance),他们都被预
设为 final,所以您无法改变他们,他们也是 static 成員,所以您可以通过类型名称直接使用他们,当然最重要的,它們都是公开的(public)。
枚举的比较
参见程序 ShowEnum.java
枚举的顺序
参见程序 ShowEnum2.java
枚举的方法
参见程序 ShowEnum3.java
public class ShowEnum2 { public static void main(String[] args) { for (OpConstant c : OpConstant.values()) { System.out.printf("%d, %s %n", c.ordinal(), c); } } } public class ShowEnum { public static void main(String[] args) { // valueOf()方法可以让您将指定的字串尝试转换为枚举类型 enumCompareTo(OpConstant.valueOf(args[0])); } public static void enumCompareTo(OpConstant constant) { System.out.println(constant); for (OpConstant c : OpConstant.values()) { System.out.println(constant.compareTo(c)); } } } public class ShowEnum3 { public static void main(String[] args) { for (OpConstants c : OpConstants.values()) { System.out.printf("%s%n\t%s%n", c, c.getDescription()); } } } enum OpConstants { TURN_LEFT, TURN_RIGHT, SHOOT; public String getDescription() { switch (this.ordinal()) { case 0: return "向左转"; case 1: return "向右转"; case 2: return "射击"; default: return null; } } }
以下两个类型的例子见附件:
EnumSet的名称说明了其作用,它是在J2SE 5.0后加入的新类别,可以协助您建立枚举值的集合,它提供了一系列的静态方法,可以让您指定不同的集合建立方式
参见程序 EnumSetDemo.java
参见程序 EnumSetDemo2.java
参见程序 EnumSetDemo3.java
EnumMap是个专为枚举类型设计的类别,方便您使用枚举类型及Map对象
参见程序 EnumMapDemo.java
与单纯的使用HashMap比较起來的差別是,在上面的程序中,EnumMap將根据枚举的順序來维护对象的排列顺序
参见程序 EnumMapDemo2.java
从遍访的结果可以看出,对象的順序是根据枚举順序來排列的。
五、静态导入(Static import)
1、要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给
出他们的类名
参见程序 Common.java
参见程序 StaticImport.java
package com.common; public class Common { public static final String COUNTRY = "China"; public static int add(int a, int b) { return a + b; } }
package com.jdk5; import static com.common.Common.add; import static com.common.Common.COUNTRY; public class StaticImport { public static void main(String[] args) { System.out.println(add(1,2)); System.out.println(COUNTRY); } }
六、可变参数(Varargs)
可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是方法声明中的最后一个参数
参见程序 TestVarargs.java
package com.langsin.jdk5; public class TestVarargs { private static int sum(String a ,int... nums) { System.out.println(a); int sum = 0; for (int num : nums) { sum += num; } return sum; } public static void main(String[] args) { int sum = 0 ; sum = sum("hello",1,2,3,4,5,6); System.out.println(sum); } }
七、Annotation (将在单独博客中总结)
- javaNewCharacter_new.rar (18.3 KB)
- 下载次数: 5
发表评论
-
浅克隆和深克隆及序列化
2009-09-17 13:45 1456一、相关概念: 1、浅复制与深复制概念浅复制(浅克隆):被复 ... -
java访问权限修饰符(表格)
2009-09-17 13:29 1238做个表格以免忘记,程序中不写访问权限时默认为friendly ... -
关于排序方法的选择
2009-09-15 09:13 904package com.softeem.jbs.lesson4 ... -
java中注意点总结(二)
2009-09-14 14:11 9281、两线程程序对初始为零的非负整数,一增一减, 同时每次对变量 ... -
java中注意点总结(一)
2009-09-11 22:15 11011、关于String 语句:String s=new S ... -
java(内存、异常)2-异常机制及throw与throws的区别
2009-09-02 09:49 1574异常机制及throw与throw ... -
java编码处理
2009-04-27 16:59 1221java编码处理:(java在内存中使用的是uniocode编 ... -
java5.0新特性总结--Annotation系统学习整理笔记
2009-03-25 16:04 2732Java Annotation特性与使用 ... -
java(日期处理)
2009-03-20 17:39 2562第一部分关于JAVA的Date (参考关于JAVA的Date总 ... -
log4j
2009-03-20 11:42 867文章一 Log4j由三个重要的组件构成:日志信息的优先级,日 ... -
java(Annotation)转自quguilai
2009-03-20 11:07 1038什么是Annotation?(转自quguilai)2007- ... -
java(IO)第二部分
2009-03-20 09:26 984java(IO)第二部分 一、合并流SequenceI ... -
java(IO操作)第一部分
2009-03-19 21:19 1878java(IO操作)第一部分 --------I/O流 一、 ... -
java(内存、异常)
2009-03-19 15:17 961... -
jdk、jre、jvm及j2se安装
2009-03-05 14:03 3432jdk、jre、jvm及j2se安装 ... -
java语言反射与动态代理学习笔记2(动态代理部分)
2009-03-05 13:44 1385java语言反射与动态代理学习笔记(动态代理部分)。(学习材料 ... -
java语言反射与动态代理学习笔记1(反射部分)
2009-03-05 13:33 1718java语言反射与动态代理学习笔记(反射部分)。(学习 ...
相关推荐
这篇博客是关于Java 5.0新特性——Annotation的系统学习与整理笔记,通过讲解与实例,深入探讨了注解在Junit、Spring和Hibernate中的应用。 首先,注解是一种声明式的编程元素,它可以附加到类、接口、方法、变量等...
自己总结的java中jdk12新特性的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
自己总结的java中jdk14新特性的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
自己总结的java中jdk13新特性的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
根据提供的文件信息,我们可以深入探讨Java 8的新特性。这些特性极大地提高了Java语言的功能性和效率,使得...如果你对上述特性感兴趣,可以通过提供的百度云链接下载尚硅谷关于Java 8新特性的资料,进一步深入学习。
以下是对Java学习的详细总结: 一、简介 Java由James Gosling于1995年在Sun Microsystems公司开发,最初设计用于电视顶盒,但后来因其“一次编写,到处运行”(Write Once, Run Anywhere)的理念,迅速被广泛应用在...
这篇文档是个人的Java学习笔记总结,旨在帮助0基础的学习者从零开始掌握Java基础知识,并逐步成为专业的Java开发者。以下是笔记中涉及的一些关键知识点: 1. **Java开发环境的设置**: 要开始Java编程,首先需要...
随着技术的不断发展,Java也持续推出新版本来提升性能、增加新的特性和功能。本篇将重点解析Java 12和13中的关键新特性,帮助开发者更好地理解和运用这些改进。 **Java 12新特性** 1. **Switch Expressions (JEP ...
自己总结的java中jdk10新特性的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
### Java 8 新特性详解 #### 一、接口的默认方法(Default Methods for Interfaces) Java 8 引入了一个重要的概念——默认方法,默认方法允许在接口中定义具体的方法实现,而不需要强制所有实现该接口的类都重写...
- **Java新特性**:学习Java 8及以上版本的新特性,如Lambda表达式、Stream API等。 **第五阶段:集合框架** - **集合概念**:理解集合的作用,比较集合和数组的区别。 - **集合框架**:熟悉Collection和Map接口,...
### Java 学习基本知识总结 #### Java基础入门 ##### Java语言概述 - **起源与发展**:Java由Sun Microsystems公司于1995年推出,最初由James Gosling设计。它是一种面向对象、跨平台的高级编程语言。 - **特点**...
通过这些资源,学习者不仅可以了解Java 9的新特性,还可以通过实践加深理解。模块系统的引入极大地改善了Java应用程序的结构和管理,而新的HTTP客户端API和jshell工具则提高了开发效率。此外,Stream API的增强也为...
### Java8新特性详解 #### 一、简介与背景 Java8是Java平台的一个重要版本,自2014年发布以来,...尚硅谷提供的Java8新特性教程资源是一个非常好的学习起点,对于想要深入了解Java8新特性的开发者来说非常有价值。
自己总结的java中jdk9新特性的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
Java学习是一条漫长而充满挑战的道路,涉及到众多的领域和技术。在这个过程中,J2SE(Java Standard Edition)是基础,提供了Java语言的核心功能,包括面向对象编程、异常处理、集合框架、多线程等核心概念。J2SE的...
Java NIO是Java 1.4引入的新特性,提供了非阻塞I/O操作,包括Channel、Buffer和Selector,提高了多路复用的性能。 总结来说,Java IO流是一个庞大的体系,覆盖了从基础的文件操作到复杂的网络通信,理解并熟练掌握...
总结,Java三大框架SSH的学习不仅是掌握单个框架的技术,更是理解和应用整体解决方案的过程。对于新手来说,从基础入手,理解每个框架的核心概念,再通过实际项目练习,可以快速提升开发技能,为今后的Java Web开发...