??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲婷婷国产精品电影人久久,亚洲人成影院在线,久久久久亚洲国产AV麻豆http://www.tkk7.com/blovesaga/category/11856.html在希腊帕纳斯山南坡?有一个驰名世界的戴尔波伊托所,在它的入口处的巨石上赫然锈刻着q样几个大字: 认识你自?zh-cnWed, 28 Feb 2007 05:33:45 GMTWed, 28 Feb 2007 05:33:45 GMT60Java Basic-Java I/O(?http://www.tkk7.com/blovesaga/archive/2006/06/11/52059.htmlblovesagablovesagaSun, 11 Jun 2006 13:27:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/11/52059.htmlhttp://www.tkk7.com/blovesaga/comments/52059.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/11/52059.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/52059.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/52059.html  ~码Q将一个Unicode码{换ؓ本地字符表示的过Eؓ~码?br />  解码Q将一个字节{换ؓ一个字W(用Unicode表示Q,q个q程叫解码?br />        [单的说去获取一个Unicode码就是解码]
 code:

import java.util.*;
import java.nio.charset.*;
class CharsetTest
{
 public static void main(String[] args)throws Exception
 {
  /*
  Map m=Charset.availableCharsets();
  Set names=m.keySet();
  Iterator it =names.iterator();
  while(it.hasNext())
  {
   System.out.println(it.next());
  }
  */
  Properties pps=System.getProperties();
  //pps.list(System.out);
  pps.put("file.encoding","ISO-8859-1");
  int data;
  byte[] buf=new byte[100];
  int i=0;
  while((data=System.in.read())!='q')
  {
   buf[i]=(byte)data;
   i++;
  }
  String str=new String(buf,0,i);
  //String strGBK=new String(str.getBytes("ISO-8859-1"),"GBK");
  //System.out.println(strGBK);
  System.out.println(str);
 }
}

 

     RandomAccessFile

  RandomAccessFilecd时实CDataInput和DataOutput接口Q提供了Ҏ(gu)仉机存取的功能Q?br />  利用q个cd以在文g的Q何位|读取或写入数据?br />  RandomAccessFilecL供了一个文件指针,用来标志要进行读写操作的下一位数据的位置?

 
 code:
import java.io.*;
class RandomFileTest
{
 public static void main(String[] args)throws Exception
 {
  Student s1 = new Student(1,"zhangsan",98.5);
  Student s2 = new Student(2,"lisi",90.5);
  Student s3 = new Student(3,"wangwu",78.5);
  
  RandomAccessFile rsf=new RandomAccessFile("student.txt","rw");  //存取模式rw
  s1.WriteStudent(rsf);
  s2.WriteStudent(rsf);
  s3.WriteStudent(rsf);
  
  Student s =new Student();
  rsf.seek(0); //把文件指针移到文仉
  for(long i=0;i<rsf.length();i=rsf.getFilePointer())
  {
   s.ReadStudent(rsf);
   System.out.println(s.num+":"+s.name+":"+s.score);
  }
  rsf.close();
 }
}

class Student
{
 int num;
 String name;
 double score;
 Student()
 {
  
 }
 Student(int num,String name,double score)
 {
  this.num=num;
  this.name=name;
  this.score=score;
 }
 public void WriteStudent(RandomAccessFile raf)throws Exception
 {
  raf.writeInt(num);
  raf.writeUTF(name);
  raf.writeDouble(score);
 }
 public void ReadStudent(RandomAccessFile raf)throws Exception
 {
  raf.readInt();
  raf.readUTF();
  raf.readDouble();  
 }
}


           对象序列?/p>

 .对象{换ؓ字节保存v来,q在日后q原q个对象Q这U机制叫做对象序列化?br /> .一个对象保存到怹存储讑֤上称为持l性?br /> .一个对象要惌够实现序列化Q必d现Serializable接口或Externalizable接口?br /> .当一个对象被序列化时Q只保存对象的非静态成员变量,不能保存M的成员变量和静态的
  成员变量?br /> .如果一个对象的成员变量是一个对象,那么q个对象的数据成员也会被保存?br /> .如果一个可序列化的对象包含Ҏ(gu)个不可序列化的对象的引用Q那么整个序列化操作会p|Q?br />  q且会抛Z个NotSerializableException。我们可以将q个引用标记为transient,那么对象
  仍然可以序列化?/p>

 code:
import java.io.*;
class ObjectSerialTest
{
 public static void main(String[] args)throws Exception
 {
  Employee e1 = new Employee("zhangsan",20,2800.50);
  Employee e2 = new Employee("lisi",22,25000.50);
  Employee e3 = new Employee("wangwu",23,12800.50);
  Employee e4 = new Employee("blovesaga",22,3800.50);
  
  FileOutputStream fos=new FileOutputStream("employee.txt");
  ObjectOutputStream oos=new ObjectOutputStream(fos);
  oos.writeObject(e1);
  oos.writeObject(e2);
  oos.writeObject(e3);
  oos.writeObject(e4);
  oos.close();
  
  FileInputStream fis = new FileInputStream("employee.txt");
  ObjectInputStream ois =new ObjectInputStream(fis);
  Employee e;
  for(int i=0;i<4;i++)
  {
   e=(Employee)ois.readObject();
   System.out.println(e.name+":"+e.age+":"+e.salary);
  }
  ois.close();
 }
}

class Employee implements Serializable
{
 String name;
 int age;
 double salary;
 transient Thread t1 =new Thread();
 Employee(String name,int age,double salary)
 {
  this.name=name;
  this.age=age;
  this.salary=salary;
 }
 //可以写private void readObject()Ҏ(gu)来控制我们自己想要实现的
 private void writeObject(java.io.ObjectOutputStream oos)throws Exception
 {
  //例如我们自己写想要显C的序和那些需要显C?br />  oos.writeInt(age);
  oos.writeUTF(name);
  System.out.println("Write Object");
 }
 private void readObject(java.io.ObjectInputStream ois)throws Exception
 {
  //按照写入的顺序来d
  age=ois.readInt();
  name=ois.readUTF();
  System.out.println("Read Object");
 }
}



blovesaga 2006-06-11 21:27 发表评论
]]>
基础学习?--Java I/O学习(一)http://www.tkk7.com/blovesaga/archive/2006/06/11/51984.htmlblovesagablovesagaSun, 11 Jun 2006 06:18:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/11/51984.htmlhttp://www.tkk7.com/blovesaga/comments/51984.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/11/51984.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/51984.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/51984.html               Filec?/p>

 一个Filecȝ对象Q表CZ盘上的文g或目录?br /> FilecL供了与^台无关的Ҏ(gu)来对盘上的文g或目录进行操作?/p>

