<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    程序手記

    程序是我畢生的追求......
    隨筆 - 19, 文章 - 0, 評論 - 9, 引用 - 0
    數據加載中……

    2008年8月2日

    JSP基礎 (文件上傳) 第二十二天

        把一個指定的文件上傳到服務器,通常依靠JSP技術完成,需要使用到兩個JSP頁面。第一個JSP頁面是選擇要上傳的文件,第二個JSP頁面是從客戶端獲取該文件里面的信息,并把這些信息以客戶端相同的格式保存在服務器端,該頁面主要為功能處理頁面。
        第一個頁面的實現必須含有FILE類型的表單,并且表單的enctype的屬性必須為"muldtipart/form-data"。
        第二個頁面要使用內置對象request調用方法getInputStream()獲得一個輸入流,通過這個輸入流讀取客戶上傳的全部信息,如上傳文件的 名字,文件的大小,文件的類型。根據request所獲得的信息創建一個數據輸出流對象,把信息寫到一個指定的文件內

        第一個文件內容如下:
            <body>
                <form method="post" action="file_14.jsp" enctype="multipart/form-data">
                    <input type="file" name="file1" size="50" /><br>
                    <input type="submit" value="上傳" />
                </form>

        第二個文件內容如下:
            <%@ page contentType="text/html; charset='utf-8'" %>
            <%@ page import="java.io.*" %>
            <%@ page import ="java.util.*"%>
            <%@ page import="javax.servlet.*"%>
            <%@ page import = "javax.servlet.http.*" %>
            <body>
            <%
                int MAX_SIZE = 102400 * 102400;    //定義上傳文件的最大字節
                String rootPath;    //創建跟路徑的保存變量
                DataInputStream in = null;    //聲明文件讀入類
                FileOutpubStream fileOut = null;    //
                String remoteAddr = request.getRemoteAddr();    //取得客戶端的網絡地址
                String servName = request.getServerName();    //獲得服務器的名字
                out.print("serverName=" + serverName + "<br>");
                out.print("request.getServletPath() = " + request.getServletPath() + "<br>")

    posted @ 2008-08-22 00:29 程序手記 閱讀(241) | 評論 (0)編輯 收藏

    JavaBean基礎 (javabean簡介) 第二十一天

        JavaBean是一個可重復使用、且跨平臺的軟件組件(SoftWare Component),它可以在軟件開發工具如:Borland JBuilder \ Oracle JDeveloper 或是 Sun ONE Studio 等等里,以可視化的開發方式來開發。
        首先,你可以將JAVABEAN視為一個黑盒子(Black Box),雖然知道這個軟件組件所具備的功能,卻不知其內部是如何運作的。筆者提供給讀者一個假象的情況:有一個黑盒子,只知道它上面有一個按鈕,你只要按下去經過十分鐘,就會掉下一張一千元的鈔票,不過你看不見其內部任何的構造,而這就是JAVABEAN最重要的特性,它將許多的信息都封裝了起來,用戶無需知道黑盒子如何產生出鈔票,只需知道按下那個按鈕,然后等十分鐘,超片就會自動產生出來。
        一般而言,JAVABEAN可分為:有用戶接口(user interface)的javabean和沒有用戶接口的javabean,通常JSP是搭配沒有UI的JAVABEAN,因此后面所提到的JAVABEAN都知識單純處理一些食物,如:數據運算,連接數據庫和數據處理,等等,至于有用戶接口的JAVABEAN部分,請讀者自己參考JAVABEAN的相關書籍。
        通常一個標準的JAVABEAN有如下幾項特性:
        (1)javabean是一個公開的(public)類;
        (2)javabean類必須有一個無傳入參數(zero-argument)的構造函數(constructor);
        (3)取得或設置屬性時,必須使用getXXX方法或setXXX方法。

    例子:
        package tw.com.javaworld.CH8;
        
        import java.io.*;
        
        public class SimpleBean{
            public SimpleBean(){
            }
            private String name;
            private String number;
            
            public void setNumber(String number){
                this.number = number;
            }
            public String getName(){
                return name;
            }
        }

    posted @ 2008-08-21 23:09 程序手記 閱讀(505) | 評論 (0)編輯 收藏

    JSP基礎 (JSP動作元素) 第二十一天

        與JSP指令元素不同的是,JSP動作元素在請求處理階段起作用。JSP動作元素是試用XML語法寫成的,它可以采用以下兩種格式:
        <prefix:tag attribute = value attribute-list.../>
    或者
        <prefix:tag attribute = value attribute-list.../>
        ...
        </prefix.tag>
    SERVLET容器在處理JSP時,每當遇到這種動作元素,都根據它的標記進行特殊處理。
    JSP規范定義了一系列的標準動作,它用JSP作為前綴。這些標準的動作不去慣容器是如何實現的,但是每個WEB容器都必須提供這些操作類型。標準動作為網頁設計者提供了基本的功能,其他的廠商可以自由提供其他的非標準動作以增強功能。
        標準動作有:
    <jsp:useBean>
    <jsp:setProperty>
    <jsp:getProperty>
    <jsp:param>
    <jsp:include>
    <jsp:forward>
    <jsp:plugin>
    <jsp:fallback>
    <jsp:attribute>
    <jsp:body>
    <jsp:invoke>
    <jsp:doBody>
    <jsp:element>
    <jsp:output>
    <jsp:scriptelet>
    <jsp:declaration>等
    在標準動作中,有許多是XML語法的動作元素,比如<jsp:scriptelet> <jsp:declaration>但他們的使用并不廣泛,下面介紹JSP中主要的動作元素。

    文件導入標記<jsp:include>
    include用于允許在請求時間內在縣城的JSP頁面里包含靜態或者動態資源。被包含的對象只有對JSPWRITER對象的訪問權,并且它不能設置頭或者COOKIE,如果頁面輸出是緩沖的,那么緩沖區的刷新要有限于包含的刷新。此指令在運行的效率上比<%@ page include %>指令的效率低,但是可以動態增加內容。用戶可以通過一下的格式來使用文件導入標記
        <jsp:include page="{relativeURL | <%=expression%>}" flush="true" />
        <jsp:include page="{relativeURL | <%=expression%>}" flush = "true" >
            <jsp:param name="parameterName" value="{parameterValue | <%=expression%>}"
        </jsp:include>

        例如:
        <jsp:include page="admin/login.jsp" />
        <jsp:include page="copyright.html" />
        <jsp:include page="admin/login.jsp">
            <jsp:parame name = "username" value="JackLong" />
        </jsp:include>

    頁面轉向標記<jsp:forward />
    實例:
        <jsp:forword page="showinfo.jsp" >
            <jsp:param name = "username" value = "<%=request.getParameter("username")%>"/>
            <jsp:param name = "telephone" value = "<%=request.getParameter("telephone")%>"/>
        </jsp:forword>

    posted @ 2008-08-21 05:20 程序手記 閱讀(481) | 評論 (0)編輯 收藏

    JSP基礎 (獲取當前時間) 第二十一天

        下面的代碼用于顯示當前時間,并根據當前是幾點輸出相應的提示信息,其中,使用java.util.Date thisday=new java.util.Date();語句來取得當前時間,然后通過相應的方法取得年,月,日,時和分的信息并輸出:

    <% page contentType="text/html; charset=utf-8" import="java.util.*" %>
    <body>
    <%
    //獲取當前的時間
    java.util.Date thisday = new java.util.Date();
    %>
    當前時間:
    <%=thisday.getYear()+1900%>年
    <%=thisday.getMonth()+1%>月
    <%=thisday.getDate()%>日
    <%=thisday.getHours()%>時
    <%=thisday.getMinutes()%>分
    <%
    String str = "歡迎訪問:"
    int num = this.getHours();
    switch(num){
        case 8:
        case 9:
        case 10:
        case 11:
        {
            out.print("歡迎你的訪問,上午好!");
            break;
        }
        case 12:
        {
            out.print("中午好!");
            break;
        }
        case 13:
        case 14:
        case 15:
        case 16:
        case 17:
        case 18:
        {
            out.print("下午好!");
            break;
        }
    </body>

    posted @ 2008-08-21 04:23 程序手記 閱讀(1258) | 評論 (0)編輯 收藏

    JSP基礎 (高級計數器實例) 第二十天

                                                                               countFile.java
    public class countFile{
        public static void writeFile(String filename,long count){
            PrintWriter out = new PrintWriter(new FileWriter(filename));
            out.println(count);
            out.close();
        }
        public static void readFile(String filename){
            File f = new File(filename);
            if(!f.exists()){
                writeFile(filename,0);
            }
            BufferedReader in = new BufferedReader(new FileReader(f));
            long count = Long.parseLong(in.readline());
            return count;
        }
        public static String tranform(long count){
            String countNumber = ""+count;
            String newstring = "";
            for(int i=0;i<countNumber.length;i++){
                newstring+="<img src='images/"+countNumber.charAT(i)+".gif' >";
            }
            return newstring;
        }
    }

    posted @ 2008-08-20 05:19 程序手記 閱讀(177) | 評論 (0)編輯 收藏

    TOMCAT基礎 (設定站點) 第十三天

        在Tomcat 上建立一個 JSPBook站點時,我們需要修改Tomcat的server.xml文件,server.xml位于{Tomcat_Install}\conf\server.xml(例如:e:\apache software foundation\tomcat 5.0\conf\server.xml)。

        server.xml
        
        ......
        <!--Tomcat Root Context-->

        <!--
            <Context path="" docBase="ROOT" debug="0">
        -->
        <Context path="/JSPBook" docBase="JSPBook" debug="0" crosscontext = "true" reloadable="true" >
        </Context>
        </Host>
        </Engine>
        </Service>
        </server>

        這部分主要是設定JSPBOOK站點,其中 path="/jspbook"代表網站名稱,即 http://ip_domainName/jspbook;
    docBase = "jspbook" 代表站點的目錄位置,debug則是設定debug lerel,0表示提供最少的信息,9表示提供最多的信息; reloadable則表示tomcat在執行時,當class ,web.xml被更新過時,都會自動重新加載,不需要重新啟動tomcat。

    posted @ 2008-08-13 17:36 程序手記 閱讀(160) | 評論 (0)編輯 收藏

    JAVA基礎 (JAVA中的STATIC塊) 第十三天(對浪費的前10天表示悔恨)

    Java 程序中時常用些 static{}這樣的結構。
    這樣的結構叫 static塊,一般是一個類初始化時運行的代碼。注意,是類的初始化,不是對象的初始化。
    也就是你在定義對象時,他運行的初始化代碼,并且只有第一次定義時才運行。之后就不再運行初始化了。
    一個類中可以有很多static塊。static塊按順序執行。

    看以下代碼:
    public class TestStatic{
        static{
            System.out.println(1);
        }
        static {
            System.out.println(2);
        }
        static {
            Stystem.out.println(3);
        }
        public static void main(String args[]){
            System.out.println(5);
        }
        static {
            System.out.println(4);
        }
    }
    執行結果是:
    1
    2
    3
    4
    5
    一目了然,首先調用的是static靜態塊的代碼,然后調用啟動方法,而STATIC塊的執行順序是由代碼的編寫順序執行的過程,STATIC塊大家用的比較少,其實就是在對象生成之際產生的一系列的STATIC變量。

    posted @ 2008-08-13 16:22 程序手記 閱讀(342) | 評論 (0)編輯 收藏

    JAVA WEB開發 (First Servlet Samlet Code) 第四天

    HelloServlet.java

    package tw.com.javaworld.CH2;

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;

    public class HelloServlet extends HttpServlet{
        //Initialize global variables
        public void init(ServletConfig config) throws ServletException{
            super.init(config);
        }
        
        //Process the HTTP Get request
        public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=GB2312");
            PrintWrite out = response.getWrite();
            out.println("<html>");
            out.println("<body>");
            out.println("Hello World<br>");
            out.println("大家好");
            out.println("</body>");
            out.println("</html>");
            out.close();
        }

        //Get Servlet information
        public String getServletInfo(){
            return "tw.com.javaworld.CH2.HelloServlet Information";
        }
    }

    posted @ 2008-08-04 18:15 程序手記 閱讀(237) | 評論 (0)編輯 收藏

    Java WEB開發 (TomCat配置) 第四天

    Tomacat是一個WEB容器,所有的J2EE WEB程序可以在此處運行。常見的WEB容器還有WebLogic、WebSphere。

    Tomcat的默認端口號是8080,這個數值可以在安裝過程中修改也可以在conf/server.xml中修改。

    Tomcat是根據系統的%JAVA_HOME%變量值選擇系統中的JDK。

    Tomcat目錄主要文件夾作用

    • bin目錄:存放啟動和關閉Tomcat的腳本
    • conf目錄:存放不同配置文件,其中比較重要的是server.xml(Tomcat的主要配置文件)和web.xml
    • work目錄:存放JSP編譯后的.class文件
    • webapps目錄:存放WEB應用程序
    • lib目錄:存放所有需要的各種jar包

    配置Tomcat方式有兩種:手工配置--修改conf/server.xml文件、管理控制臺配置

    • 注意:修改server.xml之后要重新啟動Tomcat服務器才能使配置生效

    配置虛擬目錄的要求

     

     

    • 修改server.xml文件
    • 虛擬目錄的結構要符合要求
      • WebRoot
        • WEB-INF
          • web.xml
      • 其中web.xml的內容一般為:

         


        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
        version="2.4">

        Welcome to Tomcat

        Welcome to Tomcat

    • 創建好虛擬目錄之后要在server.xml中之前添加一句 (大小寫敏感,修改完之后應該重新啟動Tomcat服務器使配置生效)

    若設置虛擬目錄后訪問目錄提示404錯誤而可以運行目錄下的jsp文件則說明是目錄權限被禁用,可以修改conf/web.xml文件找到 將下面一行中的false改成true

    jsp文件的運行過程: *.jsp  -->  *.java  -->  *.class  -->  運行顯示 

    • *.class是第一次運行生成后存放在work目錄下的,所以jsp文件第一次或者修改后首次運行比較慢而后來再運行的速度很快

    posted @ 2008-08-04 16:39 程序手記 閱讀(316) | 評論 (0)編輯 收藏

    JAVA基礎 (嵌套類) 第四天

        Java允許將類的定義方在其他類的內部,形成嵌套類。嵌套類使邏輯關系緊密的類組成一個整體,嵌套類可以用于訪問其所在的類的作用域。

    嵌套類可以訪問外部類似有成員。
        // OuterNested1.java
    public class OuterNested1{
        private int size;
        public class Nested{
            public int doStuff(){
                //嵌套類可以訪問OuterNested1類的似有成員 size 變量
                return(size++);
            }
        }
        public int testTheNested(){
            Nested i = new Nested();
            return(i.doStuff());
        }
    }

    //TestOuterNested1.java
    public class TestOuterNested1 {
        public static void main(String[] args){
            outerNested1 outer = new OuterNested1();
            System.out.println(outer.testTheNested());
        }
    }

    posted @ 2008-08-04 15:21 程序手記 閱讀(174) | 評論 (0)編輯 收藏

    JAVA基礎 (包 與 Java API) 第二天 第四天

        建立Java包,布局源文件和設置classpath參數之間相互影響。也相互關聯。正確建立和導入JAVA包,合理布局源文件,準確設置CLASSPATH參數,才能保證應用程序順利執行,并有效管理應用程序。

    包的建立方法
        Java包通過package語句建立,基本語法是:
            package cn.edu.jmu.graphis;
        在定義類或接口的源文件開始處,通過package語句,可以將相應的類或接口放入package所聲明的包里。包是相關類和接口的集合,提供了訪問級別控制和命名控件管理。

    包的使用方法
        每個源文件只能有一個包聲明,并且一定要求放在源文件的開始位置。如果一個源文件沒有包語句,則源文件所定義的類或接口唄系統放入默認包中。包有層次,層次間由點分隔。
        例如有一組與圖形相關的類,包括Circles,Rectangles,Lines和points類等,描述了畫圖所用到的各種圖形組件,另有抽象類Graphic標識圖形組件的共性,接口Draggable表示用戶可以通過鼠標拖拽成圖的圖形組件。在這種情況下,我們不僅需要,而且也應該將這些相關類和接口組成包,可命名為graphics如:

    //Graphics.java
    package graphics;
    public abstract class Graphic{
        ...
    }

    //Circle.java
    package graphics;
    public class Circle extends Graphic implements Draggable {
        ...
    }

    //Rectangle.java
    package graphics;
    public class Rectangle extends Graphic implements Draggable {
        ...
    }

    //Draggable.java
    package graphics;
    public interface Draggable{
        ...
    }
        通過創建和使用包,程序員不僅可以很容易地確定哪些類和接口是相關的,也可以很容易地找到提供特定功能的類和接口,例如,與畫圖有關的類和接口在graphics包中。

    包的訪問權限
        通過聲明類的訪問級別,可以控制對類的訪問權限。
        類的訪問級別分為默認級和public級。定義類的默認訪問級別不需要任何關鍵字,唄聲明為默認級的類只對同一個包中的類是可視的。也就是說只有同一個包內的類實例可以訪問這個類,外界不能訪問它。如果用關鍵字public定義類,不但同一個包里的其他類可以訪問這個類,其他包中的類也可以訪問它。換句話說,同一個包中的類,相互之間有不受限制的訪問權限。而在不同包中,只有public類可以被訪問。
        public修飾符不知用于定義類的訪問控制級別,也可以應用于接口,方法或變量。public 接口同public類一樣,可以由應用程序中的任何類訪問。而public方法或public屬性對任何可以訪問他的類或接口都是可視的。
        除public修飾符之外,用于訪問控制的修飾符還有protected 和 private。
    protected 或 private 僅用來定義方法或變量的訪問控制級別。protected 方法或protected變量僅對同一個包內的類或不同包中的子類來說是可視的。
    private方法和pvivate變量對外部定義的類均不可視。

    包的命名方式
        包提供了心的命名控件,即使所定義的類使用與其他包中的類相同的名字,只要包類所屬的包不同名,就不會引起沖突。原因是這些類的全程限定名稱不同。類的全程限定包含了類的各層包名。這實質上是應用了面向對象的概念,將類封裝入包中。

    包的訪問權限
        通過聲明類的訪問級別,可以控制對類的訪問權限。
        類的訪問級別分為默認級和public級。定義類的默認訪問級別不需要任何關鍵字,貝聲明為默認級的類只對同一個包中的類是可視的。也就是說,只有同一個包內的類實例可以訪問這個類,外界不能訪問它。如果用關鍵字public 定義類,不但同一個包里的其他類可以訪問這個類,其他包中的類也可以訪問它。換句話說,同一個包中的類,相互之間有不受限制的訪問權限。而在不同的包中,只有public類可以被訪問。
        public 修飾符不只用于定義類的訪問控制級別,也可以應用于接口,方法和變量。public接口同public類一樣,可以由應用程序中的任何類訪問。而public方法或public變量對任何可以訪問他的類或接口都是可視的。
        除public 修飾符之外,用于訪問控制的修飾符還有 protected 和private 。 protected或private僅用來定義方法或變量的訪問控制級別。protected方法或protected變量僅對同一個包內的類或不同包中的子類來說是可視的。private方法和private變量對外部定義的類均不可視。需要說明的是,通常不建議用默認方式定義方法或成員變量的訪問級別。

                          
        對于沒有指定包名的java源文件,系統認為他們都屬于同一個默認的包。如果沒有把自己的Java類放入某個包中,那么任何默認包里的對象都可以訪問它,并且不局限于同一個子目錄下,因此通常應該在每個Java源文件的項目頂部使用 package語句,指明它所屬的包。

    訪問包成員
        對于包來說,只有它的public成員可貝外界訪問。若外界想要訪問包的public類,有3種方式可以實現。
        (1)通過類的全程限定名訪問該類。
        (2)通過import語句導入該類。
        (3)通過import語句導入整個包。
        如果某個類只貝訪問一次,那么可以直接使用類的全名。例如訪問cn.edu.jmu.graphics.Graphic類可以用一下方式:
        cn.edu.jmu.graphics.Graphic aGraph = new cn.edu.jmu.graphics.Graphic();
        這條語句創建了 cn.edu.jmu.graphics.Graphic類型的對象 aGraph。
        可以看到,即是指創建一個對象,在變量定義和初始化時也用到兩次全名。當使用Java約定的包命名方式時,包名可能過長,此時用起來就更顯得繁瑣,容易出錯,也影響可讀性。
        通常都應該使用import語句直接導入所需類,或者導入該類所在的包。導入之后,程序中設計的這個類的地方就可以直接用類名訪問。
        import 的基本語法形式為:
        import <包名>[.<子包名>].<類名>;    //導入指定類
    或者:
        import <包名>[.<子包名>].*;    //導入整個包
    例如:
        import cn.edu.jmu.javaprogs.Timel;
        import cn.edu.jmu.javaprogs.*;
        import java.awt.*;
        import java.awt.event.*;

        import語句在package 語句之后,所有的類聲明之前。由于集中在程序首部,宜于直觀地了解程序所需的包,有助于維護程序的可移植性。
        import 語句中的 * 用來匹配包中的所有類,但并不能用來匹配包中的所有類的某個子集。如語句
        import java.awt.*;
        導入java.awt包中的所有類。如果這樣的語句
        import java.awt.A*;
        它無法導入java.awt句中首字母為A的所有子類,相反還會出現編譯錯誤,也就是說,使用import語句一次只能導入包的單一成員,或者導入整個包。
        還有語句
        import java.awt.*;
        所導入的是java.awt包中的所有類,它包括接口。但不包括java.awt包中的子包。如果需要訪問java.awt.event子包中的類,仍需要用 import語句導入 java.awt.event子包。所以常常使用如下形式:
        import java.awt.*;
        import java.awt.event.*;

      

    包的布局
        類的全程受名稱與類所在目錄一一對應,例如:
        import graphics.Rectangle    等同于文件路徑名:
        Graphics\Rectangle.java


    classpath參數
        classpath參數用于設置Java包所在的頂級目錄。也就是說,通過classpath可以為Java包建立所依存的目錄列表。編譯和運行Java 程序時,系統會自動從classpath環境變量中讀取包所在的目錄,文件所在目錄由系統通過classpath中的目錄和package語句中定義的目錄合成。
        下面通過一個完整的實例程序,說明classpath參數的作用,同時展示源文件和字節碼文件的一種建議布局模式。
        程序包含兩個類 Time 和 TestTime,TestTime為主類。程序對用戶輸入的表示小時、分鐘和秒鐘的3個整型數,經過數據正確性驗證,分別轉換為通用時間表示格式和標準時間表示格式,通過對話框顯示給用戶,運行后如圖:
                                                                          

        文件布局方式如下:創建 d:\javaSample 目錄存放java程序,創建 d:\javaSample\src 子目錄存放源文件,創建d:\javaSample\class 子目錄存放編譯后的字節碼文件。 具體實現方式是將文件 TestTime.java 存放在 D:\javaSample\src 子目錄下,為使 src 子目錄的結構與 class 子目錄結構相對應,創建 D:\javaSample\src\cn\edu\jmu\timer 子目錄存放 Time.java文件。類Time和類TestTime的布局如圖:
                                  
        Time.java中的語句
        package cn.edu.jmu.timer;
        將Time類放入包cn.edu.jmu.timer中,源文件Time.java存放在與包相對應的目錄結構下。在類TestTime.java中通過語句   import cn.edu.jmu.timer.Time;   導入Time類。
        需要設置classpath參數,規定程序中的包    cn.edu.jmu.timer 編譯所依存的頂級目錄為 d:\javaSample\class,如:
                    set classpath = d:\javaSample\class;
        編譯:
            javac -d d:\javaSample\class
            d:\javaSample\src\cn\edu\jmu\timer\Time.java 
            javac -d d:\javaSample\class d:\javaSample\src\TestTime.java
        運行:
            java TestTime

    posted @ 2008-08-03 00:40 程序手記 閱讀(356) | 評論 (0)編輯 收藏

    JAVA面向對象編程 (接口) 第二天

        接口是JAVA語言中非常重要的概念,回調是軟件設計中常用的模式。JAVA的接口不僅可以用來實現多繼承關系,也用來實現回調機制。 java.lang.Comparable 接口和 java.util.Comparator 接口是進行數據對象比較和排序中需要實現的接口,他們在功能和使用方法上都有所不同。

        當類只從一個類繼承時稱為單繼承,JAVA語言只允許單繼承。如果需要多繼承關系,可以通過JAVA語言中的接口實現。
        抽象方法只有方法定義,沒有方法體,如果一個類包含任何抽象方法,包括直接的和繼承所得,則這個類必須是抽象的。如果一個類是抽象的,則不能創建此類的對象。抽象類強制要求他的所有子類重寫自己的方法以覆蓋抽象方法。
        如果存在超類 Animal,顯然cat同時具有 Animal和pet的特性,就是說,cat不只是一個animal還是一個pet,除需要繼承animal類,還期望能實現pet類。因為JAVA只允許單繼承,CAT不能繼承animal又繼承pat,解決這個問題的方法是定義接口,并通過接口實現多繼承。

    定義接口
        我們把只有抽象方法和常量的抽象類稱為接口,接口形式化定義了一組相互有關系的未實現的方法。接口的定義包括接口聲明和接口體。
    接口聲明的語法為:[public] interface 接口名 [extends 父接口名] {。。。。。。}
        EXTENDS子句與類聲明的extends子句基本相同,不同的是:一個接口可以有多個父接口,用逗號隔開,而一個類只能有一個父類。
        接口體包括常量和抽象方法。
       
    接口Pet示例:

        interface Pet{
            public abstract void speak();
        }
        public class Dog implements Pet{
            public void speak(){
                System.out.println("Woof");
            }
        }
        public class Cat implements Pet{
            public void speak(){
                System.out.println("Meow");
            }
        }
        public class Bird implements Pet{
            public void speak(){
                System.out.println("Tweedle");
            }
        }
        public class TestAnimals{
            public static void main(String args[]){
                Pet myPets = new Pet[4];
                myPets[0] = new Bird();
                myPets[1] = new Cat();
                myPets[2] = new Bird();
                myPets[3] = new Dog();
                
                for(int index = 0; index<4; index++){
                    myPets[index].speak();
                }
            }
        }


        類Bird ,Cat 和 Dog 與 Pet 不再具有父子關系,而分別是實現了接口Pet的類。
        一個接口的定義由關鍵字 interface 開始,包括一套 public ,abstract 方法,接口也可以包含 public ,final,static數據。一個期望使用接口的類必須將自己聲明為 implements 接口,并重寫接口定義的每個方法,保證參數列表及返回類型與接口中所定義的相一致。簡單說,強制要求實現接口的類覆蓋接口的方法。
        如果一個類沒有覆蓋接口定義中的全部方法,那么這個類就稱為抽象類,必須貝聲明為 abstract。

    用Cat類繼承Animal 類 和 定義Pet接口的示例:
    public class Cat extends Animal implements Pet{
        public void speak(){//實現
    }
    }

    posted @ 2008-08-02 18:01 程序手記 閱讀(248) | 評論 (0)編輯 收藏

    JAVA (繼承,封裝,多態,接口) 第二天

        面向對象的分析與設計(OOA&D)方法是一種非常成熟的技術。也是當前商業公司經常使用的一種技術,因為JAVA語言本身就是一種面向對象的語言,所以掌握面向對象這種技術對于JAVA語言的應用具有重要意義。

    繼承(inheritance)
        繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。這種技術使得復用以前的代碼非常容易,能夠大大縮短開發周期,降低開發費用。比如可以先定義一個類叫車,車有以下屬性:車體大小,顏色,方向盤,論壇,而又由車這個類派生出教程和卡車兩個類,為轎車添加一個小后備箱,而為卡車添加一個大貨箱。

    封裝(encapsulation)
        類使得數據和對數據的操作集成在一起,從而對使用該類的其他人來說,可以不管它的實現方法,而只管用它的功能,從而實現所謂的信息隱藏。

    多態(polymorphism)
        多態又分為設計時多態和運行時多態,例如重載又被稱為設計時多態,而對于覆蓋或繼承的方法,JAVA運行時系統根據調用該方法的實例的類型來決定選擇調用哪個方法則被稱為運行時多態。總而言之,面向對象的設計的典型特點就是繼承,封裝和多態,這些特點也是面向對象之所以能如此盛行的關鍵所在。

    單繼承與多繼承
        JAVA不支持多重繼承,單繼承使JAVA的繼承關系很簡單,一個類只能有一個父類,易于管理程序,同時一個類可以實現多個接口,從而克服單繼承的缺點。

        接口的定義和類的定義很相似,只是關鍵字不同,關鍵字為interface。生命格式如下:
    interface 接口名
    {
    }
        上面的大括號中為接口體。接口體中包含成員變量定義和方法定義兩部分。
        接口體中只進行方法的聲明,不允許提供方法的實現。所以在格式上只存在方法聲明,實際上沒有方法體,而方法體要在實現的類中再去具體定義。
        還有一點需要說明的是:如果一個類使用了某個接口,就必須要實現這個接口的所有方法,即使實在沒有內容只是一個空的方法體也不許要寫。而且每個方法都默認是public的,所以實現時代碼一定要用public做修飾,參數個數,類型以及返回值的類型都必須與接口中的聲明相一致。
    例如:
        interface Runable
        {
        }
        當某個類要實現這個接口時,就用 imlements 來聲明。
        例如,我們相做一個多線程的例子,那么就可有兩種實現方式,一種是通過定義一個Thread類的子類來實現,另一種是通過實現Runable接口來實現。代碼如下(這里的PrintHello類就是通過實現Runable接口來實現的,而不是擴展Thread稱為他的子類):

    import java.lang.*;

    class TestThread
    {
        public static void main(String args[])
        {
            try{
                printHello ph = new PrintHello();
                Thread Tph = new Thread(ph);
                for(;;){
                    System.out.println("I'm main");
                    Thread.sleep(100);
                }
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    }

    class PrintHello implements Runnable
    {
        public void run(){
            try{
                for(;;){
                    System.out.println("I'm hello");
                }
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    }

    posted @ 2008-08-02 16:34 程序手記 閱讀(7209) | 評論 (0)編輯 收藏

    JAVA基礎 (數據類型轉換) 第二天

        很多場合都要用到類型轉換,JAVA的類型轉換有下列兩種。

    自動類型轉換

        整型,實型,字符型數據可以混合運算。在運算過程中,不同類型的數據會自動轉換為同一類型,然后進行運算。自動轉換按低級類型數據轉換成高級類型數據的規則進行,
    轉換規則為:
    (1)(byte 或 short)op int -> int
    (2)(byte 或 short 或 int) op long -> long
    (3)(byte 或 short 或 int 或 long) op float -> float
    (4)(byte 或 short 或 int 或 long 或 float)op double ->double
    (5)char op int ->int

    其中,箭頭左邊表示參與運算的數據類型,op為運算符如加減乘除等,右邊表示運算結果的數據類型。
    如: 3+4.5 是 double型,所以3貝轉換為double型,然后再與4.5相加,其結果也為double型。

    強制類型轉換

        高級數據類型你個要轉換成低級數據類型,需要用到強制類型轉換。其一般形式為:
    (類型名)表達式
    例如:
        int i;
        byte b;
        i = 356;
        b=(byte)i; //強制轉換吼丟失一部分數據,使得b的值為100
        一般使用強制類型轉換可能會導致數值溢出或精度下降,應盡量避免。

    posted @ 2008-08-02 15:18 程序手記 閱讀(159) | 評論 (0)編輯 收藏

    JAVA類型 (String類 和 StringBuffer類) 第二天

    String 類

        String 類提供了幾種字符串創建方法。

        String s = "abcd" 使用字符串常量自動創建String實例。
        String s = new String(String s)通過String 對象或字符串常量傳遞給構造方法。
        public String (char value[],int offset, int count)將字符數組一部分賦給String 構造方法,offset 為起始下表, count 為數組長度。



        String 類提供了豐富的字符串操作方法,其中重要的例舉如下。

        public int lenght() 返回字符串的長度。
        public char charAt(int index) 返回字符串位置index處的字符。
        public boolean equals(Object o) 比較兩個字符串對象,相等則返回true;反之返回false。
        public int compareTo(String s) 比較兩個字符串字典順序,相等返回0,s大于當前字符串返回一個負值,s小于當前串返回一個正值。
        public boolean regionMatches(int toffset,String other,int ooffset,int len)從當前字符串位置toffset開始尋找字符串other中起始位置為ooffset 長度為len 的子串。如發現匹配,返回true; 否則,返回false。
        public boolean startsWith(String prefix) 從當前字符串的起始位置開始尋找字符串 prefix。如發現匹配,返回true;否則,返回false。
        public boolean endsWith(String suffix) 如當前字符串的結尾子串與 suffix 匹配,返回true;否則,返回false。
        public int indexOf(String str) 在當前字符串中尋找與str匹配的子串,返回首次匹配的起始下表值;無匹配返回-1。
        public String substring(int beginIndex,int endIndex) 在當前字符串中,求從起始位置 beginIndex 到結束位置 endIndex 的子串。
        public String concat(String str) 將當前字符串與str連接,返回連接后的字符串。
        public String toLowerCase() 將當前字符串全轉換為小寫形式。
        public String toUpperCase() 將當前字符串轉換為大寫形式。
        public char toCharArray() 將當前字符串轉換為字符數組。
        public Static String valueOf(type variable) 把variable 轉換為字符串,其中 type 表示 variable 的數據類型。






    StringBuffer類

        String類實現一種不能改變的靜態字符串,StringBuffer類實現一種動態可以改變的字符串。StringBuffer類可以用于創建String類,StringBuffer一旦建立,可以用toString()方法將其轉換為String類,以后,就可以使用String 類方法來操作。 
        
        StringBuffer 類提供了三種創建方法。

        public StringBuffer()    創建一個空的StringBuffer類。
        public StringBuffer(int length)    創建一個大小為length的StringBuffer類。
        public StringBuffer(String str)    按str創建一個動態可變的StringBuffer類。


        StringBuffer    類提供的方法主要用于把輸入的數據轉換為String類。輸入數據可來自鍵盤或其他數據源。類型可以是字符,字符數組,證書,浮點數和Object類型等。

        public int length()    返回緩沖區的字符數
        public int capacity()    返回緩沖區的容量大小,其值為:字符串長度+16。
        public synchronized StringBuffer append(type variable)    把variable轉換為字符串,然后與當前字符串連接。
        public synchronized StringBuffer append(Char(char ch))    把字符ch連接到當前串尾。
        public synchronized StringBuffer insert(int offset,type variable)    把variable轉換為字符串,然后插入到當前串中由offset指定的位置。
        public synchronized StringBuffer insert(int offset,char ch)    把字符 ch 插入到當前串由ofset指定的位置。
        public synchronized String toString()    把StringBuffer轉換為字符串String。各個方法的使用,具體請參閱 JAVA API文檔。

    posted @ 2008-08-02 11:57 程序手記 閱讀(706) | 評論 (0)編輯 收藏

    JAVA程序的執行 (OBJECT類) 第二天

        Object類是JAV類庫中的一個特殊的類,它是類庫中所有類的父類,也是用戶自定義的所有類的直接或間接父類。也就是說,用戶定義的所有類在默認情況下都是Object類的子類,無論用戶是否顯示生命Object類作為自己定義的類的父類。這是系統自動完成的,由此,通過把Object類稱為通用超類。
        Object類中的成員方法恰好都是方法,其中有7個public類型的,2個protected類型的。用戶自定義的所有類都將繼承這些方法。Object類中的7個public類型的方法分別是tostring(0方法,equals()方法,getclass()方法,含水層哦的()方法,notify()方法,notifyall()方法,和wait()方法,2個protected類型的方法是clone()方法和finalize()方法。
        其中toString()方法和equals()方法較為常用
    toString()方法 較為簡單,略過。
    equals()方法
        Object類的equals()方法用戶比較以參數傳過來的對象和當前對象,如果他們是相同的對象(不僅是相等,而且必須是同一個對象),則返回true;如果他們是不同的對象,即使兩者的數據成員相等,也將返回false。

    equals()方法的格式
    test t = new test();
    test t2 = new test();

    if(t.equals(t2)){
        true;
    }else{
        false;
    }

    posted @ 2008-08-02 11:18 程序手記 閱讀(159) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲AV无码精品色午夜果冻不卡| 在线涩涩免费观看国产精品 | 亚洲人和日本人jizz| 综合偷自拍亚洲乱中文字幕| 一级毛片免费毛片一级毛片免费 | 亚洲国产av无码精品| 亚洲一卡2卡3卡4卡乱码 在线 | 成人片黄网站A毛片免费| 久久亚洲国产成人精品性色| 一级一黄在线观看视频免费| 国产成人精品123区免费视频| 亚洲黄色免费在线观看| 七色永久性tv网站免费看| 亚洲中文字幕日产乱码高清app| 国产国拍精品亚洲AV片| 亚洲精品又粗又大又爽A片| 在线视频观看免费视频18| 亚洲国产精品yw在线观看| 18禁止看的免费污网站| 亚洲美女aⅴ久久久91| 嘿嘿嘿视频免费网站在线观看| 亚洲国产精品特色大片观看完整版 | 亚洲电影在线播放| 国产妇乱子伦视频免费| 亚洲一区二区三区在线网站| 69成人免费视频无码专区| 精品亚洲456在线播放| 四虎影在线永久免费四虎地址8848aa| 亚洲av无码兔费综合| 亚洲国产精品成人网址天堂| 成人性生交大片免费看好| 亚洲酒色1314狠狠做| 成人免费毛片观看| 中国一级特黄的片子免费 | 亚洲av无码国产精品色午夜字幕 | 色久悠悠婷婷综合在线亚洲| 成年大片免费视频播放一级| 免费人成视频在线| 免费国产va在线观看| 国产亚洲自拍一区| 久久久久高潮毛片免费全部播放 |