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

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

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

    程序手記

    程序是我畢生的追求......
    隨筆 - 19, 文章 - 0, 評(píng)論 - 9, 引用 - 0
    數(shù)據(jù)加載中……

    2008年8月1日

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

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

        第一個(gè)文件內(nèi)容如下:
            <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>

        第二個(gè)文件內(nèi)容如下:
            <%@ 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;    //定義上傳文件的最大字節(jié)
                String rootPath;    //創(chuàng)建跟路徑的保存變量
                DataInputStream in = null;    //聲明文件讀入類
                FileOutpubStream fileOut = null;    //
                String remoteAddr = request.getRemoteAddr();    //取得客戶端的網(wǎng)絡(luò)地址
                String servName = request.getServerName();    //獲得服務(wù)器的名字
                out.print("serverName=" + serverName + "<br>");
                out.print("request.getServletPath() = " + request.getServletPath() + "<br>")

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

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

        JavaBean是一個(gè)可重復(fù)使用、且跨平臺(tái)的軟件組件(SoftWare Component),它可以在軟件開發(fā)工具如:Borland JBuilder \ Oracle JDeveloper 或是 Sun ONE Studio 等等里,以可視化的開發(fā)方式來開發(fā)。
        首先,你可以將JAVABEAN視為一個(gè)黑盒子(Black Box),雖然知道這個(gè)軟件組件所具備的功能,卻不知其內(nèi)部是如何運(yùn)作的。筆者提供給讀者一個(gè)假象的情況:有一個(gè)黑盒子,只知道它上面有一個(gè)按鈕,你只要按下去經(jīng)過十分鐘,就會(huì)掉下一張一千元的鈔票,不過你看不見其內(nèi)部任何的構(gòu)造,而這就是JAVABEAN最重要的特性,它將許多的信息都封裝了起來,用戶無需知道黑盒子如何產(chǎn)生出鈔票,只需知道按下那個(gè)按鈕,然后等十分鐘,超片就會(huì)自動(dòng)產(chǎn)生出來。
        一般而言,JAVABEAN可分為:有用戶接口(user interface)的javabean和沒有用戶接口的javabean,通常JSP是搭配沒有UI的JAVABEAN,因此后面所提到的JAVABEAN都知識(shí)單純處理一些食物,如:數(shù)據(jù)運(yùn)算,連接數(shù)據(jù)庫和數(shù)據(jù)處理,等等,至于有用戶接口的JAVABEAN部分,請(qǐng)讀者自己參考JAVABEAN的相關(guān)書籍。
        通常一個(gè)標(biāo)準(zhǔn)的JAVABEAN有如下幾項(xiàng)特性:
        (1)javabean是一個(gè)公開的(public)類;
        (2)javabean類必須有一個(gè)無傳入?yún)?shù)(zero-argument)的構(gòu)造函數(shù)(constructor);
        (3)取得或設(shè)置屬性時(shí),必須使用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 程序手記 閱讀(506) | 評(píng)論 (0)編輯 收藏

    JSP基礎(chǔ) (JSP動(dòng)作元素) 第二十一天

        與JSP指令元素不同的是,JSP動(dòng)作元素在請(qǐng)求處理階段起作用。JSP動(dòng)作元素是試用XML語法寫成的,它可以采用以下兩種格式:
        <prefix:tag attribute = value attribute-list.../>
    或者
        <prefix:tag attribute = value attribute-list.../>
        ...
        </prefix.tag>
    SERVLET容器在處理JSP時(shí),每當(dāng)遇到這種動(dòng)作元素,都根據(jù)它的標(biāo)記進(jìn)行特殊處理。
    JSP規(guī)范定義了一系列的標(biāo)準(zhǔn)動(dòng)作,它用JSP作為前綴。這些標(biāo)準(zhǔn)的動(dòng)作不去慣容器是如何實(shí)現(xiàn)的,但是每個(gè)WEB容器都必須提供這些操作類型。標(biāo)準(zhǔn)動(dòng)作為網(wǎng)頁設(shè)計(jì)者提供了基本的功能,其他的廠商可以自由提供其他的非標(biāo)準(zhǔn)動(dòng)作以增強(qiáng)功能。
        標(biāo)準(zhǔn)動(dòng)作有:
    <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>等
    在標(biāo)準(zhǔn)動(dòng)作中,有許多是XML語法的動(dòng)作元素,比如<jsp:scriptelet> <jsp:declaration>但他們的使用并不廣泛,下面介紹JSP中主要的動(dòng)作元素。

    文件導(dǎo)入標(biāo)記<jsp:include>
    include用于允許在請(qǐng)求時(shí)間內(nèi)在縣城的JSP頁面里包含靜態(tài)或者動(dòng)態(tài)資源。被包含的對(duì)象只有對(duì)JSPWRITER對(duì)象的訪問權(quán),并且它不能設(shè)置頭或者COOKIE,如果頁面輸出是緩沖的,那么緩沖區(qū)的刷新要有限于包含的刷新。此指令在運(yùn)行的效率上比<%@ page include %>指令的效率低,但是可以動(dòng)態(tài)增加內(nèi)容。用戶可以通過一下的格式來使用文件導(dǎo)入標(biāo)記
        <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>

    頁面轉(zhuǎn)向標(biāo)記<jsp:forward />
    實(shí)例:
        <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) | 評(píng)論 (0)編輯 收藏

    JSP基礎(chǔ) (獲取當(dāng)前時(shí)間) 第二十一天

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

    <% page contentType="text/html; charset=utf-8" import="java.util.*" %>
    <body>
    <%
    //獲取當(dāng)前的時(shí)間
    java.util.Date thisday = new java.util.Date();
    %>
    當(dāng)前時(shí)間:
    <%=thisday.getYear()+1900%>年
    <%=thisday.getMonth()+1%>月
    <%=thisday.getDate()%>日
    <%=thisday.getHours()%>時(shí)
    <%=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 程序手記 閱讀(1259) | 評(píng)論 (0)編輯 收藏

    JSP基礎(chǔ) (高級(jí)計(jì)數(shù)器實(shí)例) 第二十天

                                                                               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) | 評(píng)論 (0)編輯 收藏

    TOMCAT基礎(chǔ) (設(shè)定站點(diǎn)) 第十三天

        在Tomcat 上建立一個(gè) JSPBook站點(diǎn)時(shí),我們需要修改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>

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

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

    JAVA基礎(chǔ) (JAVA中的STATIC塊) 第十三天(對(duì)浪費(fèi)的前10天表示悔恨)

    Java 程序中時(shí)常用些 static{}這樣的結(jié)構(gòu)。
    這樣的結(jié)構(gòu)叫 static塊,一般是一個(gè)類初始化時(shí)運(yùn)行的代碼。注意,是類的初始化,不是對(duì)象的初始化。
    也就是你在定義對(duì)象時(shí),他運(yùn)行的初始化代碼,并且只有第一次定義時(shí)才運(yùn)行。之后就不再運(yùn)行初始化了。
    一個(gè)類中可以有很多static塊。static塊按順序執(zhí)行。

    看以下代碼:
    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);
        }
    }
    執(zhí)行結(jié)果是:
    1
    2
    3
    4
    5
    一目了然,首先調(diào)用的是static靜態(tài)塊的代碼,然后調(diào)用啟動(dòng)方法,而STATIC塊的執(zhí)行順序是由代碼的編寫順序執(zhí)行的過程,STATIC塊大家用的比較少,其實(shí)就是在對(duì)象生成之際產(chǎn)生的一系列的STATIC變量。

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

    JAVA WEB開發(fā) (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) | 評(píng)論 (0)編輯 收藏

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

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

    Tomcat的默認(rèn)端口號(hào)是8080,這個(gè)數(shù)值可以在安裝過程中修改也可以在conf/server.xml中修改。

    Tomcat是根據(jù)系統(tǒng)的%JAVA_HOME%變量值選擇系統(tǒng)中的JDK。

    Tomcat目錄主要文件夾作用

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

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

    • 注意:修改server.xml之后要重新啟動(dòng)Tomcat服務(wù)器才能使配置生效

    配置虛擬目錄的要求

     

     

    • 修改server.xml文件
    • 虛擬目錄的結(jié)構(gòu)要符合要求
      • WebRoot
        • WEB-INF
          • web.xml
      • 其中web.xml的內(nèi)容一般為:

         


        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

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

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

    jsp文件的運(yùn)行過程: *.jsp  -->  *.java  -->  *.class  -->  運(yùn)行顯示 

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

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

    JAVA基礎(chǔ) (嵌套類) 第四天

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

    嵌套類可以訪問外部類似有成員。
        // 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) | 評(píng)論 (0)編輯 收藏

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

        建立Java包,布局源文件和設(shè)置classpath參數(shù)之間相互影響。也相互關(guān)聯(lián)。正確建立和導(dǎo)入JAVA包,合理布局源文件,準(zhǔn)確設(shè)置CLASSPATH參數(shù),才能保證應(yīng)用程序順利執(zhí)行,并有效管理應(yīng)用程序。

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

    包的使用方法
        每個(gè)源文件只能有一個(gè)包聲明,并且一定要求放在源文件的開始位置。如果一個(gè)源文件沒有包語句,則源文件所定義的類或接口唄系統(tǒng)放入默認(rèn)包中。包有層次,層次間由點(diǎn)分隔。
        例如有一組與圖形相關(guān)的類,包括Circles,Rectangles,Lines和points類等,描述了畫圖所用到的各種圖形組件,另有抽象類Graphic標(biāo)識(shí)圖形組件的共性,接口Draggable表示用戶可以通過鼠標(biāo)拖拽成圖的圖形組件。在這種情況下,我們不僅需要,而且也應(yīng)該將這些相關(guān)類和接口組成包,可命名為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{
        ...
    }
        通過創(chuàng)建和使用包,程序員不僅可以很容易地確定哪些類和接口是相關(guān)的,也可以很容易地找到提供特定功能的類和接口,例如,與畫圖有關(guān)的類和接口在graphics包中。

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

    包的命名方式
        包提供了心的命名控件,即使所定義的類使用與其他包中的類相同的名字,只要包類所屬的包不同名,就不會(huì)引起沖突。原因是這些類的全程限定名稱不同。類的全程限定包含了類的各層包名。這實(shí)質(zhì)上是應(yīng)用了面向?qū)ο蟮母拍睿瑢㈩惙庋b入包中。

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

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

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

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

      

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


    classpath參數(shù)
        classpath參數(shù)用于設(shè)置Java包所在的頂級(jí)目錄。也就是說,通過classpath可以為Java包建立所依存的目錄列表。編譯和運(yùn)行Java 程序時(shí),系統(tǒng)會(huì)自動(dòng)從classpath環(huán)境變量中讀取包所在的目錄,文件所在目錄由系統(tǒng)通過classpath中的目錄和package語句中定義的目錄合成。
        下面通過一個(gè)完整的實(shí)例程序,說明classpath參數(shù)的作用,同時(shí)展示源文件和字節(jié)碼文件的一種建議布局模式。
        程序包含兩個(gè)類 Time 和 TestTime,TestTime為主類。程序?qū)τ脩糨斎氲谋硎拘r(shí)、分鐘和秒鐘的3個(gè)整型數(shù),經(jīng)過數(shù)據(jù)正確性驗(yàn)證,分別轉(zhuǎn)換為通用時(shí)間表示格式和標(biāo)準(zhǔn)時(shí)間表示格式,通過對(duì)話框顯示給用戶,運(yùn)行后如圖:
                                                                          

        文件布局方式如下:創(chuàng)建 d:\javaSample 目錄存放java程序,創(chuàng)建 d:\javaSample\src 子目錄存放源文件,創(chuàng)建d:\javaSample\class 子目錄存放編譯后的字節(jié)碼文件。 具體實(shí)現(xiàn)方式是將文件 TestTime.java 存放在 D:\javaSample\src 子目錄下,為使 src 子目錄的結(jié)構(gòu)與 class 子目錄結(jié)構(gòu)相對(duì)應(yīng),創(chuàng)建 D:\javaSample\src\cn\edu\jmu\timer 子目錄存放 Time.java文件。類Time和類TestTime的布局如圖:
                                  
        Time.java中的語句
        package cn.edu.jmu.timer;
        將Time類放入包c(diǎn)n.edu.jmu.timer中,源文件Time.java存放在與包相對(duì)應(yīng)的目錄結(jié)構(gòu)下。在類TestTime.java中通過語句   import cn.edu.jmu.timer.Time;   導(dǎo)入Time類。
        需要設(shè)置classpath參數(shù),規(guī)定程序中的包    cn.edu.jmu.timer 編譯所依存的頂級(jí)目錄為 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
        運(yùn)行:
            java TestTime

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

    JAVA面向?qū)ο缶幊?(接口) 第二天

        接口是JAVA語言中非常重要的概念,回調(diào)是軟件設(shè)計(jì)中常用的模式。JAVA的接口不僅可以用來實(shí)現(xiàn)多繼承關(guān)系,也用來實(shí)現(xiàn)回調(diào)機(jī)制。 java.lang.Comparable 接口和 java.util.Comparator 接口是進(jìn)行數(shù)據(jù)對(duì)象比較和排序中需要實(shí)現(xiàn)的接口,他們?cè)诠δ芎褪褂梅椒ㄉ隙加兴煌?br />
        當(dāng)類只從一個(gè)類繼承時(shí)稱為單繼承,JAVA語言只允許單繼承。如果需要多繼承關(guān)系,可以通過JAVA語言中的接口實(shí)現(xiàn)。
        抽象方法只有方法定義,沒有方法體,如果一個(gè)類包含任何抽象方法,包括直接的和繼承所得,則這個(gè)類必須是抽象的。如果一個(gè)類是抽象的,則不能創(chuàng)建此類的對(duì)象。抽象類強(qiáng)制要求他的所有子類重寫自己的方法以覆蓋抽象方法。
        如果存在超類 Animal,顯然cat同時(shí)具有 Animal和pet的特性,就是說,cat不只是一個(gè)animal還是一個(gè)pet,除需要繼承animal類,還期望能實(shí)現(xiàn)pet類。因?yàn)镴AVA只允許單繼承,CAT不能繼承animal又繼承pat,解決這個(gè)問題的方法是定義接口,并通過接口實(shí)現(xiàn)多繼承。

    定義接口
        我們把只有抽象方法和常量的抽象類稱為接口,接口形式化定義了一組相互有關(guān)系的未實(shí)現(xiàn)的方法。接口的定義包括接口聲明和接口體。
    接口聲明的語法為:[public] interface 接口名 [extends 父接口名] {。。。。。。}
        EXTENDS子句與類聲明的extends子句基本相同,不同的是:一個(gè)接口可以有多個(gè)父接口,用逗號(hào)隔開,而一個(gè)類只能有一個(gè)父類。
        接口體包括常量和抽象方法。
       
    接口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 不再具有父子關(guān)系,而分別是實(shí)現(xiàn)了接口Pet的類。
        一個(gè)接口的定義由關(guān)鍵字 interface 開始,包括一套 public ,abstract 方法,接口也可以包含 public ,final,static數(shù)據(jù)。一個(gè)期望使用接口的類必須將自己聲明為 implements 接口,并重寫接口定義的每個(gè)方法,保證參數(shù)列表及返回類型與接口中所定義的相一致。簡單說,強(qiáng)制要求實(shí)現(xiàn)接口的類覆蓋接口的方法。
        如果一個(gè)類沒有覆蓋接口定義中的全部方法,那么這個(gè)類就稱為抽象類,必須貝聲明為 abstract。

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

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

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

        面向?qū)ο蟮姆治雠c設(shè)計(jì)(OOA&D)方法是一種非常成熟的技術(shù)。也是當(dāng)前商業(yè)公司經(jīng)常使用的一種技術(shù),因?yàn)镴AVA語言本身就是一種面向?qū)ο蟮恼Z言,所以掌握面向?qū)ο筮@種技術(shù)對(duì)于JAVA語言的應(yīng)用具有重要意義。

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

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

    多態(tài)(polymorphism)
        多態(tài)又分為設(shè)計(jì)時(shí)多態(tài)和運(yùn)行時(shí)多態(tài),例如重載又被稱為設(shè)計(jì)時(shí)多態(tài),而對(duì)于覆蓋或繼承的方法,JAVA運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類型來決定選擇調(diào)用哪個(gè)方法則被稱為運(yùn)行時(shí)多態(tài)??偠灾?,面向?qū)ο蟮脑O(shè)計(jì)的典型特點(diǎn)就是繼承,封裝和多態(tài),這些特點(diǎn)也是面向?qū)ο笾阅苋绱耸⑿械年P(guān)鍵所在。

    單繼承與多繼承
        JAVA不支持多重繼承,單繼承使JAVA的繼承關(guān)系很簡單,一個(gè)類只能有一個(gè)父類,易于管理程序,同時(shí)一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,從而克服單繼承的缺點(diǎn)。

        接口的定義和類的定義很相似,只是關(guān)鍵字不同,關(guān)鍵字為interface。生命格式如下:
    interface 接口名
    {
    }
        上面的大括號(hào)中為接口體。接口體中包含成員變量定義和方法定義兩部分。
        接口體中只進(jìn)行方法的聲明,不允許提供方法的實(shí)現(xiàn)。所以在格式上只存在方法聲明,實(shí)際上沒有方法體,而方法體要在實(shí)現(xiàn)的類中再去具體定義。
        還有一點(diǎn)需要說明的是:如果一個(gè)類使用了某個(gè)接口,就必須要實(shí)現(xiàn)這個(gè)接口的所有方法,即使實(shí)在沒有內(nèi)容只是一個(gè)空的方法體也不許要寫。而且每個(gè)方法都默認(rèn)是public的,所以實(shí)現(xiàn)時(shí)代碼一定要用public做修飾,參數(shù)個(gè)數(shù),類型以及返回值的類型都必須與接口中的聲明相一致。
    例如:
        interface Runable
        {
        }
        當(dāng)某個(gè)類要實(shí)現(xiàn)這個(gè)接口時(shí),就用 imlements 來聲明。
        例如,我們相做一個(gè)多線程的例子,那么就可有兩種實(shí)現(xiàn)方式,一種是通過定義一個(gè)Thread類的子類來實(shí)現(xiàn),另一種是通過實(shí)現(xiàn)Runable接口來實(shí)現(xiàn)。代碼如下(這里的PrintHello類就是通過實(shí)現(xiàn)Runable接口來實(shí)現(xiàn)的,而不是擴(kuò)展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 程序手記 閱讀(7210) | 評(píng)論 (0)編輯 收藏

    JAVA基礎(chǔ) (數(shù)據(jù)類型轉(zhuǎn)換) 第二天

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

    自動(dòng)類型轉(zhuǎn)換

        整型,實(shí)型,字符型數(shù)據(jù)可以混合運(yùn)算。在運(yùn)算過程中,不同類型的數(shù)據(jù)會(huì)自動(dòng)轉(zhuǎn)換為同一類型,然后進(jìn)行運(yùn)算。自動(dòng)轉(zhuǎn)換按低級(jí)類型數(shù)據(jù)轉(zhuǎn)換成高級(jí)類型數(shù)據(jù)的規(guī)則進(jìn)行,
    轉(zhuǎn)換規(guī)則為:
    (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

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

    強(qiáng)制類型轉(zhuǎn)換

        高級(jí)數(shù)據(jù)類型你個(gè)要轉(zhuǎn)換成低級(jí)數(shù)據(jù)類型,需要用到強(qiáng)制類型轉(zhuǎn)換。其一般形式為:
    (類型名)表達(dá)式
    例如:
        int i;
        byte b;
        i = 356;
        b=(byte)i; //強(qiáng)制轉(zhuǎn)換吼丟失一部分?jǐn)?shù)據(jù),使得b的值為100
        一般使用強(qiáng)制類型轉(zhuǎn)換可能會(huì)導(dǎo)致數(shù)值溢出或精度下降,應(yīng)盡量避免。

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

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

    String 類

        String 類提供了幾種字符串創(chuàng)建方法。

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



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

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






    StringBuffer類

        String類實(shí)現(xiàn)一種不能改變的靜態(tài)字符串,StringBuffer類實(shí)現(xiàn)一種動(dòng)態(tài)可以改變的字符串。StringBuffer類可以用于創(chuàng)建String類,StringBuffer一旦建立,可以用toString()方法將其轉(zhuǎn)換為String類,以后,就可以使用String 類方法來操作。 
        
        StringBuffer 類提供了三種創(chuàng)建方法。

        public StringBuffer()    創(chuàng)建一個(gè)空的StringBuffer類。
        public StringBuffer(int length)    創(chuàng)建一個(gè)大小為length的StringBuffer類。
        public StringBuffer(String str)    按str創(chuàng)建一個(gè)動(dòng)態(tài)可變的StringBuffer類。


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

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

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

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

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

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

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

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

    面向?qū)ο缶幊?(抽象類 最終類 權(quán)限修飾 對(duì)象) 第一天 第二天

        抽象與封裝是面向?qū)ο蟪绦蛟O(shè)計(jì)的兩個(gè)重要概念。類將數(shù)據(jù)以及對(duì)數(shù)據(jù)的操作封裝在一個(gè)抽象數(shù)據(jù)類型中,為屬于該類的所有對(duì)象提供了同意的抽象描述。

        理解抽象與封裝的概念,掌握J(rèn)AVA中的類與對(duì)象的應(yīng)用,能夠運(yùn)用面向?qū)ο笏枷脒M(jìn)行類的設(shè)計(jì),正確設(shè)計(jì)類中的成員方法和成員變量,是我們學(xué)習(xí)的目標(biāo)。

     

        面向?qū)ο笫且环N新型的程序設(shè)計(jì)方法,或者說是一種心的程序設(shè)計(jì)規(guī)范,其基本思想是實(shí)用對(duì)象、類、繼承、封裝、消息等基本概念來進(jìn)行程序設(shè)計(jì)。從顯示世界中客觀存在的事務(wù)(即對(duì)象)出發(fā)來構(gòu)造軟件系統(tǒng),并且在系統(tǒng)構(gòu)建中盡可能運(yùn)行人類的自然思維方式。

        面向?qū)ο蟮脑O(shè)計(jì)方法用對(duì)象描述事物,而每個(gè)具體的對(duì)象又可以用兩個(gè)特征來描述:描述事物靜態(tài)屬性所需的數(shù)據(jù)結(jié)構(gòu)以及對(duì)這些數(shù)據(jù)進(jìn)行的有限操作。也就是說,把數(shù)據(jù)結(jié)構(gòu)和對(duì)數(shù)據(jù)的操作放在一起構(gòu)成一個(gè)整體,才能完整地反應(yīng)實(shí)際問題。數(shù)據(jù)結(jié)構(gòu)和對(duì)數(shù)據(jù)的操作實(shí)際上是相互以來不可分割的整體。

        面向?qū)ο蟪绦蛟O(shè)計(jì)具有抽象、封裝、集成和多態(tài)4個(gè)特點(diǎn)。抽象去掉了被研究對(duì)象中與主旨無關(guān)的次要部分,而僅僅抽取出與研究工作有關(guān)的實(shí)質(zhì)性的內(nèi)容加以考慮。抽象有兩類:一類是過程抽象,另一類是數(shù)據(jù)抽象。

        面向?qū)ο蟪绦蛟O(shè)計(jì)強(qiáng)調(diào)數(shù)據(jù)抽象,數(shù)據(jù)抽象把系統(tǒng)總需要處理的數(shù)據(jù)和這些數(shù)據(jù)上的操作結(jié)合在一起,根據(jù)功能、性質(zhì)、作用等因素抽象成不同的抽象數(shù)據(jù)類型。每個(gè)抽象數(shù)據(jù)類型既包含數(shù)據(jù),又包含針對(duì)這些數(shù)據(jù)的操作,是相對(duì)于過程抽象更為嚴(yán)格的抽象方法。

     

    封裝

        封裝就是利用抽象數(shù)據(jù)類型把數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在抽象數(shù)據(jù)類型的內(nèi)部,系統(tǒng)的其他部分只有通過數(shù)據(jù)的操作,才能夠于這個(gè)抽象數(shù)據(jù)類型進(jìn)行交互,封裝包含兩層含義。

        第一,把對(duì)象的全部屬性及其行為結(jié)合在一起,形成一個(gè)不可分割的獨(dú)立單位(即對(duì)象)。

        第二,信息隱蔽,即盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),對(duì)外形成一個(gè)邊界(或者說形成一道屏障),只保留有限的對(duì)外接口,使之與外部發(fā)生聯(lián)系。

        封裝的原則在軟件上的反應(yīng)是:對(duì)象以外的部分不能隨意存取對(duì)象的內(nèi)部數(shù)據(jù)(屬性),從而有效地避免了外部錯(cuò)誤對(duì)他的“交叉感染”,使軟件錯(cuò)誤能夠局部化,大大減少查錯(cuò)和排錯(cuò)難度。

       在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,抽象數(shù)據(jù)類型是用“類”這種面向?qū)ο蠊ぞ弑硎镜?,每個(gè)類里都防撞了相關(guān)的數(shù)據(jù)和操作。封裝性降低了程序開發(fā)過程的復(fù)雜性,提高了效率和質(zhì)量,保證了數(shù)據(jù)的完整性和安全性。同時(shí),封裝性提高了抽象數(shù)據(jù)類型的可重用性,使抽象數(shù)據(jù)類型稱為一個(gè)結(jié)構(gòu)完整、能夠自行管理的有機(jī)整體。

     

        把眾多的事物歸納、劃分成一些類,是人類在認(rèn)識(shí)客觀世界時(shí)經(jīng)常采用的思維方法。分類的原則是抽象。類是一組對(duì)象的集合,它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個(gè)獨(dú)立的程序單位行為。類的實(shí)例化結(jié)果就是對(duì)象,而對(duì)一類對(duì)象的抽象就是類。

        類的定義

        類是JAVA的核心和本質(zhì),想要在JAVA程序中實(shí)現(xiàn)的每個(gè)概念,都必須封裝自愛類中。類是具有共同屬性和行為的對(duì)象的抽象,屬性描述了對(duì)象的狀態(tài),以數(shù)據(jù)的形式存在,在JAVA面向?qū)ο蟪绦蛟O(shè)計(jì)中又貝稱為變量。行為描述了對(duì)數(shù)據(jù)進(jìn)行的操作,可引起對(duì)象狀態(tài)的改變。在JAVA面向?qū)ο蟪绦蛟O(shè)計(jì)中貝稱為方法。

        JAVA中類的實(shí)現(xiàn)包括兩個(gè)部分:類頭和類體。類頭定義的格式如下:

     [類定義修飾符] class <類名> [extends <父類名>] [implements <接口列表>]

        類的定義主要包括關(guān)鍵詞 class 和類名。類名是JAVA語言合法的標(biāo)識(shí)符,類名一般具有一定的含義。其中,CLASS為定義類的關(guān)鍵字,extends是用于繼承的關(guān)鍵字,implements是用于實(shí)現(xiàn)接口的關(guān)鍵字,有關(guān)類的修飾符后面將詳細(xì)闡述。

        類體是類的主體部分,它包含了所有實(shí)現(xiàn)類功能的JAVA語言程序代碼,包括成員變量和成員方法。JAVA類除了繼承它的父類中的變量和方法外,一般仍會(huì)在類體中明確定義自己的變量和方法。程序中,變量說明應(yīng)放在定義之前。類體要用{}括起來。類體的格式如下:

    class <類名>{

         [變量修飾符] <變量內(nèi)省> <變量名>

         [方法修飾符] <方法返回值類型> <方法名>([<參數(shù)列表>]){

              方法體

         }

    }

     

        其中,變量名是JAVA語言中的合法標(biāo)識(shí)符,變量的類型可以是JAVA給定的任意數(shù)據(jù)類型或者用戶自定義類。用于說明變量和方法的訪問權(quán)限等屬性。

     

    一個(gè)簡單的學(xué)生類:

    //**********Student.java*********

    //學(xué)生類的定義

    import java.io.*; //加載系統(tǒng)輸入輸出類

    public class Strdent{

         /*類成員的定義*/

         private String name;    //成員變量

         private String sex;     //成員變量

         rivate int number;     //成員變量

         void setValue(String a, String b, int c)//成員方法

         {

              name = a;

              sex = b;

              number = c;

         }

         public int getNumber()     //成員方法

         {

              return number;

         }

         public static void main(String args[])       //成員方法

         {

              //打印輸出一行字符

              System.out.println("這是一個(gè)學(xué)生類的定義!");

         }

    }// Student 類結(jié)束

     

        //代表JAV語言中的單行注釋。

        /*   */ 之間的部分是多行注釋。

       

    類的修飾符

        類的修飾符說明類的性質(zhì)和訪問權(quán)限,分為訪問控制符和非訪問控制符,包括

     public 、protected 、 private 、abstract  和 final 。

        1. public , protected 和 private

        public , protected 和 private 說明類的訪問權(quán)限,屬于訪問控制符。

        用public修飾的類,不僅能貝同一包中其他類訪問,還能貝包之外的類和對(duì)象使用。

        protected 修飾的類為保護(hù)類,可貝同包類和異包子類訪問。

        private 修飾符的類為似有類,外界無法訪問。

     

        共有類的定義。

    //*******TestPublic.java*******

    //共有類的定義

    import java.io.*; //加載系統(tǒng)輸入輸出類

    public class TestPublic

    {

         /*每個(gè)類的main()方法是該程序的入口,而包含main方法的類是程序的主類。

    main()方法的形式是 public static void main(String args[]) */

         public static void main(String args[])

         {

              System.out.println("這是一個(gè)共有類");

         }

    }

        下面定義一個(gè)名為TestProtectedAndPrivate的類來測(cè)試保護(hù)類和似有類。

    保護(hù)類和似有類的定義:

    //*************TestProtectedAndPrivate.java**********

    //保護(hù)類和似有類的定義

    import java.io.*;  //加載系統(tǒng)輸入輸出類

    public class TestProtectedAndPrivate{

         //主方法

         public static void main(String args[]){

              //分別創(chuàng)建保護(hù)類和似有類的對(duì)象t1和t2

              TestProtected t1 = new TestProtected();

              TestPrivate t2 = new TestPrivate();

     

              //打印輸出兩行字符

              System.out.println(t1.toString());

              System.out.println(t2.toString());

         }

         protected static class TestProtected     //保護(hù)類

         {

              public String toString(){

                   return "保護(hù)類的定義:作為潛逃類的內(nèi)部類";

              }

         }

         private static class TestPrivate      //似有類

         {

              public string toString(){

                   return "私有類的定義:作為嵌套類的內(nèi)部類";

              }

         }

    }     // TestProtectedAndPrivate 類結(jié)束

     

     

    aabstract

        abstract 說明一個(gè)類為抽象類,所謂抽象類是指不能直接實(shí)例化對(duì)象的類。如果一個(gè)抽象類貝說明了,則這個(gè)類中將包括一個(gè)或幾個(gè)抽象方法。所謂抽象方法是指該方法只有方法說明卻沒有方法體,即沒有具體實(shí)現(xiàn)的代碼。抽象類本身不具備實(shí)際功能,它只用于衍生子類。定義抽象類和抽象方法的目的是建立抽象模型。抽象類中不一定包含抽象方法,但一旦某個(gè)類中說明了抽象方法,該類必須說明為抽象類。

     

    不包含抽象方法的抽象類的定義。

    //*************TestAbstract.java*************

    //不包含抽象方法的抽象類

    import java.io.*; //加載系統(tǒng)輸入輸出類

    public abstract class TestAbstract{

         //該類不包含抽象方法

     

         //主方法

         public static void main(String args]){

              //打印輸出兩行字符

              System.out.println("這是一個(gè)不包含抽象方法的抽象類!");

              System.out.println("抽象類不能創(chuàng)建對(duì)象!");

         }

    } // TestAbstract 類結(jié)束

     

    包含抽象方法的抽象類的定義。

    //********** Mankind.java **********

    //包含抽象方法的抽象類

         import java.io.*; //加載系統(tǒng)輸入輸出類

         public abstract class Mankind{

              //定義4個(gè)抽象方法

              public abstract void closing();

              public abstract void food();

              public abstract void shelter();

              public abstract void transportation();

     

              //主方法

              public static void main(String args[]){

                   //打印輸出兩行字符

                   System.out.println("這是一個(gè)包含抽象方法的抽象類");

                   System.out.println("抽象方法沒有方法體");

              }

         }//  Mankind 類結(jié)束

     

     

    final

         final 修飾的類又稱為最終類,是指該類不能被繼承,不能再有子類。它的目的是為了避免盲目繼承。一個(gè)final類無法貝繼承,意味著此類在一個(gè)繼承樹中是一個(gè)葉子類,并且此類的設(shè)計(jì)已貝認(rèn)為很具體而不需要進(jìn)行修改或擴(kuò)展。對(duì)于final類中的成員變量,可以定義其為final,也可以不是final。而對(duì)于方法,由于所屬類為final的關(guān)系,自然也就成了final類型。也可以明確地給final類中的方法加上一個(gè)final關(guān)鍵字。下面定義一個(gè)名為TestFinal的最終類。

    //************* TestFinal.java ***************

    //最終類的定義

    import java.io.*; //加載系統(tǒng)輸入輸出類

    public final class TestFinal

    {

         //主方法

         public static void main(String args[]){

              //打印輸出一行字符

              System.out.println("這是一個(gè)最終類,不能被繼承");

         }

    }//TestFinal類結(jié)束

     

    因?yàn)槌橄箢惖哪康木褪菫榱吮焕^承,而最終類的目的是不讓其貝繼承,所以一個(gè)類是不能用 abstract 和 final 同時(shí)修飾的。

     

     

     

    對(duì)象

        對(duì)象是具有某些特俗屬性(數(shù)據(jù))和行為方式(操作)的實(shí)體。對(duì)象可以是有生命的個(gè)體,比如一個(gè)人或一只老虎;還可以是無生命的個(gè)體,比如一輛汽車或一臺(tái)計(jì)算機(jī);也可以是一個(gè)抽象的概念,如天氣的變化或鼠標(biāo)產(chǎn)生的事件。對(duì)象有兩個(gè)特征:屬性(property)和行為(Behavior)。例如,一個(gè)人的屬性有姓名、性別、年齡、身高、體重等;行為有唱歌、打球、騎車和學(xué)習(xí)等。

        類是一個(gè)抽象的概念,而對(duì)象是一個(gè)具體的概念,是類實(shí)例化的結(jié)果。對(duì)象通過消息傳遞來進(jìn)行交互。消息傳遞即激活指定的某個(gè)對(duì)象的方法以改變其狀態(tài)或讓它產(chǎn)生一定的行為。

     

    對(duì)象的生命與引用

        同基本內(nèi)置類型一樣,為了聲明對(duì)象,首先必須寫出類型名,然后寫出該類型的所有變量的名字,中間用逗號(hào)隔開。下面舉例說明怎樣生命一個(gè)類的對(duì)象:

    Student s1, s2, s3;

        上面的生命表示s1\s2\s3是 Student 類型的引用變量,可以用來引用Student型的對(duì)象。引用變量的值將對(duì)應(yīng)一個(gè)內(nèi)存地址,這個(gè)地址標(biāo)識(shí)的空間用來存放一個(gè)Student對(duì)象。

        聲明對(duì)象的引用變量,并不等于創(chuàng)建對(duì)象,當(dāng)然更沒有為對(duì)象分配存儲(chǔ)空間。這些需要通過 new 關(guān)鍵詞和對(duì)引用變量的賦值才能實(shí)現(xiàn)。

     

    創(chuàng)建對(duì)象與定義構(gòu)造方法

        在JAVA語言中,一個(gè)JAVA對(duì)象是類的一個(gè)實(shí)力,創(chuàng)建對(duì)象的過程是對(duì)類的實(shí)例化過程,實(shí)例化對(duì)象就是創(chuàng)建一個(gè)對(duì)象。實(shí)例化對(duì)象意味著給對(duì)象分配必要的存儲(chǔ)空間,用來保存對(duì)象的變量和方法大媽。new 運(yùn)算符用于創(chuàng)建一個(gè)類的實(shí)例并返回對(duì)象的引用,即用來實(shí)現(xiàn)對(duì)象的實(shí)例化。一般格式為:

    <類名>   <對(duì)象名>  =   new  <類名>(<參數(shù)列表>);

        創(chuàng)建對(duì)象與生命基本數(shù)據(jù)類型的變量相似,首先說明新建對(duì)象所屬的類名,然后說明該對(duì)象名,賦值號(hào)左邊的NEW 關(guān)鍵字是用于為新建對(duì)象開辟內(nèi)存空間的運(yùn)算符。與變量相比,對(duì)象占用的內(nèi)存空間要大得多,因?yàn)閷?duì)象既包含變量又包含方法,多數(shù)情況下,變量與方法還不止一個(gè)。例如前面定義的學(xué)生類 Strdent,假設(shè)有一個(gè)對(duì)象s1,則它就有3個(gè)屬性和2個(gè)方法: s1.name  ,s1.sex,  s1.number, s1.setValue(),  s1.getNumber() 。這些變量和方法保存在一塊內(nèi)存中,這塊內(nèi)存就是對(duì)象s1 所占用的內(nèi)存。如果在新建另一個(gè) Strdent類的對(duì)象 s2,則s2對(duì)象將在內(nèi)存中擁有自己的與s1對(duì)象不同的位置相同大小的內(nèi)存空間。

        創(chuàng)建對(duì)象的同時(shí)要調(diào)用這個(gè)對(duì)象的構(gòu)造方法完成對(duì)象的初始化工作,JAVA語言中每一個(gè)類都有構(gòu)造方法,該方法是一種特殊的方法,其特殊性主要體現(xiàn)在以下幾個(gè)方面。

    (1) 構(gòu)造方法的名稱與類的名稱相同。

    (2) 構(gòu)造方法不返回任何數(shù)據(jù)類型,也就沒有返回值。

    (3) 構(gòu)造方法的修飾符只能是訪問修飾符,即 public ,private,protected 中的任一個(gè)。

    (4) 構(gòu)造方法只能由 new 運(yùn)算符調(diào)用,一般不能由編程人員顯式地直接調(diào)用。

    (5) 構(gòu)造方法不能從父類中繼承。而在構(gòu)造方法中可以調(diào)用但前父類和其父類的另一個(gè)構(gòu)造方法,調(diào)用語句必須是構(gòu)造方法的第一條語句。使用當(dāng)前類的構(gòu)造方法用this來引用,使用其父類的構(gòu)造方法用 super 來引用,在構(gòu)造方法的實(shí)現(xiàn)中,可以進(jìn)行方法的重載。

        下面定義一個(gè) Student 類,該類具有兩個(gè)構(gòu)造方法,方法的名稱都是 Student,與類名相同。

     

    public class Student{

         //成員變量

         private String name;

         private String sex;

         private int number;

         

         //成員方法

         Student()     //構(gòu)造方法

         {

              name = "NO name";

              sex = "unknown";

              number = 0;

         }

         Student(String a, String b, int c)//構(gòu)造方法

         {

              name = a;

              sex = b;

              number = c;

         }

    }// Student 類結(jié)束

     

    構(gòu)造方法的重載。

    //************* TestConstructor.java ***************

    //構(gòu)造方法的重載

    import java.io.*; //加載系統(tǒng)輸入輸出類

    class Constructor{

         //成員變量

         private int x;

         private double y;

     

         //沒有參數(shù)的構(gòu)造方法

         Constructor()

         {

              x = 0;

              y = 0.0;

         }

         

         //一個(gè)參數(shù)的構(gòu)造方法

         Constructor(int x){

              this.x = x; //使用 this 關(guān)鍵字標(biāo)識(shí)成員變量,以區(qū)別于同名參數(shù)

         }

     

         //一個(gè)參數(shù)的構(gòu)造方法,參數(shù)類型于前一個(gè)構(gòu)造方法不同

         Constructor(double y){

              this.y = y;

         }

     

         //兩個(gè)參數(shù)的構(gòu)造方法

         Constructor(int x, double y){

              this.x = x;

              this.y = y;

         }

     

         // print() 方法顯示成員變量

         void print()

         {

              System.out.println("x=" +x+"    y="+y);

         }

    }    // Constructor 類結(jié)束

     

     

     

    // ConstructorTest 類

    public class TestConstructor

    {

         //主方法

         public static void main(String args[]){

              //創(chuàng)建 Constructor 類的對(duì)象 c1 c2 c3 c4 分別使用了不同的構(gòu)造方法

              Constructor c1 = new Constructor();

              Constructor c2 = new Constructor(53);

              Constructor c3 = new Constructor(6.98);

              Constructor c4 = new Constructor(5,7.8);

     

              //在屏幕上輸出

              c1.print();

              c2.print();

              c3.print();

              c4.print();

         }

    } // TestConstructor 類結(jié)束



    對(duì)象的使用
        通過運(yùn)算符“.”可以實(shí)現(xiàn)對(duì)對(duì)象中成員變量的訪問和成員方法的調(diào)用??梢酝ㄟ^設(shè)定成員變量和成員方法訪問權(quán)限來限制對(duì)它的訪問。
        調(diào)用對(duì)象的成員變量的一般格式為:
    <對(duì)象名>.<成員變量名>
        其中,對(duì)象名是一個(gè)已生成的對(duì)象,也可以是能生成對(duì)象的表達(dá)式。

    例如:
        s1.name = "李明";
        int num = new Student().number;
        調(diào)用對(duì)象的成員方法的一般格式為:
            <對(duì)象名>.<成員方法名>([<參數(shù)列表>])
        其中,參數(shù)列表是可選項(xiàng)。在進(jìn)行對(duì)象的方法引用時(shí),方法中參數(shù)的個(gè)數(shù)、參數(shù)的數(shù)據(jù)類型與原方法中定義的要一致,否則編譯器會(huì)出錯(cuò)。

    對(duì)象的使用示例。
    //**************  Student2.java ***************
    //對(duì)象的使用
    import java.ioo.*;
    public class Student2{
        private String name;    //姓名
        private String sex;       //性別
        private int number;      //學(xué)號(hào)

        Student2()                  //無參構(gòu)造方法
        {
            name = "No name";
            sex = "unknown";
            number = 0;
        }
        
        Student2(String a, String b, int c){
            name = a;
            sex = b;
            number = c;    
        }
        public void setName(String a){
            name = a;
        }
        public void setSex(String b){
            sex = b;
        }
        public void setNumber(int c){
            number = c;
        }
        public String getName(){
            return name;
        }
        public String getSex(){
            return sex;
        }
        public int getNumber(){
            return number;
        }
        public static void main(String args[]){
            Student2 s1 = new Student2();
            Student2 s2 = new Student2("李明","男",102305);
            System.out.println("對(duì)象的使用");
            System.out.println("-------------------------");
            System.out.println("第一個(gè)學(xué)習(xí)的姓名:"+s1.getName());
            System.out.println("第一個(gè)學(xué)生的性別:"+s1.getSex());
            System.out.println("第一個(gè)學(xué)生的學(xué)號(hào):"+s1.getNumber());
            System.out.println("-------------------------");
            System.out.pringln("第二個(gè)學(xué)生的姓名:"+s2.getName());
            System.out.println("第二個(gè)學(xué)生的性別:"+s2.getSex());
            System.out.println("第二個(gè)學(xué)生的學(xué)號(hào):"+s2.getNumber());
        }
    } // Student2 類結(jié)束

        在定義一個(gè)類時(shí),類中的成員變量也可以是一個(gè)類,例2-9中包含2個(gè)類:Data類和Person類,Person類的成員變量birth為Data類型。

    //*************  Person.java **************
    //對(duì)象作為類的成員變量
    import java.io.*;
    public class Date
    {
        int year;
        int month;
        int day;
        Date(int year, int month, int day){
            this.year = year;    //用關(guān)鍵字this標(biāo)識(shí)類成員變量,一面與同名參數(shù)混淆
            this.month = month;
            this.day = day;
        }
        void showDate(){
            System.out.println(year+","+month+","+day);
        }
    }//Date類結(jié)束

    public class Person
    {
        private String name;
        private String sex;
        private Date birth;    //對(duì)象作為類的成員變量,默認(rèn)初始值為null
        void setValue(String s1, String s2, int y, int m, int d){
            name = s1;
            sex = s2;
            birth = new Date(y,m,d);
        }
        void showValue(){
            System.out.println("姓名:"+name);
            System.out.println("性別:"+sex);
            System.out.print("出生年月日:");
            birth.showDate();
        }
        public static void main(String args[]){
            Person per = new Person();
            per.setValue("李明","男",1975,7,8);
            per.showValue();
        }
    }//Person 類結(jié)束

    finalize() 是銷毀一個(gè)對(duì)象用的



    成員變量

        成員變量是類和對(duì)象的數(shù)據(jù)屬性,其本身也有一些修飾符:訪問控制符 public private protected 以及非訪問控制符  static final transient volatile.這里主要探討常用的static 和final這兩個(gè)非訪問控制符。

    靜態(tài)變量
        使用關(guān)鍵字static 生命的成員變量稱為靜態(tài)變量。靜態(tài)變量也稱類變量(class variable),它與類關(guān)聯(lián),由類鐘的所有對(duì)象共享。無論生成多少個(gè)這種類的對(duì)象,靜態(tài)變量都只有一份,并且即使沒有生成任何對(duì)象,這種變量也存在。靜態(tài)變量之所以稱為類變量,是因?yàn)檫@種變量是屬于相應(yīng)類的,而不是屬于特定對(duì)象的,他們?cè)谠擃惖娜繉?duì)象中共享。靜態(tài)變量可以由任何該類的對(duì)象和類引用,當(dāng)某個(gè)對(duì)象修改了靜態(tài)變量的值后,其他對(duì)象在訪問靜態(tài)變量時(shí),取得的將是改變后的新值。
        相對(duì)地,沒有用static修飾的普通成員變量稱為實(shí)例變量(instance variable)。在類中,實(shí)例變量與每個(gè)對(duì)象都唯一關(guān)聯(lián),每個(gè)類的對(duì)象將擁有自己的一份實(shí)例變量的復(fù)制,并且賦予他自己的值。實(shí)例變量使一個(gè)對(duì)象與其他對(duì)象相互區(qū)別,使對(duì)象具有自己的個(gè)性。
        下面定義一個(gè)學(xué)生 Student 類,其中包含2個(gè)靜態(tài)變量和3個(gè)實(shí)例變量。

    public class Student
    {
        static String school = "黑龍江科技學(xué)院";
        static String classNumber;

        //實(shí)例變量
        String name;
        string sex;
        int number;
        
        Student(){
            name = "No name";
            sex = "unknown";
            number = 0;
        }
        Strdent (String a,String b, int c)    //構(gòu)造方法
        {
            name = a;
            sex = b;
            number = c;
        }
    }//Student類結(jié)束


    最終變量
        使用關(guān)鍵字final聲明的成員變量稱為最終變量,更確切地說是常量。只不過為他們?nèi)×艘粋€(gè)類似變量的標(biāo)識(shí)符名字。用final修飾符聲明常量時(shí),需要說明常量的數(shù)據(jù)類型并要初始化具體的數(shù)值。另外,因?yàn)樗蓄悓?duì)象的常量數(shù)據(jù)成員數(shù)值都一樣,為了節(jié)省內(nèi)存控件,常量通常聲明為static。 例如下面球體類中的常量PI:

    public class Sphere
    {
        //常量
        static final double PI = 3.14;
        //變量
        double xCenter;
        double yCenter;
        double zCenter;
        double radius;
    }// Sphere 類結(jié)束


    成員方法
        成員方法是類的行為,標(biāo)志著類所具有的功能,是對(duì)類中成員變量的操作。JAVA中方法的一般格式如下:
    [方法修飾符] [返回值類型] <方法名> ([<形式參數(shù)列表>]) [throws <異常列表>]
    {
        <方法體>
    }
        成員方法是具有相對(duì)獨(dú)立性的功能模塊,是一個(gè)類與外界進(jìn)行通信的接口。成員方法也有一些修飾符:訪問修飾符public private procected 和非訪問控制符 static abstract final native synchronized 下面分別探討這幾個(gè)非訪問控制符

    靜態(tài)方法
        使用那個(gè)關(guān)鍵字static聲明的成員方法稱為靜態(tài)方法。靜態(tài)方法也稱為類方法(class method),它與類關(guān)聯(lián),是屬于整個(gè)類的,即使類中一個(gè)對(duì)象也不存在,也可以執(zhí)行該類的類方法。正式因?yàn)樵跊]有對(duì)象存在的情況下也可以執(zhí)行類方法,因此它只能調(diào)用類變量,即靜態(tài)方法只能處理靜態(tài)變量,而不能處理類中的實(shí)例變量。很明顯,實(shí)例變量是屬于某個(gè)特定對(duì)象的,如果對(duì)象不存在,實(shí)例變量也就不存在,這時(shí)用類方法去操縱和處理一個(gè)可能不存在的變量肯定會(huì)出問題。實(shí)際上,JAVA編譯器根本就不允許做這樣的嘗試。如果在一個(gè)類方法中引用了一個(gè)實(shí)例變量,系統(tǒng)將拒絕編譯,從而出現(xiàn)出錯(cuò)信息。
        相對(duì)地,未用static 修飾的普通成員方法稱為實(shí)例方法(instance method)。實(shí)例方法只能針對(duì)特定的對(duì)象執(zhí)行,因此如果任何對(duì)象都不存在,也就沒有可以執(zhí)行的實(shí)例方法。

    靜態(tài)方法實(shí)例:
    //************** StaticFunction.java ***************
    //靜態(tài)方法
    import java.io.*;    //加載系統(tǒng)輸入輸出類
    public class StaticFunction
    {
        static int classVariable;      //靜態(tài)變量,即類變量
        int instanceVariable;            //非靜態(tài)變量,即實(shí)例變量

        // setClassVariable()方法為靜態(tài)方法,即類方法
        static void setClassVariable(int i){
            //this.classvar = i; 不能使用this
            classvariable = i;
            //instanceVar=i; 不能訪問實(shí)例變量
        }
        void setInstanceVar(int i){
            instanceVariable = i;
            classvariable = i;
        }
        //MAIN方法也為靜態(tài)方法
        public static void main(String a[]){
            StaticFunction sf = new StaticFunction();
            /*
                下面的語句不合法,main()方法是類方法,不能在類方法中直接調(diào)用實(shí)例方法
                setInseranceVariable(58);
            */
            sf.setInstanceVariable(58);//在類方法中只能通過實(shí)例對(duì)象訪問實(shí)例方法
            sf.setInstanceVariable(58);
            setInstanceVariable(58);
            StaticFunction.setClassVariable(55);
            System.out.println("靜態(tài)方法中不能直接調(diào)用實(shí)例方法,只能通過對(duì)象訪問實(shí)例方法");
        }
    }

    抽象方法
        使用關(guān)鍵字abstract聲明的成員方法稱為抽象方法。抽象方法只有方法頭,沒有方法體。抽象方法的聲明以一個(gè)分號(hào)結(jié)束。

    抽象方法示例。
    //***************  AbstractFunction.java**************
    //抽象方法
    import java.io.*;
    abstract class Mankind
    {
        protected String type;                    //保護(hù)數(shù)據(jù)成員用于繼承
        public abstract void closing();        //抽象方法
        public abstract void food();                    //抽象方法
        public abstract void shelter();                //抽象方法
        public abstract void transportation();    //抽象方法
        
        public String toString(){
            return "這是一個(gè)"+type;
        }
    }//Mankind類結(jié)束

    abstract class people extends Mankind
    {
        //重寫Mankind類的抽象方法colsing()
        public void closing(){
            System.out.println("學(xué)會(huì)穿衣了!");
        }

        //重寫Mankind類的抽象方法food()
        public void food(){
            System.out.println("學(xué)會(huì)吃飯了");
        }
    }//People 類結(jié)束

    class Person extends People{
        //重寫People類的抽象方法shelter()
        public void shelter(){
            System.out.println("蓋房子用來居住");
        }

        //重寫people類的抽象方法transportation()
        public void transportation(){
            System.out.println("使用交通工具出行");
        }

        //構(gòu)造方法
        public Person(String aType){
            type = new String(aType);
        }
    }// Person類結(jié)束

    public class AbstractFunction{
        //AbstractFunction類的主方法
        public static void main(String args[]){
            System.out.println("不能創(chuàng)建抽象類Mankind和People的對(duì)象!");
            System.out.println("");

            Person man = new Person("男人");
            Person woman = new Person("女人");
            System.out.println(man);

            man.closing();
            man.food();
            man.shelter();
            man.transportation();
            System.out.println("  ");

            System.out.println(woman);
            woman.closing();
            woman.food();
            women.transportation();
        }
    }//AbstractFunction 類結(jié)束


    最終方法
        使用關(guān)鍵字final聲明的成員方法稱為最終方法。最終方法的功能和內(nèi)部語句不能在被更改,也就是說該方法不能貝當(dāng)前類的子類重新定義。最終方法使得子類不能重新定義與父類同名的方法,而只能使用從負(fù)累繼承來的方法,從而防止了子類對(duì)父類一些方法的錯(cuò)誤定義,保證了程序的安全性和正確性。


    本地方法
        。。。。。。。。。。。。。。

    posted @ 2008-08-01 20:49 程序手記 閱讀(2099) | 評(píng)論 (4)編輯 收藏

    JAVA基礎(chǔ)(JAVA 執(zhí)行環(huán)境) 第一天

    JAVA程序有3中執(zhí)行環(huán)境。

    (1)能夠單獨(dú)運(yùn)行的程序,稱為Java Application(Java應(yīng)用程序)。

    (2)在Internet瀏覽器中運(yùn)行的程序,稱為 Java Applet(JAVA小用用程序)。Applet是一個(gè)在WEB瀏覽器內(nèi)部運(yùn)行的小應(yīng)用程序,需要WEB瀏覽器的支持。

    (3)在WEB服務(wù)器端運(yùn)行的程序,稱為Java Servlet。Servlet實(shí)際上是運(yùn)行在WEB服務(wù)器上的應(yīng)用程序,它與協(xié)議和平臺(tái)無關(guān)。Java Servlet可以動(dòng)態(tài)地?cái)U(kuò)張WEB服務(wù)器的能力,并采用輕輕偶/想用模式提供WEB服務(wù)。目前SUN公司開發(fā)的JSP技術(shù),JSP是JAVA SERVER PAGE的所寫,悅來越得到廣泛的應(yīng)用。Java Servlet可以與JSP進(jìn)行交互,從而為開發(fā)WEB服務(wù)提供優(yōu)秀的解決方案。

    posted @ 2008-08-01 20:48 程序手記 閱讀(1139) | 評(píng)論 (0)編輯 收藏

    J2SE基礎(chǔ)(JAVA的常用包) 第一天

    JAVA提供了強(qiáng)大的應(yīng)用程序接口,既JAVA類庫。他包含大量已經(jīng)設(shè)計(jì)好的工具類,幫助程序員進(jìn)行字符串處理、繪圖、數(shù)學(xué)計(jì)算和網(wǎng)絡(luò)應(yīng)用等方面的工作。下面簡單介紹JAVA核心類庫中常用的組建包。

    1.java.lang包

        在所有的JAVA API類庫中,JAVA.LANG包是最重要的,它提供了JAVA語言的核心類庫,包含了運(yùn)行JAVA程序必不可少的系統(tǒng)類,如:基本數(shù)據(jù)類型、基本數(shù)學(xué)函數(shù)、字符串處理、線程管理和異常處理類等。運(yùn)行JAVA程序時(shí),系統(tǒng)會(huì)自動(dòng)加載JAVA.LANG包,既這個(gè)包的加載是默認(rèn)的。

    2.java.io包

        JAVA.IO包提供了一系列用來讀寫文件或其他的輸入輸出流。其中有基本輸入/輸出類、緩存流類、比特?cái)?shù)組玉字符串流類、數(shù)據(jù)流類、文件流類、管道類、流連接類和異常類等。

    3.java.util包

        java.util包提供了JAVA語言中的一些低級(jí)的實(shí)用工具,如數(shù)據(jù)結(jié)構(gòu)類、日期類、隨機(jī)數(shù)類、屬性類、觀測(cè)類和異常類等。

    4.java.awt包

        java.awt包是JAVA語言用來構(gòu)建圖形用戶界面(GUI)的類庫,包括許多界面元素和資源。JAVA.AWT包提供JAVA語言中的圖形類、組成類、容器類、排列類、幾何類、事件類和工具類等。

    5.java.net包

        JAVA.NET包包含一些玉網(wǎng)絡(luò)相關(guān)的類和接口,以方便應(yīng)用程序在網(wǎng)絡(luò)上傳輸信息。如主機(jī)名解析類、實(shí)現(xiàn)套接字通信的Socket類和ServerSocket類、資源定位器(URL)類等。

    6.java.applet包

        java.applet包是用來實(shí)現(xiàn)運(yùn)行于Internet瀏覽器中的JAVA APPLET的工具類庫。它包含于產(chǎn)生Applet的類和用于Applet通信的類。Applet類稱為小應(yīng)用程序類,通常所說的Applet程序必須集成該類,Applet是一種專門化的面板,需要潛入到HTML網(wǎng)頁中,由與JAVA語言兼容的瀏覽器執(zhí)行。

    7.JAVA.AWT.EVENT包

        java.awt.event包是對(duì)JDK 1.0版本中原有的Event類的一個(gè)擴(kuò)充,它使得程序可以用不同的方式來處理不同類型的事件,該包中定義了許多不同類型的事件監(jiān)聽器類,使每個(gè)圖形界面元素本身可以處理它上面的事件。

        除了上述的常用JAVA組件包外,JAVA類庫中還有很多實(shí)用的組件包,并且還在不斷地?cái)U(kuò)充,請(qǐng)查看相關(guān)的JAVA文檔。

    posted @ 2008-08-01 20:47 程序手記 閱讀(2130) | 評(píng)論 (5)編輯 收藏

    主站蜘蛛池模板: 亚洲一区中文字幕在线观看| 亚洲国产成AV人天堂无码| 亚洲一区在线免费观看| 黄页网址大全免费观看12网站| 免费黄网站在线观看| 在线视频免费观看www动漫| 国产AV无码专区亚洲AWWW| 亚洲午夜久久久精品电影院| 日产久久强奸免费的看| 三年片在线观看免费大全| 亚洲熟伦熟女新五十路熟妇 | 在线观看亚洲一区二区| 亚洲国产成人无码AV在线| 久久久久久久岛国免费播放| 国产免费观看青青草原网站| 亚洲国产精品久久久久久| 国产亚洲蜜芽精品久久| 免费看黄视频网站| 亚洲无码在线播放| 精品亚洲成a人在线观看| 亚洲一区免费在线观看| 中文字幕第13亚洲另类| 亚洲性无码一区二区三区| 久久久久国产精品免费网站| 亚洲日本韩国在线| 亚洲精品国产第一综合99久久| 四虎影视在线影院在线观看免费视频 | 国产成人亚洲综合网站不卡| 在线观看片免费人成视频无码| 免费人妻av无码专区| 亚洲人成激情在线播放| 久久精品成人免费看| 亚洲国产成人精品无码久久久久久综合| 亚洲另类春色国产精品| 男人j进入女人j内部免费网站| 亚洲精品无码专区2| 亚洲精品无码专区在线| 成人免费黄色网址| 亚洲精品私拍国产福利在线| 国产无遮挡色视频免费观看性色 | 国产亚洲精品成人a v小说|