java学习-3

来源:互联网 发布:c语言输出hello world 编辑:程序博客网 时间:2024/04/29 21:17
对象的串行化(Serialization)

串行化的定义

    1. 什么是串行化

   对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以 便将来再生的能力,叫做对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化 (Serialization)。

   2. 串行化的目的

  串行化的目的是为java的运行环境提供一组特性,其主要任务是写出对象实例变量的数值。

 串行化方法

  在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。

 1. 定义一个可串行化对象

  public class Student implements Serializable{
    int id; //学号
    String name; //姓名
    int age; //年龄
    String department //系别
    public Student(int id,String name,int age,String department){
     this.id = id;
     this.name = name;
     this.age = age;
     this.department = department;
    }
  }

 2. 构造对象的输入/输出流

  要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。

   java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。在 ObjectInputStream中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用 writeObject()方法可以直接将对象保存到输出流中。

  Student stu=new Student(981036,"Liu Ming",18, "CSD");
  FileOutputStream fo=new FileOutputStream("data.ser");
  //保存对象的状态
  ObjectOutputStream so=new ObjectOutputStream(fo);
  try{
    so.writeObject(stu);
    so.close();
    }catch(IOException e )
      {System.out.println(e);}
  FileInputStream fi=new FileInputStream("data.ser");
  ObjectInputStream si=new ObjectInputStream(fi);
  //恢复对象的状态
  try{
    stu=(Student)si.readObject();
    si.close();
    }catch(IOException e )
  {System.out.println(e);}

  
在 这个例子中,我们首先定义一个类Student,实现了 Serializable接口,然后通过对象输出流的writeObject()方法将Student对象保存到文件data.ser中。之后,通过对象 输入流的readObject()方法从文件data.ser中读出保存下来的Student对象。

 串行化的注意事项

 1.串行化能保存的元素

  只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。

 2.transient关键字
 
  对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如
一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明

 3. 定制串行化

   缺省的串行化机制,对象串行化首先写入类数据和类字段的信息,然后按照名称的上升排列顺序写入其数值。如果想自己明确地控制这些数值的写入顺序和写入种 类,必须定义自己的读取数据流的方式。就是在类的定义中重写writeObject()和readObject()方法。

  例如可在4.8.2的例子中,加入重写的writeObject()和readObject()方法,对Student 类定制其串行化。

  private void writeObject(ObjectOutputStream out)throws IOException
  {
    out.writeInt(id);
    out.writeInt(age);
    out.writeUTF(name);
    out.writeUTF(department);
  }
  private void readObject(ObjectInputStream in)throws IOException
  {
    id=in.readInt();
    age=in.readInt();
    name=in.readUTF();
    department=in.readUTF();
  }

 

AWT图形用户界面设计

抽象窗口工具包AWT (Abstract Window Toolkit) 是 API为Java程序提供的建立图形用户界面GUI (Graphics User Interface)工具集,AWT可用于Java的applet和applications中。
java.awt包

 
  java.awt包中提供了GUI设计所使用的类和接口
  java.awt包提供了基本的java程序的GUI设计工具。主要包括下述三个概念:

  组件--Component
  容器--Container
  布局管理器--LayoutManager

 组件和容器

  Java的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。

  类 java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景 色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括:

   
getComponentAt(int x, int y)
   getFont()
   getForeground()
   getName()
   getSize()
   paint(Graphics g)
   repaint()
   update()
   setVisible(boolean b)
   setSize(Dimension d)
   setName(String name)等
  
  容器(Container)也是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。

  布局管理器(LayoutManager):每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。

  为了使我们生成的图形用户界面具有良好的平台无关性,java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。

  在程序中安排组件的位置和大小时,应该注意以下两点:
  1.容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java语言提供的setLocation(),setSize(),setBounds() 等方法,则都会被布局管理器覆盖。

  2.如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:
   setLayout(null);

 常用容器

  容器java.awt.Container是Component的子类,一个容器可以容纳多个组件,并使它们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面。所有的容器都可以通过add()方法向容器中添加组件。

  有三种类型的容器:Window、Panel、ScrollPane,常用的有Panel, Frame, Applet。

 

以下是容器的例子:


  import java.awt.*;
  public class MyFrame extends Frame{
  public static void main(String args[ ]){
        MyFrame fr = new MyFrame("Hello Out There!");

                       //构造方法
        fr.setSize(200,200);
                //设置Frame的大小,缺省为(0,0)
        fr.setBackground(Color.red);
                //设置Frame的背景,缺省为红色
        fr.setVisible(true);
                //设置Frame为可见,缺省为不可见
  }
     public MyFrame (String str){
        super(str); //调用父类的构造方法
     }
  }
 
 
 
 一般我们要生成一个窗口,通 常是用Window的子类Frame来进行实例化,而不是直接用到Window类。Frame的外观就像我们平常在windows系统下见到的窗口,有标 题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize( )来设置大小,调用setVisible(true)来设置该窗口为可见的。

  另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的。例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。


  import java.awt.*;
  public class FrameWithPanel extends Frame{
  public FrameWithPanel(String str){
        super(str);
      }

      public static void main(String args[]){
        FrameWithPanel fr = new FrameWithPanel("Frame with Panel");
        Panel pan=new Panel();
        fr.setSize(200,200);
        fr.setBackground(Color.red);

               //框架fr的背景颜色设置为红色
        fr.setLayout(null);
               //取消布局管理器
        pan.setSize(100,100);
        pan.setBackground(Color.yellow);

               //设置面板pan的背景颜色为黄色
        fr.add(pan); //用add方法把面板pan添加到框架fr中
        fr.setVisible(true);
        }
   }

j2me j2se j2ee
 
多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用。
Java2平台包括标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本:
Standard Edition(标准版) J2SE 包含那些构成Java语言核心的类。
比如:数据库连接、接口定义、输入/输出、网络编程
Enterprise Edition(企业版) J2EE 包含J2SE 中的类,并且还包含用于开发企业级应用的类。
比如:EJB、servlet、JSP、XML、事务控制
Micro Edition(微缩版) J2ME 包含J2SE中一部分类,用于消费类电子产品的软件开发。
比如:呼机、智能卡、手机、PDA、机顶盒

他们的范围是:J2SE包含于J2EE中,J2ME包含了J2SE的核心类,但新添加了一些专有类

应用场合,API的覆盖范围各不相同。
笼统的讲,可以这样理解:
J2SE是基础;
压缩一点,再增加一些CLDC等方面的特性就是J2ME;
扩充一点,再增加一些EJB等企业应用方面的特性就是J2EE。

补充一点J2EE更恰当的说,应该是JAVA2企业开发的技术规范,不仅仅是比标准版多了一些类。
 
 
J2SE,J2ME和J2EE,这也就是SunONE(Open NetEnvironment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA 的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。J2SE开发桌面应用软件比起VC,VB, DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。所以现在应用最广泛又最好 学的就是J2EE了。J2EE又包括许多组件,如Jsp, Servlet, JavaBean, EJB, JDBC, JavaMail等。
 
原创粉丝点击