用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
goodpp的公告
初学Java,请大家多多指教! <!-- Blog日历表开始 --> <script language="javascript"> var diarydays="<2004-10-18><2004-10-16><2004-10-15><2004-10-14><2004-10-11><2004-09-07><2004-09-06><2004-09-05><2004-09-03><2004-09-02><2004-09-01><2004-08-31><2004-08-30><2004-08-29><2004-08-28><2004-08-27><2004-08-26><2004-08-25><2004-08-24><2004-08-23><2004-08-22><2004-08-21><2004-08-20><2004-08-19><2004-08-18><2004-08-17><2004-08-15><2004-08-13><2004-08-12><2004-08-11><2004-08-10><2004-08-09><2004-08-08><2004-08-06><2004-08-05><2004-08-04><2004-08-03><2004-08-02><2004-08-01><2004-07-31><2004-07-30><2004-07-29><2004-07-27><2004-07-26><2004-07-25><2004-07-22><2004-07-21><2004-07-20><2004-07-19><2004-07-18><2004-07-16><2004-07-15><2004-07-14><2004-07-13><2004-07-12><2004-07-11><2004-07-10><2004-07-09><2004-07-08><2004-07-06><2004-07-05><2004-07-04><2004-07-03><2004-07-02><2004-07-01><2004-06-30><2004-06-27><2004-06-26>"; </script> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style> .calendarBigBorder { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; text-decoration: none; width: 170; background-color: #FFFFFF; font-size: 9pt;border:1px dotted #999; } .calendarTd { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #000000; background-color: #eeeeee; height: 18px; width: 11%; text-align: center;} .calendarMInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; text-decoration: none; background-color: #FFFFFF; height: 15px; border: 1px solid #666666; width: 19px; color: #0099FF;} .calendarYInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #0099FF; text-decoration: none; background-color: #FFFFFF; height: 15px; width: 34px; border: 1px solid #666666;} .calendarMonthTitle { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; height: 24px; text-align: center; color: #333333; text-decoration: none; background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-bottom-style: none; border-top-color: #999999; border-right-color: #999999; border-bottom-color: #999999; border-left-color: #999999;} .calendarNow { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: bold; color: #000000; background-color: #C0C9D3; height: 18px; text-align: center;} .calendarDaySat { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarDaySun { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarLink { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; color: #333333; text-decoration: none; background-color: #E7E7F6; text-align: center; height: 18px;} .categoryTxt { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; line-height: 23px; color: #333333; text-decoration: none;} .categoryTable { border-right-width: 1px; border-bottom-width: 1px; border-right-style: solid; border-bottom-style: solid; border-left-style: none; border-right-color: #000000; border-bottom-color: #000000; border-top-width: 1px; border-top-style: solid; border-top-color: #71b99c;} </style> <SCRIPT LANGUAGE="JavaScript"> var months = new Array("一", "二", "三","四", "五", "六", "七", "八", "九","十", "十一", "十二"); var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31); var days = new Array("日","一", "二", "三","四", "五", "六"); var classTemp; var calendarHover="calendarHover"; var today=new getToday(); var year=today.year; var month=today.month; var newCal; //得到某月天数 function getDays(month, year) { if (1 == month) return ((0 == year % 4) && (0 != (year % 100))) ||(0 == year % 400) ? 29 : 28; else return daysInMonth[month]; } //得到当天时间信息 function getToday() { this.now = new Date(); this.year = this.now.getFullYear(); this.month = this.now.getMonth(); this.day = this.now.getDate(); } //生成日历 function Calendar() { newCal = new Date(year,month,1); //当前月的第一天 today = new getToday(); var day = -1; //用来判断日历中是否为当天 var startDay = newCal.getDay(); //当月开始时间 var endDay=getDays(newCal.getMonth(), newCal.getFullYear());//当月结束时间 var daily = 0; //用来生成日历中的天数值 if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth())) day = today.day; var caltable = document.all.caltable.tBodies.calendar; //得到日历表格的集合 var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear()); //得到当月天数 //生成日历 for (var intWeek = 0; intWeek < caltable.rows.length;intWeek++) for (var intDay = 0;intDay < caltable.rows[intWeek].cells.length;intDay++) { var cell = caltable.rows[intWeek].cells[intDay]; //得到单元袼 //生成字符串用于判断当天是否有日志 var montemp=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); if ((intDay == startDay) && (0 == daily)){ daily = 1;} var daytemp=daily<10?("0"+daily):(daily); var d="<"+newCal.getFullYear()+"-"+montemp+"-"+daytemp+">"; //选择样式 if(day==daily) cell.className="calendarNow"; else if(diarydays.indexOf(d)!=-1) cell.className="calendarLink"; else if(intDay==6) cell.className = "calendarDaySat"; else if (intDay==0) cell.className ="calendarDaySun"; else cell.className="calendarTd"; //生成值 if ((daily > 0) && (daily <= intDaysInMonth)) { cell.innerText = daily; daily++; } else cell.innerText = ""; } document.all.year.value=year; document.all.month.value=month+1; } function subMonth() { if ((month-1)<0) { month=11; year=year-1; } else { month=month-1; } Calendar(); } function addMonth() { if((month+1)>11) { month=0; year=year+1; } else { month=month+1; } Calendar(); } //得到响应事件 function getDiary() { var mon=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); var day=event.srcElement.innerText<10?("0"+event.srcElement.innerText):(event.srcElement.innerText); var d="<"+newCal.getFullYear()+"-"+mon+"-"+day+">"; if ("TD" == event.srcElement.tagName) if (("" != event.srcElement.innerText)&&(diarydays.indexOf(d)!=-1)) { diary.location="/chensheng913/archive/"+newCal.getFullYear()+"/"+mon+"/"+day+".aspx"; window.location.href = diary.location; } } function setDate() { if (document.all.month.value<1||document.all.month.value>12) { alert("月的有效范围在1-12之间!"); return; } year=Math.ceil(document.all.year.value); month=Math.ceil(document.all.month.value-1); Calendar(); } </SCRIPT> <table border="0" cellpadding="0" cellspacing="1" class="calendarBigBorder" id="caltable" width="200"> <thead> <tr align="center" valign="middle"> <td colspan="7" class="calendarMonthTitle"> <input name="year" type="text" class="calendarYInput" size="3" maxlength="4" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">年 <input name="month" type="text" class="calendarMInput" size="1" maxlength="2" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">月 [<a onClick="addMonth()" href="javascript:;">下月</a>] [<a onClick="subMonth()" href="javascript:;">上月</a>]</td> </tr> <tr align="center" valign="middle"> <SCRIPT LANGUAGE="JavaScript"> document.write("<TD class=calendarDaySun id=diary>" + days[0] + "</TD>"); for (var intLoop = 1; intLoop < days.length-1; intLoop++) document.write("<TD class=calendarTd id=diary>" + days[intLoop] + "</TD>"); document.write("<TD class=calendarDaySat id=diary>" + days[intLoop] + "</TD>"); </SCRIPT> </TR> </thead> <TBODY border=1 cellspacing="0" cellpadding="0" ID="calendar" ALIGN=CENTER ONCLICK="getDiary()" onmouseup=document.selection.empty() oncontextmenu="return false" onselectstart="return false" ondragstart="return false" onbeforecopy="return false" oncopy=document.selection.empty() onselect=document.selection.empty()> <SCRIPT LANGUAGE="JavaScript"> for (var intWeeks = 0; intWeeks < 6; intWeeks++) { document.write("<TR style='cursor:hand'>"); for (var intDays = 0; intDays < days.length;intDays++) document.write("<TD class=calendarTd onMouseover='{classTemp=this.className;this.className=calendarHover}' onMouseOut='this.className=classTemp'></TD>"); document.write("</TR>"); } </SCRIPT> </tbody> </table> <script LANGUAGE="JavaScript"> Calendar(); </script> <!-- Blog日历表结束 --> <!-- 天气预报开始 --> <p><b>今日天气</b><br> <center><iframe width=157 height=240 frameborder=0 scrolling=NO src="http://appnews.qq.com/cgi-bin/news_qq_search?city="广州" ></iframe></center> <!-- 天气预报结束 --> 流量统计: <script language="JavaScript" type="text/javascript" src="http://w.50bang.com/click.js?user_id=112015"></script>
文章分类
友情Blog
!java
CSDN专题资料库
MOON
My Life My Heart
Oldjavaman的专栏
为艺术而技术
键者天行
阿赖的个性空间(RSS)
存档

原创  [转]JDK1.5中新的语言特征分类介绍 收藏

  本文中,我们将讨论几个在JDK1.5中新的语言特征,包括:

泛型(Generics)--为集合(collections)提供编译时类型安全,无需每刻从Collections取得一个对象就进行强制转换(cast)
增强的“for”循环(Enhanced For loop)--减少迭代器(iterator)的潜在错误(error-proneness)
自动置入/自动取出(Autoboxing/unboxing)--无需在基本类型(primitive types)(例如double)和包装类型(wrapper types)(例如Double)之间人工地进行转换。
类型安全的枚举(Typesafeenums)--提供类型安全枚举模式的各项好处。
静态导入(Static import)--无需在使用其他类的静态成员变量前缀其类名.这将使得代码更为简洁。
元数据(Metadata)--使编程人员避免编写样板化代码(boiler plate code),并提供机会进行宣告式程式设计(declarative programming)。
让我们详细讨论每个新特性,并看一些例子。

泛型(Generics)
泛型是JDK1.5中一个最“酷”的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。在JDK1.4中,创建雇员名字的清单(List)需要一个集合对象,像下面的语句:

List listOfEmployeeName = new ArrayList();

在JDK1.5中,你将使用下面语句

List<String> listOfEmployeeName = new ArrayList<String>();

最“酷”的是,如果你试图插入非string类型的值,你将在编译时发现并且修正这类问题。没有泛型,你会发现这样一个bug,当你的客户调用后会告诉你,你所编写的程序抛出ClassCastException异常而崩溃。

另外,当你从集合中得到一个元素时你无需进行强制转换。故原先为:

String employeeName = ((String) listOfEmployee.get(i));

而下面的语句将比上面的更加简单:

String employeeName = listOfEmployee.get(i);

不清楚对象的类型而强制转换对象是不合理的,并且更重要的是,它将在运行时失败。假使用户无意间传入一个包含string buffers类型而非string类型的集合,那结果会怎样呢。在Listing A中,客户被要求传入一个编译器无法强制的strings类型集合。Listing B中显示了同样的方法使用泛型是如何实现的。

Listing A

staticbooleancheckName(Collection employeeNameList, String name) {

 for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {

String s = (String) i.next();

if(s.equals(name)){

 return true;

//print employee name here ......

}

}

return false;

}

Listing B

staticbooleancheckName(Collection<String> employeeNameList, String name) {

for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {

 if(i.next().equals(name)){

 return true;

 //print employee name here ......

 }

 }

return false;

}

现在,通过方法签名可以清楚知道输入集合必须只能包含strings。如果客户试图传入一个包含string buffers的集合,程序将不会编译。同时注意,该方法不包含任何强制转换。它只需要短短一行,一旦你习惯泛型后,它也更加清晰。

在JDK当前版本下的For循环语法如下:

void printAll(Collection c) {
    for (Iteratori = c.iterator(); i.hasNext(); ) {
        Employee emp = (Employee)i.next();
        System.out.println(emp.getName());
    }
}
现在,用增强的For语句实现相同方法:

voidprintAll(Collection c) {
    for (Object o : c)
        System.out.println((TimerTask)o).getName());
}

