本文主要是介绍对象的保存和载入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
static http://t240178168.iteye.com/blog/1667275
1.第一种方法:采用手动的方法
手动的将对象的各个字段写入到文件中,读取时再通过特定的标识符从文件中获取各个属性的值,生成对象。可以手工编辑文件
缺点:缺乏灵活性,代码量大
实现:略
2.第二种方法:采用Java的序列化机制
实现简洁,代码量小,生成的文件都是二进制的
缺点:文件不可编辑
实现:略
3.第三种方法:以XML文件的形式保存和读取(方法很多,以下使用两种方式简单实现)
①采用 java.beans.XMLEncoder 或者 java.beans.XMLDecoder
首先建立 Contact.java (JavaBean)
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;/**
* @Author:胡家威
* @CreateTime:2011-9-27 下午09:28:57
* @Description:联系人的类
*/@XmlRootElement //注意注解,XML的根元素
public class Contact implements Serializable {private static final long serialVersionUID = 4445549905840681824L;private long id;private String name;private String email;public Contact() {}public Contact(long id){this.id = id;}//每个getter方法上面都有一个注解,表明它是一个XML的元素@XmlElementpublic long getId(){return id;}@XmlElementpublic String getName() {return name;}@XmlElementpublic String getEmail() {return email;}public void setName(String name) {this.name = name;}public void setEmail(String email) {this.email = email;}public void setId(long id) {this.id = id;}}
建立测试的类:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;/**
* @Author:胡家威
* @CreateTime:2011-9-27 下午09:27:55
* @Description:JAXB的简单使用实例
*/public class JaxbTest {private Marshaller marshaller;private Unmarshaller unmarshaller;private String filename;public JaxbTest() {try {JAXBContext context = JAXBContext.newInstance(Contact.class);marshaller = context.createMarshaller();unmarshaller = context.createUnmarshaller(); filename="contact.xml";} catch (Exception e) {e.printStackTrace();}}// 创建一个新的联系人public void creatContact(Contact contact) {FileWriter fw = null;try {fw = new FileWriter(filename);marshaller.marshal(contact, fw);} catch (Exception e) {e.printStackTrace();} finally{try {fw.close();} catch (IOException e) {e.printStackTrace();}}}// 读取一个联系人public Contact readContact() {FileReader fr = null;Contact contact = null;try {fr = new FileReader(new File(filename));contact = (Contact)unmarshaller.unmarshal(fr);} catch (Exception e) {e.printStackTrace();} finally{try {fr.close();} catch (IOException e) {e.printStackTrace();}}return contact;}public static void main(String[] args) {JaxbTest test = new JaxbTest();Contact contact = new Contact();contact.setId(1);contact.setName("name");contact.setEmail("email");test.creatContact(contact);System.out.println("---");Contact contact2 = test.readContact();if(contact2!=null){System.out.println(contact2.getId());System.out.println(contact2.getName());System.out.println(contact2.getEmail());}}}
生成的xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contact><email>email</email><id>1</id><name>name</name>
</contact>
②采用JAXB
Javabean使用上面的Contact类
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;/**
* @Author:胡家威
* @CreateTime:2011-9-27 下午10:20:20
* @Description:XMLEncoder和XMLDecoder的使用实例
*/public class XMLEDncoder {private static String filename = "javabean.txt";public static void main(String[] args) {Contact contact = new Contact();contact.setId(1);contact.setName("name");contact.setEmail("email");writeJavaBean(contact);System.out.println("---");Contact contact2 = (Contact)readJavaBean();if(contact2!=null){System.out.println(contact2.getId());System.out.println(contact2.getName());System.out.println(contact2.getEmail());}}/**
* 向文件中写入对象
*/public static void writeJavaBean(Object javabean) {if(javabean==null){return;}try {OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(filename)));XMLEncoder encoder = new XMLEncoder(out);encoder.writeObject(javabean);encoder.close();out.close();} catch (Exception e) {e.printStackTrace();}}/**
* 从文件中读取对象
*/public static Object readJavaBean() {try {InputStream in = new BufferedInputStream(new FileInputStream(new File(filename)));XMLDecoder decoder = new XMLDecoder(in);Object object = decoder.readObject();in.close();decoder.close();return object;} catch (Exception e) {e.printStackTrace();return null;}}}
生成的txt文件:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_21" class="java.beans.XMLDecoder"> <object class="Contact"> <void property="email"> <string>email</string> </void> <void property="id"> <long>1</long> </void> <void property="name"> <string>name</string> </void> </object>
</java>
static
- 博客分类:
- java
在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制),例如:
未声明为static
class ClassA{
int b;
public void ex1(){
…
}
}
class ClassB{
void ex2{
int i;
ClassA a = new ClassA();
i = a.b; //这里通过对象引用访问成员变量b
a.ex1; //这里通过对象引用访问成员函数ex1
}
}
声明为static
class ClassA{
static int b;
static void ex1(){
…
}
}
class ClassB{
void ex2{
int i;
i = ClassA.b; //这里通过类名访问成员变量b
ClassA.ex1; //这里通过类名访问成员函数ex1
}
}
通过以上两种比较,就可以知道static用来修饰类成员的主要作用了
,在java类库当中有很多类成员都声明为static,可以让用户不需要
实例化对象就可以引用成员,最基本的有Integer.parseInt(),Float.pa
rseFloat()等等用来把对象转换为所需要的基本数据类型。这样的变量和
方法我们又叫做类变量和类方法。
接下来讲一下被static修饰后的变量的值的问题,刚才在前面讲过,被s
tatic修饰后的成员,在编译时由内存分配一块内存空间,直到程序停止运行
才会释放,那么就是说该类的所有对象都会共享这块内存空间,看一下下面
这个例子:
class TStatic{
static int i;
public TStatic(){
i = 4;
}
public TStatic(int j){
i = j;
}
public static void main(String args[]){
TStatic t = new TStatic(5); //声明对象引用,并实例化
TStatic tt = new TStatic(); //同上
System.out.println(t.i);
System.out.println(tt.i);
System.out.println(t.i);
}
}
,第一个用于初始化I为4,第二个用于初始化i为传进函数的值,
在main中所传的值是5,程序首先声明对象的引用t,然后调用带参
数的构造函数实例化对象,此时对象t的成员变量I的值为5,接着
声明对象tt,调用无参数的构造函数,那么就把对象tt的成员变量
i的值初始化为4了,注意了,在这里i是static,那就是说该类
所有对象都共享该内存,那也就是说在实例化对象tt的时候改变了
i的值,那么实际上对象t的i值也变了,因为实际上他们引用的
同一个成员变量。最后打印的结果是三个4。呵呵,写到这里大家
是否明白了呢?不明白就再看看书或者多写几个例子印证一下,
呵。
是这样的,static定义的变量是个所有该类对象共有的变量,那
么我们可以举个例子来说明,比如,我编写一个Student类,该类中有个
static变量count用来记录学生的个数,在构造方法中做count++。那么当
我每创建一个对象时count都会做自加,也就是每创建一个Student的对象系统
就会记录一个,那么很显然,我就可以调用这个count知道一共有多少Student对象
了。这个是个很简单的例子,不过应该可以说明问题了。
问题:雇员类有个雇员基本工资,对于员工A员工B都是一样的,但是管理员又有可能需要对这个工资做调整,也就是不能定义成常量.像这样的变量你要怎么处理呢?怎么保证这样的一致性?
于是static成员变量和成员方法就产生咯:
static int salary;
public static void setSalary(int salary){this.salary = salary;}
public static int getSalary(){return salary;}
这样的话我就直接用员工类.方法得到统一的基本工资值啦:
Employee.setSalary(800);
Employee.getSalary();
至于每个员工嘛,也可以调用这个方法查看自己的基本工资
Employee A = new Employee();
A.getSalary();
这篇关于对象的保存和载入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!