import java.io.*;
class FileTest
{
 public static void main(String[] args) throws Exception
 {
  //File f = new File("1.txt");
  //f.createNewFile();   创徏文g
  //f.mkdir(); 创徏文g?br />  //File f = new File("F:\\Java Develop\\1.txt");//使用l对路径
  //f.createNewFile();
  /*
  *WINDOWSq_下有盘符QLINUX下是没有?br />  *考虑到JAVA语言的^台性,所有用分隔Wseperator/seperatorChar
  */
  /*
  File fDir = new File(File.separator);//创徏了当前的根目?br />  String strFile = "Java Develop"+File.separator+"1.txt";
  File f = new File(fDir,strFile);
  f.createNewFile();
  //f.delete();
  f.deleteOnExit();
  Thread.sleep(3000);
  */
  /*
  for(int i=0;i<5;i++)
  {
   File.createTempFile("linshi",".tmp");
   f.deleteOnExit();
  }
  Thread.sleep(3000);
  */
  
  File fDir = new File(File.separator);
  String strFile ="Java Develop"+File.separator;
  File f = new File(fDir,strFile);
  //文gqo?br />  String[] names = f.list(new FilenameFilter()
  {
   public boolean accept(File dir,String name)
   {
    return name.indexOf(".java")!=-1;
   }
  });
  for(int i=0;i<names.length;i++)
  {
   System.out.println(names[i]);
  }
 }
}

            式I/0

 ?Stream)是字节的源或目的?br /> 两种基本的流? 输入?Input Stream)和输出流(Output Stream)。从从中d一pd字节?br /> 对象UCؓ输入。而能向其中写入一pd字节的对象称出流?/p>


           的分类
 
 节点? 从特定的地方d的流c,例如Q磁盘或一块内存区域?br /> qo? 使用节点作ؓ输入或输出。过滤流使用的是一个已l存在的输入或输出连接创建的?br /> (如下?


         InputStream(一个抽象的基类)
 .三个基本的读写方?br />  abstract int read(): d一个字节数据,q返回到数据Q如果返?1Q表CC输入的
                       末尾?br />  int read(byte[] b):  数据读入一个字节数l,同时q回实际d的字节数。如果返?1Q?br />                       表示d了输入流的末?br />  int read(byte[] b,int off,int len): 数据读入一个字节数l,同时q回是实际读取的?br />                       节数。如果返?1Q表CC输入的末尾。off指定在数lb中存?br />                       数据的v始偏UM|;len指定d的最大字节数?br /> 其他的方?br />  long-skip(long n): 在输入流中蟩qn个字节,q返回实际蟩q的字节数?br />  int available():   q回在不发生d的情况下Q可d的字节数?br />  void close():      关闭输入,释放和这个流相关的系l资源?br />  void mark(int reqdlimit): 在输入流的当前位|放|一个标讎ͼ如果d的字节数多余
                     readlimit讄的|则流忽略q个标记?br />  void reset():      q回C一个标记?br />  boolean markSupported(): 试当前是否支持mark和resetҎ(gu)。如果支持返回trueQ反之false?/p>

         java.io包中的InputStream的类层次 (下图)

        OutputStream

 三个基本的写Ҏ(gu)
 abstract void write(int b): 往输出中写入一个字?br /> void write(byte[] b):       往输出中写入数组b中的所有字?br /> void writte(byte[] b,int off,int len): 往输出中写入数组b中从偏移量off开始的len?br />                             字节的数?br /> 其它Ҏ(gu)
 void flush(): h输出,强制~冲Z的输出字节被写出
 void close(): 关闭输出,释放和这个流相关的系l资?/p>

        java.io包中OutputStream的类层次(如下?



        基本的流c?/p>

 FileInputStream和FileOutputStream
 节点,用于从文件中d或往文g中写入字节流。如果在构造FileOutputStreamӞ文g已经
 存在Q则覆盖q个文g?br /> 
 BufferedInputStream和BufferedOutputStream
 qo,需要用已l存在的节点来构造,提供带缓冲的dQ提高了d的效率?/p>

 DataInputStream和DataOutputStream
 qo,需要用已l存在的节点来构?提供了读写Java中的基本数据cd的功能?/p>

 PipedInputStream和PipedOutputStream
 道,用于U程间的通信。一个线E的PipedInputStream对象从另一个线E的PipedOutputStream
 对象d输入。要使管道流有用Q必d时构造管道输入流和管道输出流?/p>

code:
import java.io.*;
class StreamTest
{
 public static void main(String[] args)throws Exception
 {
  /*
  int data;
  while((data=System.in.read())!=-1)  //从标准设备读取数?br />  {
   System.out.write(data);//从标准设备输出数?br />  }
  */
  //输出写数据,只需要关闭尾端的就可以了,因ؓfosq接Cbos
  FileOutputStream fos = new FileOutputStream("1.txt");
  //fos.write("());
  //fos.close();
  BufferedOutputStream bos = new BufferedOutputStream(fos);
  //bos.write("http//www.baidu.com".getBytes());
  //bos.flush();
  //bos.close();
  DataOutputStream dos=new DataOutputStream(bos); //q接Cbos和fis
  byte b=3;
  int i=78;
  char ch='a';
  float f=4.5f;
  dos.writeByte(b);
  dos.writeInt(i);
  dos.writeChar(ch);
  dos.writeFloat(f);
  dos.close(); //必须调用flush()或者close()不然不会写入盘
  
  //输入读数据
  FileInputStream fis=new FileInputStream("1.txt");
  BufferedInputStream bis = new BufferedInputStream(fis);
  //byte[] buf=new byte[100];
  //int len=fis.read(buf);
  //int len=bis.read(buf);
  //System.out.println(new String(buf,0,len));
  //fis.close();
  //bis.close();
  //注意d的顺序要和写的顺序一?br />  DataInputStream dis = new DataInputStream(bis);
  System.out.println(dis.readByte());
  System.out.println(dis.readInt());
  System.out.println(dis.readChar());
  System.out.println(dis.readFloat());
  dis.close();  
  
 }
}


道输入/输出?code:
import java.io.*;
class PipedStreamTest
{
 public static void main(String[] args)
 {
  PipedOutputStream pos=new PipedOutputStream();
  PipedInputStream pis=new PipedInputStream();
  //q接
  try
  {
   pos.connect(pis);
   new Producer(pos).start();
   new Consumer(pis).start();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
}

class Producer extends Thread
{
 private PipedOutputStream pos;
 public Producer(PipedOutputStream pos)
 {
  this.pos=pos;
 }
 public void run()
 {
  try
  {
   pos.write("hello,welcome!".getBytes());
   pos.close();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
}

class Consumer extends Thread
{
 private PipedInputStream pis;
 Consumer(PipedInputStream pis)
 {
  this.pis=pis;
 }
 public void run()
 {
  try
  {
   byte[] buf=new byte[100];
   int len=pis.read(buf);
   System.out.println(new String(buf,0,len));
   pis.close();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
}

=================================================================================
              Java I/O库的设计原则

 Java的I/O库提供了一个称做链接的机制Q可以将一个流与另一个流首尾相接QŞ成一个流道的链接?br /> q种机制实际上是一U被U做为Decorator(装饰)的设计模式的应用?br /> 
 通过的链接Q可以动态的增加的功能Q而这些功能的增加是通过l合一些流的基本功能而动
 态获取的?/p>

 我们要获取一个I/O对象Q往往需要生多个I/O对象Q这也是Java I/O库不大容易掌握的原因Q?br /> 但在I/O库中的Decorator模式的运用,l我们提供了实现上的灉|性?/p>

 I/O的链接?如下)



               Reader和Writer

 JavaE序语言使用Unicode来表C字W串和字W?br /> Reader和Writerq两个抽象类主要用来d字符?/p>

 java.io包中Reader的类层次(如下?

 java.io包中Writer的类层次(如下?


 code:
import java.io.*;
class StreamTest
{
 public static void main(String[] args)throws Exception
 {
  /*
  FileOutputStream fos = new FileOutputStream("1.txt");
  OutputStreamWriter osw = new OutputStreamWriter(fos); 
  BufferedWriter bw = new BufferedWriter(osw);
  
  bw.write("
  bw.close(); 
  
  FileInputStream fis = new FileInputStream("1.txt");
  InputStreamReader isr = new InputStreamReader(fis);
  BufferedReader br = new BufferedReader(isr);
  System.out.println(br.readLine());
  br.close();
  */
  //InputStreamReader/OutputStreamWriter是一个中间过度类,q接字符和字W串
  InputStreamReader isr = new InputStreamReader(System.in);
  BufferedReader br = new BufferedReader(isr);
  String strLine;
  while((strLine=br.readLine())!=null)
  {
   System.out.println(strLine);
  }
  br.close();
 }
}

            字符集的~码

 ASCII(American Standard Code for Information Interchange,国信息互换标准代码),是基
 于常用的英文字符的一套电(sh)脑编码系l。我们知道英文中l常使用的字W,数字W号被计机
 处理旉是以二进制编码的形式出现(bit)二进制数对应。其最高位?Q相应的十进制数?-127
 如,数字1Q有一些制表符和其他符L成。ASCII是现金最通用的单字节~码pȝ?/p>

 GB2312Q?GB2312码是中华人民共和国国家汉字信息交换用~码Q全U《信息交换用汉字~码?br /> W集-基本集》。主要用于给每一个中文字W指定相应的数字Q也是q行~码。一个中文字W?br /> 用两个字节的数字来表C,Z和ASCII码有所区别Q将中文字符每一个字节的最高位|都?
 来表C?/p>

 GBKQؓ了对更多的字W进行编码,国家又发布了新的~码pȝGBKQGBK的K是“扩展”的汉语
 拼音的第一个字母)。在新的~码pȝ里,除了完全兼容GB2312外,q对J体中文Q一些不常用
 的汉字和许多W号q行了编码?/p>

 ISO-8859-1Q是西方国家所使用的字W编码集Q是一U单字节的字W集Q而英文实际上只用了其
 中数字小?28的部分?/p>

 Unicode: q是一U通用的字W集Q对所有语a的文字进行统一~码Q对每一个字W都采用2个字?br /> 来表C,对于英文字符采取前面加?”字节的{略实现{长兼容。如"a"的ASCII码ؓ0x61,
 UNICODE׃ؓ0x00,0x61?/p>

 UTF-8: Elight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符?
 UCS是所有其他字W集标准的一个超?。一?位的ASCII码|对应的UTF码是一个字节,如果
 字符?x0000Q或?x0080?x007f之间Q对应的UTF码是两个字节Q如果字W在0x0800?xffff
 之间Q对应的UTF码是三个字节?br />



blovesaga 2006-06-11 14:18 发表评论
]]>
集合框架中的接口http://www.tkk7.com/blovesaga/archive/2006/06/09/51646.htmlblovesagablovesagaFri, 09 Jun 2006 03:28:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/09/51646.htmlhttp://www.tkk7.com/blovesaga/comments/51646.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/09/51646.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/51646.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/51646.html     Collection                   Map(和Collection接口没Q何关p?
       / \                         |
      /   \                        |     
    Set   List                  SortedMap
    /
   /
 SortedSet
(接口?



所谓框架就是一个类库的集合。集合框架就是一个用来表C和操作集合的统一框架Q包含了实现
集合的接口和cR?br /> 
 集合框架中的接口

 .Collection: 集合层次中的Ҏ(gu)口,JDK没有提供q个接口直接的实现类?br /> .Set: 不能包含重复的元素。SortedSet是一个按照升序排列元素的Set?br /> .List: 是一个有序的集合Q可以包含重复的元素。提供了按照索引讉K的方式?br /> .Map: 包含了key-value寏VMap不能包含重复的key。SortedMap是一个按照升序排列key的Map?br /> 
 集合框架中的实现c?br /> 
 实线表示l承c,虚线表示实现cR?br /> (囑֦?


 .ArrayList: 我们可以其看做是能够自动增长容量的数组?br /> .利用ArrayList的toArray()q回一个数l?br /> .Arrays.asList()q回一个列表?br /> .q代?Iterator)l我们提供了一U通用的方式来讉K集合中的元素?/p>

 注意: 从集合类中获取一个数l?toArray(),从数l获取列表利用Arrays.asList()
 例子:
import java.util.*;
class ArrayListTest
{
 public static void printElement(Collection c)
 {
  Iterator it = c.iterator();
  while(it.hasNext())
  {
   System.out.println(it.next());
  }
 }
 public static void main(String[] args)
 {
  ArrayList a = new ArrayList();
  /*
  a.add("abc");
  a.add("def");
  a.add("hjk");
  */
  
  a.add(new Point(1,1));
  a.add(new Point(2,2));
  a.add(new Point(3,3));
  /*
  Object[] o;
  o=a.toArray();  //集合类转换为数l?br />  for(int i=0;i<o.length;i++)
  {
   System.out.println(o[i]);
  }
  
  List b = new ArrayList();
  b=Arrays.asList(o);
  System.out.println(b);
  
  for(int i=0;i<a.size();i++)
  {
   System.out.println(a.get(i));
  }
  
  System.out.println(a);
  System.out.println(a);
  */
  
  /*
  Iterator it = a.iterator();
   如果要删除元素,必须先调用nextҎ(gu)
  it.next();
  it.remove();
  while(it.hasNext())
  {
   System.out.println(it.next());
  }
  */
  //q代器的作用: 提供一l通用的访问方?br />  printElement(a);
 }
}

class Point
{
 int x, y;
 Point(int x, int y)
 {
  this.x=x;
  this.y=y;
 }
 public String toString()
 {
  return "x="+x+","+"y="+y;
 }
}

 Collectionsc?/p>

 .排序: Collections.sort(); [区别与Arrays.sort()]
  (1) 自然排序(natural ordering);
  (2) 实现比较?Comparator)接口?br /> .取最大和最的元素: Collections.max(),Collections.min();
 .在已排序的List中搜索指定的元素: Collections.binarySearch()?/p>

 代码CZ:
import java.util.*;
class ArrayListTest
{
 public static void printElement(Collection c)
 {
  Iterator it = c.iterator();
  while(it.hasNext())
  {
   System.out.println(it.next());
  }
 }
 public static void main(String[] args)
 {
  /*
  ArrayList a = new ArrayList();
  
  a.add("abc");
  a.add("def");
  a.add("hjk");
  
  
  a.add(new Point(1,1));
  a.add(new Point(2,2));
  a.add(new Point(3,3));
  
  Object[] o;
  o=a.toArray();  //集合类转换为数l?br />  for(int i=0;i<o.length;i++)
  {
   System.out.println(o[i]);
  }
  
  List b = new ArrayList();
  b=Arrays.asList(o);
  System.out.println(b);
  
  for(int i=0;i<a.size();i++)
  {
   System.out.println(a.get(i));
  }
  
  System.out.println(a);
  System.out.println(a);
  */
  
  /*
  Iterator it = a.iterator();
   如果要删除元素,必须先调用nextҎ(gu)
  it.next();
  it.remove();
  while(it.hasNext())
  {
   System.out.println(it.next());
  }
  */
  //q代器的作用: 提供一l通用的访问方?br />  //printElement(a);
  
  Student s1 = new Student(1,"zhangsan");
  Student s2 = new Student(2,"lisi");
  Student s3 = new Student(3,"wangwu");
  Student s4 = new Student(3,"blovesaga");
  
  ArrayList a = new ArrayList();
  a.add(s1);
  a.add(s2);
  a.add(s3);
  a.add(s4);
  
  //Collections.sort(a);
  Collections.sort(a,new Student.StudentComparator());
  printElement(a);
 }
}

class Point
{
 int x, y;
 Point(int x, int y)
 {
  this.x=x;
  this.y=y;
 }
 public String toString()
 {
  return "x="+x+","+"y="+y;
 }
}

class Student implements Comparable
{
 int num;
 String name;
 //实现比较器,它L和我们的一个类相关,用内部类
 static class StudentComparator implements Comparator  //Z调用方便声明为静态的
 {
  public int compare(Object o1,Object o2)
  {
   Student s1 = (Student)o1;
   Student s2 = (Student)o2;
   int result=s1.num > s2.num ? 1: (s1.num==s2.num ? 0 : -1);
   if(result==0)
   {
    return s1.name.compareTo(s2.name);
   }
   return result;
  }
 }
 Student(int num,String name)
 {
  this.num=num;
  this.name=name;
 }
 public int compareTo(Object o)
 {
  Student s=(Student)o;
  return num > s.num ? 1 :( (num==s.num) ? 0 : -1);
 }
 
 public String toString()
 {
  return +num+":"+name;
 }
}

 

 



blovesaga 2006-06-09 11:28 发表评论
]]>
U程学习http://www.tkk7.com/blovesaga/archive/2006/06/08/51302.htmlblovesagablovesagaThu, 08 Jun 2006 04:21:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/08/51302.htmlhttp://www.tkk7.com/blovesaga/comments/51302.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/08/51302.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/51302.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/51302.html         多线E学?/p>

 * E序Q进E和U程
E序: 是指计算机指令的集合Q它以文件的形式存储在磁盘上?br />q程: 是一个程序在其自w的地址I间中的一ơ执行活动?/p>

q程是资源的甌Q调度和独立q行的单位,因此Q它使用pȝ中的q行资源Q而程序不能申?br />pȝ资源Q不能被pȝ调度Q也不能作ؓ独立q行的单位,因此Q它不站用系l的q行资源?/p>

U程: 是进E中一个单一的连接控制流E。一个进E可以有多个U程?/p>

U程又称量q程Q它和进E一h有独立的执行控制,由操作系l负责调度,区别在于U程
没有独立的存储空_而是和所属进E中的其它线E共享一个存储空_q得线E间的通信q?br />较进E简单?br /> * Java对多U程的支?br />Java在语aU提供了对多U程E序设计的支持?br />实现U程E序的两U方?
(1)从Threadcȝ承;
(2)实现Runnable接口?/p>

Javaq行时系l实C一个用于调度线E执行的U程调度器,用于定某一时刻由哪一个线E在
CPU上运行?br />在java技术中Q线E通常是抢占式的而不需要时间片分配q程(分配l每个线E相{的CPU旉?br />q程)。抢占式调度模型是许多U程处于可以q行状态({待状态)Q但实际上只有一个线E在
q行。该U程一直运行到它终止进入可q行状态({待状态)Q或者另一个具有更高优U的U程
变成可运行状态。在后一U情况下Q低优先U的U程被高优先U的U程抢占Q高优先U的U程获得
q行的机会?br />JavaU程调度器支持不同优先U程的抢占方式,但其本n不支持相同优先U程的时间片轮换?br />Javaq行时系l所在的操作pȝQ例?windows2000Q支持时间片的轮换,则线E调度器支?br />相同优先U线E的旉片轮换?/p>

用多U程技术模拟一个售系l?br />实现代码如下:
class TicketSystem
{
 public static void main(String[] args)
 {
  SellTicket st = new SellTicket();
  new Thread(st).start();
  new Thread(st).start();
  new Thread(st).start();
  new Thread(st).start();
 }
}
class SellTicket implements Runnable
{
 int tickets=100;
 Object o = new Object();
 public void run()
 {
  while(true)
  {
   /*
    synchronized(o)  //同步块在关键字后得加个对?L的对象都可以)
    {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println(Thread.currentThread().getName()+
          "sell tickets"+tickets);
          tickets--;    
     }
    }
    */
    sell(); 
  }
 }
 public synchronized void sell()  //同步Ҏ(gu)
 {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println(Thread.currentThread().getName()+
          "sell tickets"+tickets);
          tickets--;    
     }   
 }
}
 * U程的同?br /> The code segments within a program that access the same object from separate,concurrent
 thread are called "critical sections"?br /> 同步的两U方式:同步块和同步Ҏ(gu)
 没一个对象都有一个监视器(monitor),或者叫做琐?br /> 同步Ҏ(gu)利用的是this所代表的对象的琐?br /> 每个class也有一个琐Q是q个class所对应的Class对象的琐?br />完整CZ:
class TicketSystem
{
 public static void main(String[] args)
 {
  SellTicket st = new SellTicket();
  new Thread(st).start();
  /*
   *写一个try{}catch{}块让main()Ҏ(gu)所在的U程?U?br />   *主要是想要线E优先启?br />  */
  try
  {
   Thread.sleep(1);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  st.b=true;
  new Thread(st).start();
  //new Thread(st).start();
  //new Thread(st).start();
 }
}
class SellTicket implements Runnable
{
 int tickets=100;
 Object obj = new Object();
 boolean b=false;
 public void run()
 {
  if(b==false)
  {
   while(true)
      sell();
  }
  else
  {
     while(true)
   {  
    synchronized(this)  //同步块在关键字后得加个对?L的对象都可以)
    {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println("obj:"+Thread.currentThread().getName()+
          " sell tickets"+tickets);
          tickets--;    
     }
    }   
   // sell(); 
  }
  }

 }
 public synchronized void sell()  //同步Ҏ(gu)
 {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println("sell():"+Thread.currentThread().getName()+
          "sell tickets"+tickets);
          tickets--;    
     }   
 }
}

 * U程的死?br /> 哲学家进的问题
 一帮哲学家在一赯,但是每个人都只有1支筷子,大家都在{待别h拿出一支筷子让自己
 先吃Q然后再把自q拿出去,但是大家都不愿意拿出自己的筷子?br /> U程1琐住了对象A的监视器Q等待对象B的监视器Q线E?锁住了对象B的监视器Q等待对象A?br /> 监视器,造成了死琐?/p>

 CZ代码:
class TicketSystem
{
 public static void main(String[] args)
 {
  SellTicket st = new SellTicket();
  new Thread(st).start();
  /*
   *写一个try{}catch{}块让main()Ҏ(gu)所在的U程?U?br />   *主要是想要线E优先启?br />  */
  try
  {
   Thread.sleep(1);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  st.b=true;
  new Thread(st).start();
  //new Thread(st).start();
  //new Thread(st).start();
 }
}
class SellTicket implements Runnable
{
 int tickets=100;
 Object obj = new Object();
 boolean b=false;
 public void run()
 {
  if(b==false)
  {
   while(true)
      sell();
  }
  else
  {
     while(true)
   {  
    synchronized(obj)  //同步块在关键字后得加个对?L的对象都可以)
    {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      } 
      synchronized(this)
      {      
            if(tickets>0)
             {
                System.out.println("obj:"+Thread.currentThread().getName()+
                " sell tickets"+tickets);
                tickets--;    
              }
      }
      }   
    }
  }

 }
 public synchronized void sell()  //同步Ҏ(gu)
 {
  synchronized(obj)
  {
      if(tickets>0)
     {
       try
      {
         Thread.sleep(10);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
          System.out.println("sell():"+Thread.currentThread().getName()+
          "sell tickets"+tickets);
          tickets--;    
     }
  } 
 }
}
 * wait,notify,notifyAll
 每个对象除了有一个琐之外Q还有一个等待队?wait set),当一个对象刚刚创建的时候,?br /> 的等待队列是I的?br /> 我们应该在当前线E锁住对象的琐后Q去调用该对象的waitҎ(gu)?br /> 当调用对象的notifyҎ(gu)Ӟ从该对象的{待队列中删除一个Q意的U程Q这个线E将再次
 成ؓ可运行的U程?br /> 当调用对象的notifyAllҎ(gu)Ӟ从该对象的{待队列中删除所有等待的U程Q这些线E将
 成ؓ可运行的U程?br /> wait和notify重要用于producer-consumerq种关系中?br /> 代码CZ:
 class Test
{
 public static void main(String[] args)
 {
  Queque q = new Queque();
  Procedur p = new Procedur(q);
  Consumer c = new Consumer(q);
  p.start();
  c.start();
  
 }
}

class Procedur extends Thread   //生?br />{
 Queque q;
 Procedur(Queque q)
 {
  this.q=q;
 }
 public void run()
 {
  for(int i=0;i<10;i++)
  {
   q.put(i);
   System.out.println("Procedur put"+ i);
  }
 }
}

class Consumer extends Thread   //消费?br />{
 Queque q;
 Consumer(Queque q)
 {
  this.q=q;
 }
 public void run()
 {
  while(true)
  {
   System.out.println("Consumer get"+q.get());
  }
 }
}

class Queque    //攄数据
{
 int value;
 boolean bFull=false;
 public synchronized void put(int i)
 {
  if(!bFull)
  {
    value=i; 
    bFull=true;
    notify();  
  }
  try
  {
   wait();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 public synchronized int get()
 {
  if(!bFull)
  {
   try
   {
    wait();
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
  }
  bFull=false;
  notify();
  return value;
 }
}


 U程的状态图

   |
   | new Thread
   |                   yield      sleep,wait,suspend,I/Od
  \|/ start                     |------------------------------------>|
  New----->Runnable|                                                        |Not Runnable
                            \    |<------------------------------------|         /
                             \     sleepl束,notify,resume,I/O操作完成    /
                              \                                                                 /
                               \                                                              /
                                \                                                           /
                                 \                                                         /
                                  \ runҎ(gu)退出                             ? /
                                   \stopҎ(gu)调用                             /
                                    \                                                /
                                     \                                             / 
                                      \                                          /  stopҎ(gu)调用
                                       \                                       /
                                        \                                     /
                                         \                                   /
                                          \                                /
                                           \                             /
                                            \                           /
                                             \ ______ _____/
                                              |      Dead         |
                                              |____________|
 U程的终?br /> 
 讄一个flag变量?br /> l合interrupt()Ҏ(gu)?br /> code:
class TestThread
{
 public static void main(String[] args)
 {
  Thread1 t1=new Thread1();
  t1.start();
  int index=0;
  while(true)
  {
   if(index++==500)
   {
    t1.stopThread();
    break;
   }
   System.out.println(Thread.currentThread().getName());
  }
 }
}

class Thread1 extends Thread
{
 private boolean bStop=false;
 public void run()
 {
  while(!bStop)
  {
   System.out.println(getName());
  }
 }
 public void stopThread()
 {
  bStop=true;
 }
}



blovesaga 2006-06-08 12:21 发表评论
]]>
JAVAE序员面?2?/title><link>http://www.tkk7.com/blovesaga/archive/2006/06/05/50503.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Mon, 05 Jun 2006 07:16:00 GMT</pubDate><guid>http://www.tkk7.com/blovesaga/archive/2006/06/05/50503.html</guid><wfw:comment>http://www.tkk7.com/blovesaga/comments/50503.html</wfw:comment><comments>http://www.tkk7.com/blovesaga/archive/2006/06/05/50503.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/blovesaga/comments/commentRss/50503.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/blovesaga/services/trackbacks/50503.html</trackback:ping><description><![CDATA[     摘要: JAVA E序员面? 32 ? W一Q谈? final Q? ...  <a href='http://www.tkk7.com/blovesaga/archive/2006/06/05/50503.html'>阅读全文</a><img src ="http://www.tkk7.com/blovesaga/aggbug/50503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/blovesaga/" target="_blank">blovesaga</a> 2006-06-05 15:16 <a href="http://www.tkk7.com/blovesaga/archive/2006/06/05/50503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Runtime和Processc?/title><link>http://www.tkk7.com/blovesaga/archive/2006/06/05/50491.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Mon, 05 Jun 2006 06:47:00 GMT</pubDate><guid>http://www.tkk7.com/blovesaga/archive/2006/06/05/50491.html</guid><wfw:comment>http://www.tkk7.com/blovesaga/comments/50491.html</wfw:comment><comments>http://www.tkk7.com/blovesaga/archive/2006/06/05/50491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/blovesaga/comments/commentRss/50491.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/blovesaga/services/trackbacks/50491.html</trackback:ping><description><![CDATA[ <p>>>>>>>>>>>>>>>>>Runtime和Processc?lt;<<<<<<<<<<<<<<<<<<<br />1> 每一个JavaE序都有一个Runtimecȝ单一实例?br />2> 通过Runtime.getRuntime()获取Runtimecȝ实例?br />3> RuntimecL使用单例模式的一个例子?br />   Runtime没有public的构造方法。我们必ȝRuntime的静态方法getRuntime();我们可以?br />   Runtime的exec来执行一个外部程序,也可以用来编译一个源文g(用来做图形界面的~译??br />import java.io.*;<br />class RuntimeTest<br />{<br /> public static void main(String[] args)<br /> {<br />  Runtime rt=Runtime.getRuntime();<br />  //System.out.println(rt.freeMemory());<br />  try<br />  {<br />   //rt.exec("notepad");<br />   Process p=rt.exec("java ArrayTest");<br />   InputStream is=p.getInputStream(); //从执行ArrayTestcL得来?br />   int data;<br />   while((data=is.read())!=-1)<br />   {<br />    System.out.print((char)data);<br />   }<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br /> }<br />}</p> <p>------------->>设计模式<<-------------<br />1> 在我们进行程序设计时,逐渐形成了一些典型问题和问题解决Ҏ(gu),q就是Y件模式?br />2> 每一个模式描qC一个在我们E序设计中经常发生的问题,以及该问题的解决Ҏ(gu)?br />3> 当我们碰到模式所描述的问题,可以直接用相应的解x法去解决q个问题,q就是设计模式?br /><$>单例(Singleton)模式<br />1> 一个类只有一个实例,而且自行实例化ƈ像整个系l提供这个实例,q个cȝ为单例类?br />2> 单例cȝ一个重要特点就是类的构造方法是U有?从而避免了外部用利用构造方法直接创建多个实例?br />   ?RuntimecR?/p> <p>单例cȝ实现:(code)<br />class Singleton<br />{<br /> private static final Singleton st=new Singleton();<br /> private Singleton()<br /> {<br />  <br /> }<br /> public static Singleton getInstance()<br /> {<br />  return st;<br /> }<br />}<br /></p> <img src ="http://www.tkk7.com/blovesaga/aggbug/50491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/blovesaga/" target="_blank">blovesaga</a> 2006-06-05 14:47 <a href="http://www.tkk7.com/blovesaga/archive/2006/06/05/50491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装c?amp;&Classhttp://www.tkk7.com/blovesaga/archive/2006/06/05/50395.htmlblovesagablovesagaSun, 04 Jun 2006 21:59:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/05/50395.htmlhttp://www.tkk7.com/blovesaga/comments/50395.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/05/50395.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/50395.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/50395.html=============================装c?==============
针对八种基本数据cd定义的相应的引用cd-装c?包装c,包裹c?
基本数据cd          装c?br /> boolean               Boolean
 byte                  Byte
 short                 Short
 int                   Integer
 long                  Long
 char                  Character
 float                 Float
 double                Double
所有的状c都是一个只ȝQ不能修改的).针对没个基本cd我们只能建立一个这ȝ?/p>

class Test
{
 public static void main(String[] args)
 {
  int i=3;
  Integer in=new Integer(i);
  int j=in.intValue();
  System.out.println(j);
  String str=in.toString();  //把Integer对象转换为Stringcd
  System.out.println("str="+str);
  
  String str1="123";
  System.out.println(Integer.valueOf(str1));  //把Stringcd转换为Integercd
  
  boolean b1=false;
  Boolean b=new Boolean(b1);
  String s1=b.toString();
  System.out.println(s1);
  
  String s2="NO";
  System.out.println(Boolean.valueOf(s2));
 }
}

*****************Class*********************
1> 在Java中,每个class都有一个相应的Class对象。也是_当我们编写一个类Q编译完成后,在生?br />   ?class文g?׃产生一个Class对象Q用于表C个类的类型信息?br />2> 获取Class实例的方法有三种:
   <1>利用对象调用getClass()Ҏ(gu)获得该对象的Class实例?br />   <2>使用Classcȝ静态方法forName(),用类的名字获取一个Class的是实例?br />   <3>q用.class的方式来获取Class实例Q对于基本数据类型的装c,q可以用.TYPE来获取相应的
      基本数据cd的Class实例?br />   <4>在运行期_如果我们要生某个类的对象,JAVA虚拟?JVM)会检查该cd的Class对象是否?br />      加蝲Q如果没有加?JVM会根据类的名U找?class文gq加载它。一旦某个类型的Class对象?br />      l被加蝲到内存,可以用它来产生该类型所有的对象?br />   <5>newInstance()调用cM~省的构造方法?好处是我们在不知道类的名字的情况下去创造一个实例)
import java.lang.reflect.*;       //子包必须手动导入
class ClassTest
{
 public static void main(String[] args)//throws Exception
 {
  /*
  Point pt=new Point();             
  Class c1=pt.getClass();//利用对象调用getClass()Ҏ(gu)获得该对象的Class实例
  System.out.println(c1.getName());
  
  Class c2=Class.forName("Point");//使用Classcȝ静态方法forName(),用类的名字获取一个Class的是实例
  System.out.println(c2.getName());
  
  Class c3=Point.class;//q用.class的方式来获取Class实例
  System.out.println(c3.getName());
  
  Class c4=Integer.TYPE;//装cȝ.TYPE来获取相应的基本数据cd的Class实例?br />  System.out.println(c4.getName());
  */
  /*
  System.out.println("before new Point()");
  new Point();
  System.out.println("after new Point()");
  Class.forName("Line");
  */
  /*
  if(args.length!=1)
  {
   return;
  }
  try
  {
   Class c=Class.forName(args[0]);
   Point pt=(Point)c.newInstance();
   pt.output();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  */
  if(args.length!=1)
  {
   return;
  }
  try
  {
   Class c=Class.forName(args[0]);
   Constructor[] cons=c.getDeclaredConstructors();
   /*
   for(int i=0;i<cons.length;i++)
   {
    System.out.println(cons[i]);
   }
   Method[] ms=c.getDeclaredMethods();
   for(int i=0;i<ms.length;i++)
   {
    System.out.println(ms[i]);
   }*/
   Class[] params=cons[0].getParameterTypes();
   Object[] paramValues=new Object[params.length];
   for(int i=0;i<params.length;i++)
   {
    if(params[i].isPrimitive())
    {
     paramValues[i]=new Integer(i+3);
    }
   }
   Object o=cons[0].newInstance(paramValues);
   Method[] ms=c.getDeclaredMethods();
   ms[0].invoke(o,null);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  
 }
}

class Point
{
 static
 {
  System.out.println("Loading Point");
 }
 int x,y;
 void output()
 {
  System.out.println("x="+x+","+"y="+y);
 }
 Point(int x,int y)
 {
  this.x=x;
  this.y=y;
 }
}

class Line
{
 static
 {
  System.out.println("Loading Line");
 }
}



blovesaga 2006-06-05 05:59 发表评论
]]>
function transfer in Javahttp://www.tkk7.com/blovesaga/archive/2006/06/05/50393.htmlblovesagablovesagaSun, 04 Jun 2006 20:19:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/05/50393.htmlhttp://www.tkk7.com/blovesaga/comments/50393.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/05/50393.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/50393.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/50393.html1> 在java中,传参Ӟ都是以传值的形式惊行?br />2> 对于基本数据cdQ传递的是数据的拯Q对于引用类型,传递的引用的拷贝?br />3> 当我们在打印一个对象的时候,比如System.out.println(pt);Q它会自动调用类的toString()Ҏ(gu)
   Q所以徏议在所有的子类中重写toString()Ҏ(gu)?br />我们写一个函数用来交换两个变?x,y)的?
 code:
class StringTest
{
 public static void change(int x, int y)
 {
  x=x+y;
  y=x-y;
  x=x-y;
 }
 /*
 public static void change(int[] num)
 {
  num[0]=num[0]+num[1];
  num[1]=num[0]-num[1];
  num[0]=num[0]-num[1];
 }
 public static void change(Point pt)
 {
  pt.x=pt.x+pt.y;
  pt.y=pt.x-pt.y;
  pt.x=pt.x-pt.y;
 }
 */
 public static void main(String[] args)
 {
 int x=3;
 int y=4;
 change(3,4);
 System.out.println("x="+x+","+"y="+y);
 }
我们期望的输出结果是 x=4,y=3 然后你运行后发现l果为x=3,y=4,q没有达到我们的要求,Z么呢?那是因ؓ对于基本数据cdQ传递的是数据的拯Q对于引用类型,传递的是引?首地址)的拷贝。看看下面的内存图解应该你就能看出来?看看引用cd怎么来实?


code:
class StringTest
{
 /*
 public static void change(int x, int y)
 {
  x=x+y;
  y=x-y;
  x=x-y;
 }
 */
 public static void change(int[] num)
 {
  num[0]=num[0]+num[1];
  num[1]=num[0]-num[1];
  num[0]=num[0]-num[1];
 }
 public static void change(Point pt)
 {
  pt.x=pt.x+pt.y;
  pt.y=pt.x-pt.y;
  pt.x=pt.x-pt.y;
 }
 public static void main(String[] args)
 {
  /*
   int x=3;
   int y=4;
   change(3,4);
   System.out.println("x="+x+","+"y="+y);
   */
   int[] num=new int[]{3,4};
   change(num);
   System.out.println("x="+num[0]+","+"y="+num[1]);
  
   Point pt=new Point();
   pt.x=3;
   pt.y=4;
   change(pt);
   System.out.println("x="+pt.x+","+"y="+pt.y); 
 }
class Point
{
 int x,y; 
}
再看看引用类型的内存变化?
以上说明了在Java中函数的调用:
a> 在Java中,传参Ӟ都是以传值的方式q行?br />b> 对于基本数据cdQ传递的是数据的拯Q对于引用类型,传递的是引?首地址)的拷贝?br />


blovesaga 2006-06-05 04:19 发表评论
]]>
Object's Clonehttp://www.tkk7.com/blovesaga/archive/2006/06/05/50391.htmlblovesagablovesagaSun, 04 Jun 2006 20:15:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/05/50391.htmlhttp://www.tkk7.com/blovesaga/comments/50391.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/05/50391.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/50391.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/50391.html^^^^^^^^^^^^^^^对象的克隆^^^^^^^^^^^^^
1> Z获取对象的一份拷贝,我们可以利用Objectcȝclone()Ҏ(gu)?br />2> 在派生类中覆盖基cȝclone()Qƈ声明为public?br />3> 在派生类的clone()Ҏ(gu)中,调用super.clone()?br />4> 在派生类中实现Cloneable接口?br />4> 没有抽象Ҏ(gu)的接口叫标识接口?br />5> Z么我们在zcM覆盖Object的clone()Ҏ(gu)Ӟ一定要调用super.clone()?在运行时?Object
   的clone()Ҏ(gu)能识别出你要复制的是哪一个对象,然后为此对象分配I间Qƈq行对象的复Ӟ原
   始对象的内容一一复制到新的对象空间去?/p>* 克隆是针对没有引用cd的变量来克隆。针对引用类型的克隆应该用Deeply Clone?br />
克?
Code:
class FleetClone
{
 public static void main(String[] args)
 {
   Professor p=new Professor("feiyang",23);
   Student s1=new Student("zhangshan",18,p);
   Student s2=(Student)s1.clone();
   s2.p.name="feifei";
   s2.p.age=30;

   System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
 }
}
class Professor
{
 String name;
 int age;
 Professor(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
}

class Student implements Cloneable
{
 Professor p;
 String name;
 int age;
 Student(String name, int age,Professor p)
 {
  this.name=name;
  this.age=age;
  this.p=p;
 }
 public Object clone()
 {
  Object o=null;
  try
  {
   o=super.clone();
  }
  catch(CloneNotSupportedException e)
  {
   e.printStackTrace();
  }
  return o;
 }
}
改变学生s2的教授信息,打印s1教授信息,l果?name=feifei,age=30.产生q个l果是因为String是一个常量类?
 
深克?/div>
code:
class DeeplyClone
{
 public static void main(String[] args)
 {
   Professor p=new Professor("feiyang",23);
   Student s1=new Student("zhangshan",18,p);
   Student s2=(Student)s1.clone();
   s2.p.name="Bill.Gates";
   s2.p.age=30;
   System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
 }
}
class Professor implements Cloneable
{
 String name;
 int age;
 Professor(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
 public Object clone()
 {
  Object o=null;
  try
  {
   o=super.clone();
  }
  catch(CloneNotSupportedException e)
  {
   e.printStackTrace();
  }
  return o;
 }
}

class Student implements Cloneable
{
 Professor p;
 String name;
 int age;
 Student(String name, int age,Professor p)
 {
  this.name=name;
  this.age=age;
  this.p=p;
 }
 public Object clone()
 {
  //Object o=null;
  Student o=null;
  try
  {
   o=(Student)super.clone();
  }
  catch(CloneNotSupportedException e)
  {
   e.printStackTrace();
  }
  o.p=(Professor)p.clone();
  return o;
 }
}
打印l果?name=Bill.Gates,age=30,q就是深克隆.


blovesaga 2006-06-05 04:15 发表评论
]]>Java Study- 数组的相x?/title><link>http://www.tkk7.com/blovesaga/archive/2006/06/04/50300.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 09:30:00 GMT</pubDate><guid>http://www.tkk7.com/blovesaga/archive/2006/06/04/50300.html</guid><wfw:comment>http://www.tkk7.com/blovesaga/comments/50300.html</wfw:comment><comments>http://www.tkk7.com/blovesaga/archive/2006/06/04/50300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/blovesaga/comments/commentRss/50300.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/blovesaga/services/trackbacks/50300.html</trackback:ping><description><![CDATA[ <p>Java数组的相x?/p> <p>1> 在Java中所有的数组都有一个缺省的属性lengthQ用于获取数l元素的个数?br />2> 数组的复? System.arraycopy()?br />3> 数组的排? Arrays.sort()?br />4> 在已排序的数l中查找某个元素QArrays.binarySearch()?br />具体的看看下面的2个例?<br />code1:<br />class ArrayTest<br />{<br /> public static void main(String[] args)<br /> {<br />  /*数组的copy<br />  int[] num1=new int[]{1,2,3};<br />  int[] num2=new int[3];<br />  System.arraycopy(num1,0,num2,0,num1.length);<br />  for(int i=0;i<num2.length;i++)<br />  {<br />   System.out.println(num2[i]);<br />  }<br />  */<br />  //引用cd的数lcopy<br />  Point[] pts1=new Point[]{new Point(1,1),new Point(2,2),new Point(3,3)};<br />  Point[] pts2=new Point[3];<br />  System.arraycopy(pts1,0,pts2,0,pts1.length);<br />  for(int i=0;i<pts2.length;i++)<br />  {<br />   System.out.println("x="+pts2[i].x+","+"y="+pts2[i].y);<br />  }<br />  /*<br />  *因ؓ引用cd传递的是引用的拯Q所以我们修改pts2数组的第二个点的坐标Q?br />  *当我们打印pts1数组的第一个点的坐标时Q它的坐标点已经被修改ؓ(5,5)?br />  pts2[1].x=5;<br />  pts2[1].y=5;<br />  System.out.println("x="+pts1[1].x+","+"y="+pts1[1].y);<br />  */<br /> }<br />}</p> <p>class Point<br />{<br /> int x, y;<br /> Point(int x,int y)<br /> {<br />  this.x=x;<br />  this.y=y;<br /> }<br />}<br /><br /><br />code2:<br />import java.util.*;<br />class TestArray<br />{<br /> public static void main(String[] args)<br /> {<br />  /*<br />  int[] num=new int[]{3,2,1};<br />  Arrays.sort(num);<br />  for(int i=0;i<num.length;i++)<br />  {<br />   System.out.println(num[i]);<br />  }<br />  int index=Arrays.binarySearch(num,3);<br />  System.out.println("index="+index);<br />  System.out.println("Element="+num[index]);<br />  */<br />  Student[] ss=new Student[]{new Student("zhangshan",1),<br />                            new Student("lisi",2),<br />                            new Student("wangwu",3),<br />                            new Student("mybole",3)};<br />   Arrays.sort(ss);<br />   for(int i=0;i<ss.length;i++)<br />   {<br />    System.out.println(ss[i]);<br />   }<br />   int index=Arrays.binarySearch(ss,new Student("lisi",2));<br />   System.out.println("name="+ss[index].name+","+"index="+index);<br /> }<br />}</p> <p>class Student implements Comparable<br />{<br /> String name;<br /> int num;<br /> Student(String name,int num)<br /> {<br />  this.name=name;<br />  this.num=num;<br /> }<br /> public String toString()<br /> {<br />  return "name="+name+","+"number="+num;<br /> }<br /> public int compareTo(Object o)  //对于Object[]排序要求实现Comparable接口<br /> {<br />  Student s=(Student)o;<br />  //return num>s.num ? 1 :(num==s.num ? 0 : -1);<br />  int result=num>s.num ? 1 :(num==s.num ? 0 : -1);//按名字排?br />  if(0==result)<br />  {<br />   result=name.compareTo(s.name);<br />  }<br />  return result;<br /> }<br />}</p> <img src ="http://www.tkk7.com/blovesaga/aggbug/50300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/blovesaga/" target="_blank">blovesaga</a> 2006-06-04 17:30 <a href="http://www.tkk7.com/blovesaga/archive/2006/06/04/50300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java学习-多?/title><link>http://www.tkk7.com/blovesaga/archive/2006/06/04/50242.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 03:40:00 GMT</pubDate><guid>http://www.tkk7.com/blovesaga/archive/2006/06/04/50242.html</guid><wfw:comment>http://www.tkk7.com/blovesaga/comments/50242.html</wfw:comment><comments>http://www.tkk7.com/blovesaga/archive/2006/06/04/50242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/blovesaga/comments/commentRss/50242.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/blovesaga/services/trackbacks/50242.html</trackback:ping><description><![CDATA[ <p> 通过覆盖父类的方法来实现,在运行时Ҏ(gu)传递对象的引用,来调用相应的Ҏ(gu).<br />code:<br />class Animal<br />{<br /> int height,weight;<br /> Animal()<br /> {<br />  System.out.println("Animal construct");<br /> }<br /> void eat()<br /> {<br />  System.out.println("Animal eat!");<br /> }<br /> void sleep()<br /> {<br />  System.out.println("Animal sleep!");<br /> }<br /> void breathe()<br /> {<br />  System.out.println("Animal breathe!");<br /> }<br />}</p> <p>class Fish extends Animal<br />{<br /> Fish()<br /> {<br />  System.out.println("Fish construct");<br /> }<br /> void breathe()  //override method breathe()<br /> {<br />  System.out.println("Fish bubble");<br /> }<br />}<br />class DoMain<br />{<br /> static void fn(Animal an)<br /> {<br />  an.breathe();<br /> }<br /> public static void main(String[] args)<br /> {<br />  //Animal an=new Animal();<br />  Fish fh=new Fish();<br />  Animal an;<br />  an=fh;<br />  DoMain.fn(an);<br /> }<br />}<br /></p> <img src ="http://www.tkk7.com/blovesaga/aggbug/50242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/blovesaga/" target="_blank">blovesaga</a> 2006-06-04 11:40 <a href="http://www.tkk7.com/blovesaga/archive/2006/06/04/50242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Basic Study--Java extendshttp://www.tkk7.com/blovesaga/archive/2006/06/04/50233.htmlblovesagablovesagaSun, 04 Jun 2006 03:18:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/04/50233.htmlhttp://www.tkk7.com/blovesaga/comments/50233.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/04/50233.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/50233.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/50233.html   理解l承是理解面向对象程序设计的关键.在Java?通过关键字extendsl承一个已有的c?被承的cȝ为父c?类Q基c?,新的cȝ为子c?zc?.在Java中不允许多?code:
class Animal
{
 int height,weight;
 void eat()
 {
  System.out.println("Animal eat!");
 }
 void sleep()
 {
  System.out.println("Animal sleep!");
 }
 void breathe()
 {
  System.out.println("Animal breathe!");
 }
}
class Fish extends Animal
{
 
}
class DoMain
{
 public static void main(String[] args)
 {
  Animal an=new Animal();
  Fish fn=new Fish();
  
  an.breathe();
  fn.breathe();
  fn.height=30;
  fn.weight=20;
 }
}
Result:
F:\Java Develop>javac Animal.java

F:\Java Develop>java DoMain
Animal breathe!
Animal breathe!
(q说明派生类l承了父cȝ所有方法和成员变量.)

Ҏ(gu)的覆?override)
在子cM定义一个与父类同名,q回cd,参数cd均相同的一个方?UCؓҎ(gu)的覆?Ҏ(gu)的覆盖发生在子类与父cM?
code:
class Animal
{
 int height,weight;
 void eat()
 {
  System.out.println("Animal eat!");
 }
 void sleep()
 {
  System.out.println("Animal sleep!");
 }
 void breathe()
 {
  System.out.println("Animal breathe!");
 }
}
class Fish extends Animal
{
 int weight,height;   //隐藏了父cȝweight,height;
 void breathe()  //override method breathe()
 {
  super.breathe();  //用super调用父类的构造方?br />  System.out.println("Fish bubble");
 }
}
class DoMain
{
 public static void main(String[] args)
 {
 // Animal an=new Animal();
  Fish fn=new Fish();
  
  an.breathe();
  fn.breathe();
  fn.height=30;
  fn.weight=20;
 }
}
输出l果:
F:\Java Develop>javac Animal.java

F:\Java Develop>java DoMain
Animal breathe!
Fish bubble

Ҏ(gu)变量super
* 使用Ҏ(gu)变量super提供对父cȝ讉K
* 可以使用super讉K父类被子c隐藏的变量或覆盖的Ҏ(gu)
* 每个子类构造方法的W一条语句都是隐含的调用super,如果父类没有q种形式的构造函数就会报?
code:
class Animal
{
 int height,weight;
 Animal()
 {
  System.out.println("Animal construct");
 }
 void eat()
 {
  System.out.println("Animal eat!");
 }
 void sleep()
 {
  System.out.println("Animal sleep!");
 }
 void breathe()
 {
  System.out.println("Animal breathe!");
 }
}

class Fish extends Animal
{
 Fish()
 {
  System.out.println("Fish construct");
 }
 void breathe()  //override method breathe()
 {
  System.out.println("Fish bubble");
 }
}
class DoMain
{
 public static void main(String[] args)
 {
  //Animal an=new Animal();
  Fish fn=new Fish();
  
  //an.breathe();
  //fn.breathe();
  //fn.height=30;
  //fn.weight=20;
 }
}
输出l果:
F:\Java Develop>javac Animal.java

F:\Java Develop>java DoMain
Animal construct
Fish construct



blovesaga 2006-06-04 11:18 发表评论
]]>
Fist Course of Java Studyhttp://www.tkk7.com/blovesaga/archive/2006/06/04/50223.htmlblovesagablovesagaSun, 04 Jun 2006 02:51:00 GMThttp://www.tkk7.com/blovesaga/archive/2006/06/04/50223.htmlhttp://www.tkk7.com/blovesaga/comments/50223.htmlhttp://www.tkk7.com/blovesaga/archive/2006/06/04/50223.html#Feedback0http://www.tkk7.com/blovesaga/comments/commentRss/50223.htmlhttp://www.tkk7.com/blovesaga/services/trackbacks/50223.html    OOP(Object Oriented Programming)描述的是对象与对象之间的怺作用.听老师面向过E与面向对象的最大区别是: q程化程序设计先定法,再确定数据结?再确定运?面向q程~程,习惯于先建立数据l构存放数据q定义方?函数)来操作数?而面向对象的则是构徏一个模?数据与Ҏ(gu)l织在一?
    我们可以把现实世界的事物抽象为对?对象一般都有两个特?状?Status),行ؓ(Behavior).软g的对象概忉|由显CZ界对象抽象而来.把现实世界的状态保存Y件对象的变量?现实世界对象的行为通过软g对象的方?函数)来实?
    我们把相似的对象划分成一个类.在Y件中cd是一个模?它定义了通用于一个特定种cȝ所有对象的状?变量)和行?Ҏ(gu)).cL创徏对象的模?对象是类的实?
    面向对象~程的难点在于思\的{?我们通常习惯与考虑解决问题的方法,而不是抽象成对象再去解决?
 cȝ构造方?br />* 构造方法的名字和类名相?q且没有q回?
* 构造方法主要用于定义类的初始化状?
* 我们不能直接调用构造方?必须通过new关键字来自动调用,从而创建类的实?
* Java的类都要求有构造方?如果没有定义构造方?Java~译器会提供一个缺省的构造方?也就是不参数的构造方?
Ҏ(gu)的重?overload)
 重蝲