在这类For循环中,你应该将":"看成"in",所以,在该例中可以看成"for Object o in c"。你可以发现这种For循环更具可读性。

自动置入/自动取出(Autoboxing/unboxing)
Java有基本数据类型,在这些基本数据类型周围又有包装类。通常,编程人员需要将一种类型转换成另一种。看看Listing C.中的代码片断。

Listing C

public class Employee {

private static final Integer CHILD = new Integer(0);

public static void main(String args[]) {

//code for adding n to an Integer

int n=10;

Integer age= new Integer(30);

Integer ageAfterTenYear= new Integer(age.intValue +10);

}

}

请注意,用于计算ageAfterTenYear的内循环代码看上去是多么杂乱。现在,在Listing D.中看看相同的程序使用autoboxing重写后的样子。

Listing D

public class Employee {

    public static void main(String args[]) {

     int n=10;

     Integer age= new Integer(30);

     Integer ageAfterTenYear= age +10;

    }

}

有一件事值得注意的:在先前,如果你取出(unbox)Null值,它将变为0。在次代码中,编译器将自动地转换Integer为int然后加上10,接着将其转换回Integer.。

类型安全的枚举(Typesafeenums)
类型安全枚举提供下列特性:

他们提供编译时类型安全。
他们都是对象,因此你不需要将他们放入集合中。
他们作为一种类的实现,因此你可以添加一些方法。
他们为枚举类型提供了合适的命名空间。
他们打印的值具有情报性(informative)— 如果你打印一个整数枚举(intenum),你只是看见一个数字,它可能并不具有情报性。
例一:

