程序手记

程序是我毕生的追求......
随笔 - 19, 文章 - 0, 评论 - 9, 引用 - 0
数据加载中……

2008年8月1日

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 程序手记 阅读(235) | 评论 (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 程序手记 阅读(499) | 评论 (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 程序手记 阅读(473) | 评论 (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 程序手记 阅读(1249) | 评论 (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 程序手记 阅读(171) | 评论 (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 程序手记 阅读(154) | 评论 (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 程序手记 阅读(335) | 评论 (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 程序手记 阅读(231) | 评论 (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 程序手记 阅读(310) | 评论 (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 程序手记 阅读(169) | 评论 (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 程序手记 阅读(353) | 评论 (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 程序手记 阅读(246) | 评论 (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 程序手记 阅读(7204) | 评论 (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 程序手记 阅读(157) | 评论 (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 程序手记 阅读(702) | 评论 (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 程序手记 阅读(156) | 评论 (0)编辑 收藏

面向对象编程 (抽象类 最终类 权限修饰 对象) 第一天 第二天

    抽象与封装是面向对象程序设计的两个重要概念。类将数据以及对数据的操作封装在一个抽象数据类型中,为属于该类的所有对象提供了同意的抽象描述。

    理解抽象与封装的概念,掌握JAVA中的类与对象的应用,能够运用面向对象思想进行类的设计,正确设计类中的成员方法和成员变量,是我们学习的目标。

 

    面向对象是一种新型的程序设计方法,或者说是一种心的程序设计规范,其基本思想是实用对象、类、继承、封装、消息等基本概念来进行程序设计。从显示世界中客观存在的事务(即对象)出发来构造软件系统,并且在系统构建中尽可能运行人类的自然思维方式。

    面向对象的设计方法用对象描述事物,而每个具体的对象又可以用两个特征来描述:描述事物静态属性所需的数据结构以及对这些数据进行的有限操作。也就是说,把数据结构和对数据的操作放在一起构成一个整体,才能完整地反应实际问题。数据结构和对数据的操作实际上是相互以来不可分割的整体。

    面向对象程序设计具有抽象、封装、集成和多态4个特点。抽象去掉了被研究对象中与主旨无关的次要部分,而仅仅抽取出与研究工作有关的实质性的内容加以考虑。抽象有两类:一类是过程抽象,另一类是数据抽象。

    面向对象程序设计强调数据抽象,数据抽象把系统总需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含数据,又包含针对这些数据的操作,是相对于过程抽象更为严格的抽象方法。

 

封装

    封装就是利用抽象数据类型把数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过数据的操作,才能够于这个抽象数据类型进行交互,封装包含两层含义。

    第一,把对象的全部属性及其行为结合在一起,形成一个不可分割的独立单位(即对象)。

    第二,信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口,使之与外部发生联系。

    封装的原则在软件上的反应是:对象以外的部分不能随意存取对象的内部数据(属性),从而有效地避免了外部错误对他的“交叉感染”,使软件错误能够局部化,大大减少查错和排错难度。

   在面向对象的程序设计中,抽象数据类型是用“类”这种面向对象工具表示的,每个类里都防撞了相关的数据和操作。封装性降低了程序开发过程的复杂性,提高了效率和质量,保证了数据的完整性和安全性。同时,封装性提高了抽象数据类型的可重用性,使抽象数据类型称为一个结构完整、能够自行管理的有机整体。

 

    把众多的事物归纳、划分成一些类,是人类在认识客观世界时经常采用的思维方法。分类的原则是抽象。类是一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位行为。类的实例化结果就是对象,而对一类对象的抽象就是类。

    类的定义

    类是JAVA的核心和本质,想要在JAVA程序中实现的每个概念,都必须封装自爱类中。类是具有共同属性和行为的对象的抽象,属性描述了对象的状态,以数据的形式存在,在JAVA面向对象程序设计中又贝称为变量。行为描述了对数据进行的操作,可引起对象状态的改变。在JAVA面向对象程序设计中贝称为方法。

    JAVA中类的实现包括两个部分:类头和类体。类头定义的格式如下:

 [类定义修饰符] class <类名> [extends <父类名>] [implements <接口列表>]

    类的定义主要包括关键词 class 和类名。类名是JAVA语言合法的标识符,类名一般具有一定的含义。其中,CLASS为定义类的关键字,extends是用于继承的关键字,implements是用于实现接口的关键字,有关类的修饰符后面将详细阐述。

    类体是类的主体部分,它包含了所有实现类功能的JAVA语言程序代码,包括成员变量和成员方法。JAVA类除了继承它的父类中的变量和方法外,一般仍会在类体中明确定义自己的变量和方法。程序中,变量说明应放在定义之前。类体要用{}括起来。类体的格式如下:

class <类名>{

     [变量修饰符] <变量内省> <变量名>

     [方法修饰符] <方法返回值类型> <方法名>([<参数列表>]){

          方法体

     }

}

 

    其中,变量名是JAVA语言中的合法标识符,变量的类型可以是JAVA给定的任意数据类型或者用户自定义类。用于说明变量和方法的访问权限等属性。

 

一个简单的学生类:

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

//学生类的定义

import java.io.*; //加载系统输入输出类

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("这是一个学生类的定义!");

     }

}// Student 类结束

 

    //代表JAV语言中的单行注释。

    /*   */ 之间的部分是多行注释。

   

类的修饰符

    类的修饰符说明类的性质和访问权限,分为访问控制符和非访问控制符,包括

 public 、protected 、 private 、abstract  和 final 。

    1. public , protected 和 private

    public , protected 和 private 说明类的访问权限,属于访问控制符。

    用public修饰的类,不仅能贝同一包中其他类访问,还能贝包之外的类和对象使用。

    protected 修饰的类为保护类,可贝同包类和异包子类访问。

    private 修饰符的类为似有类,外界无法访问。

 

    共有类的定义。

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

//共有类的定义

import java.io.*; //加载系统输入输出类

public class TestPublic

{

     /*每个类的main()方法是该程序的入口,而包含main方法的类是程序的主类。

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

     public static void main(String args[])

     {

          System.out.println("这是一个共有类");

     }

}

    下面定义一个名为TestProtectedAndPrivate的类来测试保护类和似有类。

保护类和似有类的定义:

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

//保护类和似有类的定义

import java.io.*;  //加载系统输入输出类

public class TestProtectedAndPrivate{

     //主方法

     public static void main(String args[]){

          //分别创建保护类和似有类的对象t1和t2

          TestProtected t1 = new TestProtected();

          TestPrivate t2 = new TestPrivate();

 

          //打印输出两行字符

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

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

     }

     protected static class TestProtected     //保护类

     {

          public String toString(){

               return "保护类的定义:作为潜逃类的内部类";

          }

     }

     private static class TestPrivate      //似有类

     {

          public string toString(){

               return "私有类的定义:作为嵌套类的内部类";

          }

     }

}     // TestProtectedAndPrivate 类结束

 

 

aabstract

    abstract 说明一个类为抽象类,所谓抽象类是指不能直接实例化对象的类。如果一个抽象类贝说明了,则这个类中将包括一个或几个抽象方法。所谓抽象方法是指该方法只有方法说明却没有方法体,即没有具体实现的代码。抽象类本身不具备实际功能,它只用于衍生子类。定义抽象类和抽象方法的目的是建立抽象模型。抽象类中不一定包含抽象方法,但一旦某个类中说明了抽象方法,该类必须说明为抽象类。

 

不包含抽象方法的抽象类的定义。

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

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

import java.io.*; //加载系统输入输出类

public abstract class TestAbstract{

     //该类不包含抽象方法

 

     //主方法

     public static void main(String args]){

          //打印输出两行字符

          System.out.println("这是一个不包含抽象方法的抽象类!");

          System.out.println("抽象类不能创建对象!");

     }

} // TestAbstract 类结束

 

包含抽象方法的抽象类的定义。

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

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

     import java.io.*; //加载系统输入输出类

     public abstract class Mankind{

          //定义4个抽象方法

          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("这是一个包含抽象方法的抽象类");

               System.out.println("抽象方法没有方法体");

          }

     }//  Mankind 类结束

 

 

final

     final 修饰的类又称为最终类,是指该类不能被继承,不能再有子类。它的目的是为了避免盲目继承。一个final类无法贝继承,意味着此类在一个继承树中是一个叶子类,并且此类的设计已贝认为很具体而不需要进行修改或扩展。对于final类中的成员变量,可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final类型。也可以明确地给final类中的方法加上一个final关键字。下面定义一个名为TestFinal的最终类。

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

//最终类的定义

import java.io.*; //加载系统输入输出类

public final class TestFinal

{

     //主方法

     public static void main(String args[]){

          //打印输出一行字符

          System.out.println("这是一个最终类,不能被继承");

     }

}//TestFinal类结束

 

因为抽象类的目的就是为了被继承,而最终类的目的是不让其贝继承,所以一个类是不能用 abstract 和 final 同时修饰的。

 

 

 

对象

    对象是具有某些特俗属性(数据)和行为方式(操作)的实体。对象可以是有生命的个体,比如一个人或一只老虎;还可以是无生命的个体,比如一辆汽车或一台计算机;也可以是一个抽象的概念,如天气的变化或鼠标产生的事件。对象有两个特征:属性(property)和行为(Behavior)。例如,一个人的属性有姓名、性别、年龄、身高、体重等;行为有唱歌、打球、骑车和学习等。

    类是一个抽象的概念,而对象是一个具体的概念,是类实例化的结果。对象通过消息传递来进行交互。消息传递即激活指定的某个对象的方法以改变其状态或让它产生一定的行为。

 

对象的生命与引用

    同基本内置类型一样,为了声明对象,首先必须写出类型名,然后写出该类型的所有变量的名字,中间用逗号隔开。下面举例说明怎样生命一个类的对象:

Student s1, s2, s3;

    上面的生命表示s1\s2\s3是 Student 类型的引用变量,可以用来引用Student型的对象。引用变量的值将对应一个内存地址,这个地址标识的空间用来存放一个Student对象。

    声明对象的引用变量,并不等于创建对象,当然更没有为对象分配存储空间。这些需要通过 new 关键词和对引用变量的赋值才能实现。

 

创建对象与定义构造方法

    在JAVA语言中,一个JAVA对象是类的一个实力,创建对象的过程是对类的实例化过程,实例化对象就是创建一个对象。实例化对象意味着给对象分配必要的存储空间,用来保存对象的变量和方法大妈。new 运算符用于创建一个类的实例并返回对象的引用,即用来实现对象的实例化。一般格式为:

<类名>   <对象名>  =   new  <类名>(<参数列表>);

    创建对象与生命基本数据类型的变量相似,首先说明新建对象所属的类名,然后说明该对象名,赋值号左边的NEW 关键字是用于为新建对象开辟内存空间的运算符。与变量相比,对象占用的内存空间要大得多,因为对象既包含变量又包含方法,多数情况下,变量与方法还不止一个。例如前面定义的学生类 Strdent,假设有一个对象s1,则它就有3个属性和2个方法: s1.name  ,s1.sex,  s1.number, s1.setValue(),  s1.getNumber() 。这些变量和方法保存在一块内存中,这块内存就是对象s1 所占用的内存。如果在新建另一个 Strdent类的对象 s2,则s2对象将在内存中拥有自己的与s1对象不同的位置相同大小的内存空间。

    创建对象的同时要调用这个对象的构造方法完成对象的初始化工作,JAVA语言中每一个类都有构造方法,该方法是一种特殊的方法,其特殊性主要体现在以下几个方面。

(1) 构造方法的名称与类的名称相同。

(2) 构造方法不返回任何数据类型,也就没有返回值。

(3) 构造方法的修饰符只能是访问修饰符,即 public ,private,protected 中的任一个。

(4) 构造方法只能由 new 运算符调用,一般不能由编程人员显式地直接调用。

(5) 构造方法不能从父类中继承。而在构造方法中可以调用但前父类和其父类的另一个构造方法,调用语句必须是构造方法的第一条语句。使用当前类的构造方法用this来引用,使用其父类的构造方法用 super 来引用,在构造方法的实现中,可以进行方法的重载。

    下面定义一个 Student 类,该类具有两个构造方法,方法的名称都是 Student,与类名相同。

 

public class Student{

     //成员变量

     private String name;

     private String sex;

     private int number;

     

     //成员方法

     Student()     //构造方法

     {

          name = "NO name";

          sex = "unknown";

          number = 0;

     }

     Student(String a, String b, int c)//构造方法

     {

          name = a;

          sex = b;

          number = c;

     }

}// Student 类结束

 

构造方法的重载。

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

//构造方法的重载

import java.io.*; //加载系统输入输出类

class Constructor{

     //成员变量

     private int x;

     private double y;

 

     //没有参数的构造方法

     Constructor()

     {

          x = 0;

          y = 0.0;

     }

     

     //一个参数的构造方法

     Constructor(int x){

          this.x = x; //使用 this 关键字标识成员变量,以区别于同名参数

     }

 

     //一个参数的构造方法,参数类型于前一个构造方法不同

     Constructor(double y){

          this.y = y;

     }

 

     //两个参数的构造方法

     Constructor(int x, double y){

          this.x = x;

          this.y = y;

     }

 

     // print() 方法显示成员变量

     void print()

     {

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

     }

}    // Constructor 类结束

 

 

 

// ConstructorTest 类

public class TestConstructor

{

     //主方法

     public static void main(String args[]){

          //创建 Constructor 类的对象 c1 c2 c3 c4 分别使用了不同的构造方法

          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 类结束



对象的使用
    通过运算符“.”可以实现对对象中成员变量的访问和成员方法的调用。可以通过设定成员变量和成员方法访问权限来限制对它的访问。
    调用对象的成员变量的一般格式为:
<对象名>.<成员变量名>
    其中,对象名是一个已生成的对象,也可以是能生成对象的表达式。

例如:
    s1.name = "李明";
    int num = new Student().number;
    调用对象的成员方法的一般格式为:
        <对象名>.<成员方法名>([<参数列表>])
    其中,参数列表是可选项。在进行对象的方法引用时,方法中参数的个数、参数的数据类型与原方法中定义的要一致,否则编译器会出错。

对象的使用示例。
//**************  Student2.java ***************
//对象的使用
import java.ioo.*;
public class Student2{
    private String name;    //姓名
    private String sex;       //性别
    private int number;      //学号

    Student2()                  //无参构造方法
    {
        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("对象的使用");
        System.out.println("-------------------------");
        System.out.println("第一个学习的姓名:"+s1.getName());
        System.out.println("第一个学生的性别:"+s1.getSex());
        System.out.println("第一个学生的学号:"+s1.getNumber());
        System.out.println("-------------------------");
        System.out.pringln("第二个学生的姓名:"+s2.getName());
        System.out.println("第二个学生的性别:"+s2.getSex());
        System.out.println("第二个学生的学号:"+s2.getNumber());
    }
} // Student2 类结束

    在定义一个类时,类中的成员变量也可以是一个类,例2-9中包含2个类:Data类和Person类,Person类的成员变量birth为Data类型。

//*************  Person.java **************
//对象作为类的成员变量
import java.io.*;
public class Date
{
    int year;
    int month;
    int day;
    Date(int year, int month, int day){
        this.year = year;    //用关键字this标识类成员变量,一面与同名参数混淆
        this.month = month;
        this.day = day;
    }
    void showDate(){
        System.out.println(year+","+month+","+day);
    }
}//Date类结束

public class Person
{
    private String name;
    private String sex;
    private Date birth;    //对象作为类的成员变量,默认初始值为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 类结束

finalize() 是销毁一个对象用的



成员变量

    成员变量是类和对象的数据属性,其本身也有一些修饰符:访问控制符 public private protected 以及非访问控制符  static final transient volatile.这里主要探讨常用的static 和final这两个非访问控制符。

静态变量
    使用关键字static 生命的成员变量称为静态变量。静态变量也称类变量(class variable),它与类关联,由类钟的所有对象共享。无论生成多少个这种类的对象,静态变量都只有一份,并且即使没有生成任何对象,这种变量也存在。静态变量之所以称为类变量,是因为这种变量是属于相应类的,而不是属于特定对象的,他们在该类的全部对象中共享。静态变量可以由任何该类的对象和类引用,当某个对象修改了静态变量的值后,其他对象在访问静态变量时,取得的将是改变后的新值。
    相对地,没有用static修饰的普通成员变量称为实例变量(instance variable)。在类中,实例变量与每个对象都唯一关联,每个类的对象将拥有自己的一份实例变量的复制,并且赋予他自己的值。实例变量使一个对象与其他对象相互区别,使对象具有自己的个性。
    下面定义一个学生 Student 类,其中包含2个静态变量和3个实例变量。

public class Student
{
    static String school = "黑龙江科技学院";
    static String classNumber;

    //实例变量
    String name;
    string sex;
    int number;
    
    Student(){
        name = "No name";
        sex = "unknown";
        number = 0;
    }
    Strdent (String a,String b, int c)    //构造方法
    {
        name = a;
        sex = b;
        number = c;
    }
}//Student类结束


最终变量
    使用关键字final声明的成员变量称为最终变量,更确切地说是常量。只不过为他们取了一个类似变量的标识符名字。用final修饰符声明常量时,需要说明常量的数据类型并要初始化具体的数值。另外,因为所有类对象的常量数据成员数值都一样,为了节省内存控件,常量通常声明为static。 例如下面球体类中的常量PI:

public class Sphere
{
    //常量
    static final double PI = 3.14;
    //变量
    double xCenter;
    double yCenter;
    double zCenter;
    double radius;
}// Sphere 类结束


成员方法
    成员方法是类的行为,标志着类所具有的功能,是对类中成员变量的操作。JAVA中方法的一般格式如下:
[方法修饰符] [返回值类型] <方法名> ([<形式参数列表>]) [throws <异常列表>]
{
    <方法体>
}
    成员方法是具有相对独立性的功能模块,是一个类与外界进行通信的接口。成员方法也有一些修饰符:访问修饰符public private procected 和非访问控制符 static abstract final native synchronized 下面分别探讨这几个非访问控制符

静态方法
    使用那个关键字static声明的成员方法称为静态方法。静态方法也称为类方法(class method),它与类关联,是属于整个类的,即使类中一个对象也不存在,也可以执行该类的类方法。正式因为在没有对象存在的情况下也可以执行类方法,因此它只能调用类变量,即静态方法只能处理静态变量,而不能处理类中的实例变量。很明显,实例变量是属于某个特定对象的,如果对象不存在,实例变量也就不存在,这时用类方法去操纵和处理一个可能不存在的变量肯定会出问题。实际上,JAVA编译器根本就不允许做这样的尝试。如果在一个类方法中引用了一个实例变量,系统将拒绝编译,从而出现出错信息。
    相对地,未用static 修饰的普通成员方法称为实例方法(instance method)。实例方法只能针对特定的对象执行,因此如果任何对象都不存在,也就没有可以执行的实例方法。

静态方法实例:
//************** StaticFunction.java ***************
//静态方法
import java.io.*;    //加载系统输入输出类
public class StaticFunction
{
    static int classVariable;      //静态变量,即类变量
    int instanceVariable;            //非静态变量,即实例变量

    // setClassVariable()方法为静态方法,即类方法
    static void setClassVariable(int i){
        //this.classvar = i; 不能使用this
        classvariable = i;
        //instanceVar=i; 不能访问实例变量
    }
    void setInstanceVar(int i){
        instanceVariable = i;
        classvariable = i;
    }
    //MAIN方法也为静态方法
    public static void main(String a[]){
        StaticFunction sf = new StaticFunction();
        /*
            下面的语句不合法,main()方法是类方法,不能在类方法中直接调用实例方法
            setInseranceVariable(58);
        */
        sf.setInstanceVariable(58);//在类方法中只能通过实例对象访问实例方法
        sf.setInstanceVariable(58);
        setInstanceVariable(58);
        StaticFunction.setClassVariable(55);
        System.out.println("静态方法中不能直接调用实例方法,只能通过对象访问实例方法");
    }
}

抽象方法
    使用关键字abstract声明的成员方法称为抽象方法。抽象方法只有方法头,没有方法体。抽象方法的声明以一个分号结束。

抽象方法示例。
//***************  AbstractFunction.java**************
//抽象方法
import java.io.*;
abstract class Mankind
{
    protected String type;                    //保护数据成员用于继承
    public abstract void closing();        //抽象方法
    public abstract void food();                    //抽象方法
    public abstract void shelter();                //抽象方法
    public abstract void transportation();    //抽象方法
    
    public String toString(){
        return "这是一个"+type;
    }
}//Mankind类结束

abstract class people extends Mankind
{
    //重写Mankind类的抽象方法colsing()
    public void closing(){
        System.out.println("学会穿衣了!");
    }

    //重写Mankind类的抽象方法food()
    public void food(){
        System.out.println("学会吃饭了");
    }
}//People 类结束

class Person extends People{
    //重写People类的抽象方法shelter()
    public void shelter(){
        System.out.println("盖房子用来居住");
    }

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

    //构造方法
    public Person(String aType){
        type = new String(aType);
    }
}// Person类结束

public class AbstractFunction{
    //AbstractFunction类的主方法
    public static void main(String args[]){
        System.out.println("不能创建抽象类Mankind和People的对象!");
        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 类结束


最终方法
    使用关键字final声明的成员方法称为最终方法。最终方法的功能和内部语句不能在被更改,也就是说该方法不能贝当前类的子类重新定义。最终方法使得子类不能重新定义与父类同名的方法,而只能使用从负累继承来的方法,从而防止了子类对父类一些方法的错误定义,保证了程序的安全性和正确性。


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

posted @ 2008-08-01 20:49 程序手记 阅读(2094) | 评论 (4)编辑 收藏

JAVA基础(JAVA 执行环境) 第一天

JAVA程序有3中执行环境。

(1)能够单独运行的程序,称为Java Application(Java应用程序)。

(2)在Internet浏览器中运行的程序,称为 Java Applet(JAVA小用用程序)。Applet是一个在WEB浏览器内部运行的小应用程序,需要WEB浏览器的支持。

(3)在WEB服务器端运行的程序,称为Java Servlet。Servlet实际上是运行在WEB服务器上的应用程序,它与协议和平台无关。Java Servlet可以动态地扩张WEB服务器的能力,并采用轻轻偶/想用模式提供WEB服务。目前SUN公司开发的JSP技术,JSP是JAVA SERVER PAGE的所写,悦来越得到广泛的应用。Java Servlet可以与JSP进行交互,从而为开发WEB服务提供优秀的解决方案。

posted @ 2008-08-01 20:48 程序手记 阅读(1136) | 评论 (0)编辑 收藏

J2SE基础(JAVA的常用包) 第一天

JAVA提供了强大的应用程序接口,既JAVA类库。他包含大量已经设计好的工具类,帮助程序员进行字符串处理、绘图、数学计算和网络应用等方面的工作。下面简单介绍JAVA核心类库中常用的组建包。

1.java.lang包

    在所有的JAVA API类库中,JAVA.LANG包是最重要的,它提供了JAVA语言的核心类库,包含了运行JAVA程序必不可少的系统类,如:基本数据类型、基本数学函数、字符串处理、线程管理和异常处理类等。运行JAVA程序时,系统会自动加载JAVA.LANG包,既这个包的加载是默认的。

2.java.io包

    JAVA.IO包提供了一系列用来读写文件或其他的输入输出流。其中有基本输入/输出类、缓存流类、比特数组玉字符串流类、数据流类、文件流类、管道类、流连接类和异常类等。

3.java.util包

    java.util包提供了JAVA语言中的一些低级的实用工具,如数据结构类、日期类、随机数类、属性类、观测类和异常类等。

4.java.awt包

    java.awt包是JAVA语言用来构建图形用户界面(GUI)的类库,包括许多界面元素和资源。JAVA.AWT包提供JAVA语言中的图形类、组成类、容器类、排列类、几何类、事件类和工具类等。

5.java.net包

    JAVA.NET包包含一些玉网络相关的类和接口,以方便应用程序在网络上传输信息。如主机名解析类、实现套接字通信的Socket类和ServerSocket类、资源定位器(URL)类等。

6.java.applet包

    java.applet包是用来实现运行于Internet浏览器中的JAVA APPLET的工具类库。它包含于产生Applet的类和用于Applet通信的类。Applet类称为小应用程序类,通常所说的Applet程序必须集成该类,Applet是一种专门化的面板,需要潜入到HTML网页中,由与JAVA语言兼容的浏览器执行。

7.JAVA.AWT.EVENT包

    java.awt.event包是对JDK 1.0版本中原有的Event类的一个扩充,它使得程序可以用不同的方式来处理不同类型的事件,该包中定义了许多不同类型的事件监听器类,使每个图形界面元素本身可以处理它上面的事件。

    除了上述的常用JAVA组件包外,JAVA类库中还有很多实用的组件包,并且还在不断地扩充,请查看相关的JAVA文档。

posted @ 2008-08-01 20:47 程序手记 阅读(2121) | 评论 (5)编辑 收藏