构成的条?Ҏ(gu)的名U相?但参数类型或参数个数不同,才能构成Ҏ(gu)的重?
code:
class Point
{
 int x,y;
 /*
  *带参数的构造方法和不带参数的构造方法就构成了方?函数)的重?br /> */
 Point(int a,int b)
 {
  x=a;
  y=b;
 }
 Point()
 {
  
 }
 void output()
 {
  System.out.println(x);
  System.out.println(y);
 }
 public static void main(String[] args)
 {
  //调用不带参数的构造方?br />  //Point p=new Point();
  //pt.x=10;
  //pt.y=20;
  //p.output();
  Point p1=new Point(3,3); //调用带参数的构造方?br />  p1.output();
 }
}
Ҏ(gu)变量this
* this变量代表对象本n
* 当类中有两个同名变量,一个属于类(cȝ成员变量),一个属于某个特定的Ҏ(gu)(Ҏ(gu)中的局部变?,使用this区分成员变量和局部变?
* 使用this化构造函数的调用
code:
class Point
{
 int x,y;
 /*
  *带参数的构造方法和不带参数的构造方法就构成了方?函数)的重?br /> */
 Point(int a,int b)
 {
  x=a;
  y=b;
 }
 Point()
 {
  this(1,1);
 }
 void output()
 {
  System.out.println(x);
  System.out.println(y);
 }
 /*output()Ҏ(gu)定义的Ş参与成员变量同名了,
 *那么在output()里就看不到成员变量的x,y了,它被隐藏?
 */
 void output(int x, int y)
 {
  this.x=x;
  this.y=y;
 }
 public static void main(String[] args)
 {
  Point pt=new Point(3,3);
  pt.output(5,5);
  pt.output();
 }
}
一个类所有的实例(对象)调用的成员方法在内存中只有一份拷?管在内存中可能有多个对?而数据成员在内的没个对象中都存在着一份拷?this变量允许相同的实例方法ؓ不同的对象工?每当调用一个实例方法时,this变量被设|成引用该实例方法的特定的类的对?Ҏ(gu)的代码接着会与this所代表的对象的特定数据建立兌.


blovesaga 2006-06-04 10:51 发表评论
]]>
վ֩ģ壺 ԻԻ³ҹҹѲƵ| Ʒ99þ| պһaƬѹۿ| ޹Ļ߹ۿ| һëƬƵ| ƷþþþþĻ| Ļѹۿ| ѿAVëƬһ| þƵ| ؼaaaaaaaaaëƬƵ| ɫWWWƷƵ| һŮѲ| ߹ۿվ| Ʒ鶹˳վ| ߾ƷһС˵| ػaaëƬƵ| ޾ƷӰۺ| ձһѿ| av֮˵վ| ëƬڵ| ޾Ʒ㶮߹ۿ | һ߲߲| һëƬշ| ɫַ߹ۿ| Ƶ| ˿Ů͵ԲĻ| Ů18ëƬaëƬ| ߾Ʒ޵һ| jizzjizz| ŮͬëƬ߲| ƷպAV| ԶƵ߹ۿѲ| ѹۿ| ޳˶߹ۿ| žӰ߹ۿѸ | ѾƷԲ߲| ޾Ʒþò| Ů18Ƶ| ۺϼ޵һҳ| ޹Ʒר| av˾Ʒ߲ |