enum Season { winter, spring, summer, fall }

例二:

public enum Coin {
    penny(1), nickel(5), dime(10), quarter(25);

    Coin(int value) { this.value = value; }

    private final int value;

    public int value() { return value; }
}

静态导入(Static import)
静态导入使代码更易读。通常,你要使用定义在另一个类中的常量(constants),像这样:

importorg.yyy.pkg.Increment;

class Employee {
    public Double calculateSalary(Double salary{
       return salary + Increment.INCREMENT * salary;
    }
}

当时使用静态导入,我们无需为常量名前缀类名就能使用这些常量,像这样:

import static org.yyy.pkg.Increment;

class Employee {
    public Double calculateSalary(Double salary{
        return salary + INCREMENT * salary;
    }
}

注意,我们可以调用INCREMENT这一常量而不要使用类名Increment.。

元数据(Metadata)
元数据特征志于使开发者们借助厂商提供的工具可以进行更简易的开发。看一看Listing E.中的代码。

Listing E

importorg.yyy.hr;

public interface EmployeeI extends Java.rmi.Remote {

    public String getName()

        throwsJava.rmi.RemoteException;

    public String getLocation ()

        throwsJava.rmi.RemoteException;

}

public class EmployeeImpl implements EmployeeI {

    public String getName(){



    }

    public String getLocation (){



    }

}

通过元数据的支持,你可以改写Listing E中的代码为:

importorg.yyy.hr;

public class Employee {
    @Remote public String getName() {
        ...
    }
    @Remote public public String getLocation() {
        ...
    }
}

正像你所看到的,所有样板化的代码都不见了。

这些新特性和规格说明将在JDK1.5中实现。它将提供Java编程社区更多的选择以编写鲁棒的、可扩展的代码。认真的Java编程人员将感到着手去熟悉这一Java编程语言的新版本是很有益的。

发表于 @ 2005年11月16日 12:56:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:JDK1.5新特性一览--转 | 新一篇:Javascript+CSS实现Flash动态新闻效果(pp原创)

  • 发表评论
  • 评论内容:
  •  
Copyright © goodpp
Powered by CSDN Blog