﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-BloveSaga-随笔分类-Basic Study for JAVA</title><link>http://www.blogjava.net/blovesaga/category/11856.html</link><description>在希腊帕尔纳斯山南坡上,有一个驰名世界的戴尔波伊神托所,在它的入口处的巨石上赫然锈刻着这样几个大字: 认识你自己!</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 05:33:45 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 05:33:45 GMT</pubDate><ttl>60</ttl><item><title>Java Basic-Java I/O(二)</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/11/52059.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 11 Jun 2006 13:27:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/11/52059.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/52059.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/11/52059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/52059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/52059.html</trackback:ping><description><![CDATA[
		<p>  编码：将一个Unicode码转换为本地字符表示的过程为编码。<br />  解码：将一个字节转换为一个字符（用Unicode表示），这个过程叫解码。<br />        [简单的说去获取一个Unicode码就是解码]<br /> code:</p>
		<p>import java.util.*;<br />import java.nio.charset.*;<br />class CharsetTest<br />{<br /> public static void main(String[] args)throws Exception<br /> {<br />  /*<br />  Map m=Charset.availableCharsets();<br />  Set names=m.keySet();<br />  Iterator it =names.iterator();<br />  while(it.hasNext())<br />  {<br />   System.out.println(it.next());<br />  }<br />  */<br />  Properties pps=System.getProperties();<br />  //pps.list(System.out);<br />  pps.put("file.encoding","ISO-8859-1");<br />  int data;<br />  byte[] buf=new byte[100];<br />  int i=0;<br />  while((data=System.in.read())!='q')<br />  {<br />   buf[i]=(byte)data;<br />   i++;<br />  }<br />  String str=new String(buf,0,i);<br />  //String strGBK=new String(str.getBytes("ISO-8859-1"),"GBK");<br />  //System.out.println(strGBK);<br />  System.out.println(str);<br /> }<br />}</p>
		<p> </p>
		<p>     RandomAccessFile</p>
		<p>  RandomAccessFile类同时实现了DataInput和DataOutput接口，提供了对文件随机存取的功能，<br />  利用这个类可以在文件的任何位置读取或写入数据。<br />  RandomAccessFile类提供了一个文件指针，用来标志要进行读写操作的下一位数据的位置。 </p>
		<p> <br /> code:<br />import java.io.*;<br />class RandomFileTest<br />{<br /> public static void main(String[] args)throws Exception<br /> {<br />  Student s1 = new Student(1,"zhangsan",98.5);<br />  Student s2 = new Student(2,"lisi",90.5);<br />  Student s3 = new Student(3,"wangwu",78.5);<br />  <br />  RandomAccessFile rsf=new RandomAccessFile("student.txt","rw");  //存取模式rw<br />  s1.WriteStudent(rsf);<br />  s2.WriteStudent(rsf);<br />  s3.WriteStudent(rsf);<br />  <br />  Student s =new Student();<br />  rsf.seek(0); //把文件指针移到文件首<br />  for(long i=0;i&lt;rsf.length();i=rsf.getFilePointer())<br />  {<br />   s.ReadStudent(rsf);<br />   System.out.println(s.num+":"+s.name+":"+s.score);<br />  }<br />  rsf.close();<br /> }<br />}</p>
		<p>class Student<br />{<br /> int num;<br /> String name;<br /> double score;<br /> Student()<br /> {<br />  <br /> }<br /> Student(int num,String name,double score)<br /> {<br />  this.num=num;<br />  this.name=name;<br />  this.score=score;<br /> }<br /> public void WriteStudent(RandomAccessFile raf)throws Exception<br /> {<br />  raf.writeInt(num);<br />  raf.writeUTF(name);<br />  raf.writeDouble(score);<br /> }<br /> public void ReadStudent(RandomAccessFile raf)throws Exception<br /> {<br />  raf.readInt();<br />  raf.readUTF();<br />  raf.readDouble();  <br /> }<br />}</p>
		<p>
				<br />           对象序列化</p>
		<p> .将对象转换为字节流保存起来，并在日后还原这个对象，这种机制叫做对象序列化。<br /> .将一个对象保存到永久存储设备上称为持续性。<br /> .一个对象要想能够实现序列化，必须实现Serializable接口或Externalizable接口。<br /> .当一个对象被序列化时，只保存对象的非静态成员变量，不能保存任何的成员变量和静态的<br />  成员变量。<br /> .如果一个对象的成员变量是一个对象，那么这个对象的数据成员也会被保存。<br /> .如果一个可序列化的对象包含对某个不可序列化的对象的引用，那么整个序列化操作将会失败，<br />  并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象<br />  仍然可以序列化。</p>
		<p> code:<br />import java.io.*;<br />class ObjectSerialTest<br />{<br /> public static void main(String[] args)throws Exception<br /> {<br />  Employee e1 = new Employee("zhangsan",20,2800.50);<br />  Employee e2 = new Employee("lisi",22,25000.50);<br />  Employee e3 = new Employee("wangwu",23,12800.50);<br />  Employee e4 = new Employee("blovesaga",22,3800.50);<br />  <br />  FileOutputStream fos=new FileOutputStream("employee.txt");<br />  ObjectOutputStream oos=new ObjectOutputStream(fos);<br />  oos.writeObject(e1);<br />  oos.writeObject(e2);<br />  oos.writeObject(e3);<br />  oos.writeObject(e4);<br />  oos.close();<br />  <br />  FileInputStream fis = new FileInputStream("employee.txt");<br />  ObjectInputStream ois =new ObjectInputStream(fis);<br />  Employee e;<br />  for(int i=0;i&lt;4;i++)<br />  {<br />   e=(Employee)ois.readObject();<br />   System.out.println(e.name+":"+e.age+":"+e.salary);<br />  }<br />  ois.close();<br /> }<br />}</p>
		<p>class Employee implements Serializable<br />{<br /> String name;<br /> int age;<br /> double salary;<br /> transient Thread t1 =new Thread();<br /> Employee(String name,int age,double salary)<br /> {<br />  this.name=name;<br />  this.age=age;<br />  this.salary=salary;<br /> }<br /> //可以写private void readObject()方法来控制我们自己想要实现的<br /> private void writeObject(java.io.ObjectOutputStream oos)throws Exception<br /> {<br />  //例如我们自己写想要显示的顺序和那些需要显示<br />  oos.writeInt(age);<br />  oos.writeUTF(name);<br />  System.out.println("Write Object");<br /> }<br /> private void readObject(java.io.ObjectInputStream ois)throws Exception<br /> {<br />  //按照写入的顺序来读取<br />  age=ois.readInt();<br />  name=ois.readUTF();<br />  System.out.println("Read Object");<br /> }<br />}</p>
<img src ="http://www.blogjava.net/blovesaga/aggbug/52059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-11 21:27 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/11/52059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基础学习之---Java I/O学习(一)</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/11/51984.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 11 Jun 2006 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/11/51984.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/51984.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/11/51984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/51984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/51984.html</trackback:ping><description><![CDATA[
		<p>               File类</p>
		<p> 一个File类的对象，表示了磁盘上的文件或目录。<br /> File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作。</p>
		<p>import java.io.*;<br />class FileTest<br />{<br /> public static void main(String[] args) throws Exception<br /> {<br />  //File f = new File("1.txt");<br />  //f.createNewFile();   创建文件<br />  //f.mkdir(); 创建文件夹<br />  //File f = new File("F:\\Java Develop\\1.txt");//使用绝对路径<br />  //f.createNewFile();<br />  /*<br />  *WINDOWS平台下有盘符，LINUX下是没有的<br />  *考虑到JAVA语言的平台性，所有用分隔符seperator/seperatorChar<br />  */<br />  /*<br />  File fDir = new File(File.separator);//创建了当前的根目录<br />  String strFile = "Java Develop"+File.separator+"1.txt";<br />  File f = new File(fDir,strFile);<br />  f.createNewFile();<br />  //f.delete();<br />  f.deleteOnExit();<br />  Thread.sleep(3000);<br />  */<br />  /*<br />  for(int i=0;i&lt;5;i++)<br />  {<br />   File.createTempFile("linshi",".tmp");<br />   f.deleteOnExit();<br />  }<br />  Thread.sleep(3000);<br />  */<br />  <br />  File fDir = new File(File.separator);<br />  String strFile ="Java Develop"+File.separator;<br />  File f = new File(fDir,strFile);<br />  //文件过滤器<br />  String[] names = f.list(new FilenameFilter()<br />  {<br />   public boolean accept(File dir,String name)<br />   {<br />    return name.indexOf(".java")!=-1;<br />   }<br />  });<br />  for(int i=0;i&lt;names.length;i++)<br />  {<br />   System.out.println(names[i]);<br />  }<br /> }<br />}</p>
		<p>            流式I/0</p>
		<p> 流(Stream)是字节的源或目的。<br /> 两种基本的流是: 输入流(Input Stream)和输出流(Output Stream)。从从中读出一系列字节的<br /> 对象称为输入流。而能向其中写入一系列字节的对象称为输出流。</p>
		<p>
				<br />           流的分类<br /> <br /> 节点流: 从特定的地方读写的流类，例如：磁盘或一块内存区域。<br /> 过滤流: 使用节点作为输入或输出。过滤流使用的是一个已经存在的输入流或输出流连接创建的。<br /> (如下图)</p>
		<p>
				<img src="http://photo2.hexun.com/p/2006/0611/26339/b_4ABA553F60E5FD5F.jpg" />
				<br />         InputStream(一个抽象的基类)<br /> .三个基本的读写方法<br />  abstract int read(): 读取一个字节数据，并返回到数据，如果返回-1，表示读到了输入流的<br />                       末尾。<br />  int read(byte[] b):  将数据读入一个字节数组，同时返回实际读取的字节数。如果返回-1，<br />                       表示读到了输入流的末尾。<br />  int read(byte[] b,int off,int len): 将数据读入一个字节数组，同时返回是实际读取的字<br />                       节数。如果返回-1，表示读到了输入流的末尾。off指定在数组b中存放<br />                       数据的起始偏移位置；len指定读取的最大字节数。<br /> 其他的方法<br />  long-skip(long n): 在输入流中跳过n个字节，并返回实际跳过的字节数。<br />  int available():   返回在不发生阻塞的情况下，可读取的字节数。<br />  void close():      关闭输入流，释放和这个流相关的系统资源。<br />  void mark(int reqdlimit): 在输入流的当前位置放置一个标记，如果读取的字节数多余<br />                     readlimit设置的值，则流忽略这个标记。<br />  void reset():      返回到上一个标记。<br />  boolean markSupported(): 测试当前是否支持mark和reset方法。如果支持返回true，反之false。</p>
		<p>         java.io包中的InputStream的类层次 (下图)<br /><img src="http://photo2.hexun.com/p/2006/0611/26339/b_051C70533BCF9CF2.jpg" /><br />        OutputStream</p>
		<p> 三个基本的写方法<br /> 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 /> 其它方法<br /> void flush(): 刷新输出流，强制缓冲区中的输出字节被写出<br /> void close(): 关闭输出流，释放和这个流相关的系统资源</p>
		<p>        java.io包中OutputStream的类层次(如下图)<br /><img src="http://photo2.hexun.com/p/2006/0611/26339/b_A7649D38C87C4104.jpg" /><br /><br /><br />        基本的流类</p>
		<p> FileInputStream和FileOutputStream<br /> 节点流，用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时，文件已经<br /> 存在，则覆盖这个文件。<br /> <br /> BufferedInputStream和BufferedOutputStream<br /> 过滤流，需要使用已经存在的节点流来构造，提供带缓冲的读写，提高了读写的效率。</p>
		<p> DataInputStream和DataOutputStream<br /> 过滤流，需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。</p>
		<p> PipedInputStream和PipedOutputStream<br /> 管道流，用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream<br /> 对象读取输入。要使管道流有用，必须同时构造管道输入流和管道输出流。</p>
		<p>code:<br />import java.io.*;<br />class StreamTest<br />{<br /> public static void main(String[] args)throws Exception<br /> {<br />  /*<br />  int data;<br />  while((data=System.in.read())!=-1)  //从标准设备读取数据<br />  {<br />   System.out.write(data);//从标准设备输出数据<br />  }<br />  */<br />  //输出流写数据,只需要关闭尾端的流就可以了，因为fos连接到了bos<br />  FileOutputStream fos = new FileOutputStream("1.txt");<br />  //fos.write("<a href="http://www.google.cn&quot;.getBytes">http://www.google.cn".getBytes</a>());<br />  //fos.close();<br />  BufferedOutputStream bos = new BufferedOutputStream(fos);<br />  //bos.write("http//www.baidu.com".getBytes());<br />  //bos.flush();<br />  //bos.close();<br />  DataOutputStream dos=new DataOutputStream(bos); //连接到了bos和fis<br />  byte b=3;<br />  int i=78;<br />  char ch='a';<br />  float f=4.5f;<br />  dos.writeByte(b);<br />  dos.writeInt(i);<br />  dos.writeChar(ch);<br />  dos.writeFloat(f);<br />  dos.close(); //必须调用flush()或者close()不然不会写入硬盘<br />  <br />  //输入流读数据<br />  FileInputStream fis=new FileInputStream("1.txt");<br />  BufferedInputStream bis = new BufferedInputStream(fis);<br />  //byte[] buf=new byte[100];<br />  //int len=fis.read(buf);<br />  //int len=bis.read(buf);<br />  //System.out.println(new String(buf,0,len));<br />  //fis.close();<br />  //bis.close();<br />  //注意读取的顺序要和写的顺序一样<br />  DataInputStream dis = new DataInputStream(bis);<br />  System.out.println(dis.readByte());<br />  System.out.println(dis.readInt());<br />  System.out.println(dis.readChar());<br />  System.out.println(dis.readFloat());<br />  dis.close();  <br />  <br /> }<br />}</p>
		<p>
				<br />管道输入/输出流 code:<br />import java.io.*;<br />class PipedStreamTest<br />{<br /> public static void main(String[] args)<br /> {<br />  PipedOutputStream pos=new PipedOutputStream();<br />  PipedInputStream pis=new PipedInputStream();<br />  //连接<br />  try<br />  {<br />   pos.connect(pis);<br />   new Producer(pos).start();<br />   new Consumer(pis).start();<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br /> }<br />}</p>
		<p>class Producer extends Thread<br />{<br /> private PipedOutputStream pos;<br /> public Producer(PipedOutputStream pos)<br /> {<br />  this.pos=pos;<br /> }<br /> public void run()<br /> {<br />  try<br />  {<br />   pos.write("hello,welcome!".getBytes());<br />   pos.close();<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br /> }<br />}</p>
		<p>class Consumer extends Thread<br />{<br /> private PipedInputStream pis;<br /> Consumer(PipedInputStream pis)<br /> {<br />  this.pis=pis;<br /> }<br /> public void run()<br /> {<br />  try<br />  {<br />   byte[] buf=new byte[100];<br />   int len=pis.read(buf);<br />   System.out.println(new String(buf,0,len));<br />   pis.close();<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br /> }<br />}</p>
		<p>=================================================================================<br />              Java I/O库的设计原则</p>
		<p> Java的I/O库提供了一个称做链接的机制，可以将一个流与另一个流首尾相接，形成一个流管道的链接。<br /> 这种机制实际上是一种被称做为Decorator(装饰)的设计模式的应用。<br /> <br /> 通过流的链接，可以动态的增加流的功能，而这些功能的增加是通过组合一些流的基本功能而动<br /> 态获取的。</p>
		<p> 我们要获取一个I/O对象，往往需要产生多个I/O对象，这也是Java I/O库不大容易掌握的原因，<br /> 但在I/O库中的Decorator模式的运用，给我们提供了实现上的灵活性。</p>
		<p> I/O流的链接图(如下)<br /><img src="http://photo2.hexun.com/p/2006/0611/26339/b_67BF045E1D09D7AD.jpg" /><br /><br /><br />               Reader和Writer</p>
		<p> Java程序语言使用Unicode来表示字符串和字符。<br /> Reader和Writer这两个抽象类主要用来读写字符流。</p>
		<p> java.io包中Reader的类层次(如下图)<br /><img src="http://photo2.hexun.com/p/2006/0611/26339/b_7D68B185CE1EE42A.jpg" /></p>
		<p> java.io包中Writer的类层次(如下图)<br /><img src="http://photo2.hexun.com/p/2006/0611/26339/b_B4B95BA560BA15F9.jpg" /><br /><br /> code:<br />import java.io.*;<br />class StreamTest<br />{<br /> public static void main(String[] args)throws Exception<br /> {<br />  /*<br />  FileOutputStream fos = new FileOutputStream("1.txt");<br />  OutputStreamWriter osw = new OutputStreamWriter(fos); <br />  BufferedWriter bw = new BufferedWriter(osw);<br />  <br />  bw.write("<a href="http://www.yahoo.com.cn">http://www.yahoo.com.cn</a>");<br />  bw.close(); <br />  <br />  FileInputStream fis = new FileInputStream("1.txt");<br />  InputStreamReader isr = new InputStreamReader(fis);<br />  BufferedReader br = new BufferedReader(isr);<br />  System.out.println(br.readLine());<br />  br.close();<br />  */<br />  //InputStreamReader/OutputStreamWriter是一个中间过度类,连接字符和字符串<br />  InputStreamReader isr = new InputStreamReader(System.in);<br />  BufferedReader br = new BufferedReader(isr);<br />  String strLine;<br />  while((strLine=br.readLine())!=null)<br />  {<br />   System.out.println(strLine);<br />  }<br />  br.close();<br /> }<br />}</p>
		<p>            字符集的编码</p>
		<p> ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基<br /> 于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符，数字符号被计算机<br /> 处理时都是以二进制编码的形式出现(bit)二进制数对应。其最高位是0，相应的十进制数是0-127<br /> 如，数字1，有一些制表符和其他符号组成。ASCII是现金最通用的单字节编码系统。</p>
		<p> GB2312： GB2312码是中华人民共和国国家汉字信息交换用编码，全称《信息交换用汉字编码字<br /> 符集-基本集》。主要用于给每一个中文字符指定相应的数字，也就是进行编码。一个中文字符<br /> 用两个字节的数字来表示，为了和ASCII码有所区别，将中文字符每一个字节的最高位置都用1<br /> 来表示。</p>
		<p> GBK：为了对更多的字符进行编码，国家又发布了新的编码系统GBK（GBK的K是“扩展”的汉语<br /> 拼音的第一个字母）。在新的编码系统里，除了完全兼容GB2312外，还对繁体中文，一些不常用<br /> 的汉字和许多符号进行了编码。</p>
		<p> ISO-8859-1：是西方国家所使用的字符编码集，是一种单字节的字符集，而英文实际上只用了其<br /> 中数字小于128的部分。</p>
		<p> Unicode: 这是一种通用的字符集，对所有语言的文字进行统一编码，对每一个字符都采用2个字节<br /> 来表示，对于英文字符采取前面加“0”字节的策略实现等长兼容。如"a"的ASCII码为0x61,<br /> UNICODE就为0x00,0x61。</p>
		<p> UTF-8: Elight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,<br /> UCS是所有其他字符集标准的一个超集)。一个7位的ASCII码值，对应的UTF码是一个字节，如果<br /> 字符是0x0000，或在0x0080与0x007f之间，对应的UTF码是两个字节，如果字符在0x0800与0xffff<br /> 之间，对应的UTF码是三个字节。<br /></p>
<img src ="http://www.blogjava.net/blovesaga/aggbug/51984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-11 14:18 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/11/51984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>集合框架中的接口</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/09/51646.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Fri, 09 Jun 2006 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/09/51646.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/51646.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/09/51646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/51646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/51646.html</trackback:ping><description><![CDATA[
		<p>     Collection                   Map(和Collection接口没任何关系)<br />       / \                         |<br />      /   \                        |      <br />    Set   List                  SortedMap<br />    /<br />   /<br /> SortedSet<br />(接口图)</p>
		<p>
				<br />
				<img src="http://photo2.hexun.com/p/2006/0609/25931/b_A974EFE2446D07E2.jpg" />
				<br />所谓框架就是一个类库的集合。集合框架就是一个用来表示和操作集合的统一框架，包含了实现<br />集合的接口和类。<br /> <br /> 集合框架中的接口</p>
		<p> .Collection: 集合层次中的根接口，JDK没有提供这个接口直接的实现类。<br /> .Set: 不能包含重复的元素。SortedSet是一个按照升序排列元素的Set。<br /> .List: 是一个有序的集合，可以包含重复的元素。提供了按照索引访问的方式。<br /> .Map: 包含了key-value对。Map不能包含重复的key。SortedMap是一个按照升序排列key的Map。<br /> <br /> 集合框架中的实现类<br /> <br /> 实线表示继承类，虚线表示实现类。<br /> (图如下)<br /><img src="http://photo2.hexun.com/p/2006/0609/25931/b_E416E2DEA99C9A22.jpg" /><br /><br /> .ArrayList: 我们可以将其看做是能够自动增长容量的数组。<br /> .利用ArrayList的toArray()返回一个数组。<br /> .Arrays.asList()返回一个列表。<br /> .迭代器(Iterator)给我们提供了一种通用的方式来访问集合中的元素。</p>
		<p> 注意: 从集合类中获取一个数组 toArray(),从数组获取列表利用Arrays.asList()<br /> 例子:<br />import java.util.*;<br />class ArrayListTest<br />{<br /> public static void printElement(Collection c)<br /> {<br />  Iterator it = c.iterator();<br />  while(it.hasNext())<br />  {<br />   System.out.println(it.next());<br />  }<br /> }<br /> public static void main(String[] args)<br /> {<br />  ArrayList a = new ArrayList();<br />  /*<br />  a.add("abc");<br />  a.add("def");<br />  a.add("hjk");<br />  */<br />  <br />  a.add(new Point(1,1));<br />  a.add(new Point(2,2));<br />  a.add(new Point(3,3));<br />  /*<br />  Object[] o;<br />  o=a.toArray();  //将集合类转换为数组<br />  for(int i=0;i&lt;o.length;i++)<br />  {<br />   System.out.println(o[i]);<br />  }<br />  <br />  List b = new ArrayList();<br />  b=Arrays.asList(o);<br />  System.out.println(b);<br />  <br />  for(int i=0;i&lt;a.size();i++)<br />  {<br />   System.out.println(a.get(i));<br />  }<br />  <br />  System.out.println(a);<br />  System.out.println(a);<br />  */<br />  <br />  /*<br />  Iterator it = a.iterator();<br />   如果要删除元素，必须先调用next方法<br />  it.next();<br />  it.remove();<br />  while(it.hasNext())<br />  {<br />   System.out.println(it.next());<br />  }<br />  */<br />  //迭代器的作用: 提供一组通用的访问方式<br />  printElement(a);<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 /> public String toString()<br /> {<br />  return "x="+x+","+"y="+y;<br /> }<br />}</p>
		<p> Collections类</p>
		<p> .排序: Collections.sort(); [区别与Arrays.sort()]<br />  (1) 自然排序(natural ordering);<br />  (2) 实现比较器(Comparator)接口。<br /> .取最大和最小的元素: Collections.max(),Collections.min();<br /> .在已排序的List中搜索指定的元素: Collections.binarySearch()。</p>
		<p> 代码示例:<br />import java.util.*;<br />class ArrayListTest<br />{<br /> public static void printElement(Collection c)<br /> {<br />  Iterator it = c.iterator();<br />  while(it.hasNext())<br />  {<br />   System.out.println(it.next());<br />  }<br /> }<br /> public static void main(String[] args)<br /> {<br />  /*<br />  ArrayList a = new ArrayList();<br />  <br />  a.add("abc");<br />  a.add("def");<br />  a.add("hjk");<br />  <br />  <br />  a.add(new Point(1,1));<br />  a.add(new Point(2,2));<br />  a.add(new Point(3,3));<br />  <br />  Object[] o;<br />  o=a.toArray();  //将集合类转换为数组<br />  for(int i=0;i&lt;o.length;i++)<br />  {<br />   System.out.println(o[i]);<br />  }<br />  <br />  List b = new ArrayList();<br />  b=Arrays.asList(o);<br />  System.out.println(b);<br />  <br />  for(int i=0;i&lt;a.size();i++)<br />  {<br />   System.out.println(a.get(i));<br />  }<br />  <br />  System.out.println(a);<br />  System.out.println(a);<br />  */<br />  <br />  /*<br />  Iterator it = a.iterator();<br />   如果要删除元素，必须先调用next方法<br />  it.next();<br />  it.remove();<br />  while(it.hasNext())<br />  {<br />   System.out.println(it.next());<br />  }<br />  */<br />  //迭代器的作用: 提供一组通用的访问方式<br />  //printElement(a);<br />  <br />  Student s1 = new Student(1,"zhangsan");<br />  Student s2 = new Student(2,"lisi");<br />  Student s3 = new Student(3,"wangwu");<br />  Student s4 = new Student(3,"blovesaga");<br />  <br />  ArrayList a = new ArrayList();<br />  a.add(s1);<br />  a.add(s2);<br />  a.add(s3);<br />  a.add(s4);<br />  <br />  //Collections.sort(a);<br />  Collections.sort(a,new Student.StudentComparator());<br />  printElement(a);<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 /> public String toString()<br /> {<br />  return "x="+x+","+"y="+y;<br /> }<br />}</p>
		<p>class Student implements Comparable<br />{<br /> int num;<br /> String name;<br /> //实现比较器，它总是和我们的一个类相关,用内部类<br /> static class StudentComparator implements Comparator  //为了调用方便声明为静态的<br /> {<br />  public int compare(Object o1,Object o2)<br />  {<br />   Student s1 = (Student)o1;<br />   Student s2 = (Student)o2;<br />   int result=s1.num &gt; s2.num ? 1: (s1.num==s2.num ? 0 : -1);<br />   if(result==0)<br />   {<br />    return s1.name.compareTo(s2.name);<br />   }<br />   return result;<br />  }<br /> }<br /> Student(int num,String name)<br /> {<br />  this.num=num;<br />  this.name=name;<br /> }<br /> public int compareTo(Object o)<br /> {<br />  Student s=(Student)o;<br />  return num &gt; s.num ? 1 :( (num==s.num) ? 0 : -1);<br /> }<br /> <br /> public String toString()<br /> {<br />  return +num+":"+name;<br /> }<br />}</p>
		<p> </p>
		<p> </p>
<img src ="http://www.blogjava.net/blovesaga/aggbug/51646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-09 11:28 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/09/51646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程学习</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/08/51302.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Thu, 08 Jun 2006 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/08/51302.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/51302.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/08/51302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/51302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/51302.html</trackback:ping><description><![CDATA[
		<p>         多线程学习</p>
		<p> * 程序，进程和线程<br />程序: 是指计算机指令的集合，它以文件的形式存储在磁盘上。<br />进程: 是一个程序在其自身的地址空间中的一次执行活动。</p>
		<p>进程是资源的申请，调度和独立运行的单位，因此，它使用系统中的运行资源；而程序不能申请<br />系统资源，不能被系统调度，也不能作为独立运行的单位，因此，它不站用系统的运行资源。</p>
		<p>线程: 是进程中一个单一的连接控制流程。一个进程可以有多个线程。</p>
		<p>线程又称为轻量级进程，它和进程一样拥有独立的执行控制,由操作系统负责调度，区别在于线程<br />没有独立的存储空间，而是和所属进程中的其它线程共享一个存储空间，这使得线程间的通信远<br />较进程简单。<br /> * Java对多线程的支持<br />Java在语言级提供了对多线程程序设计的支持。<br />实现线程程序的两种方式:<br />(1)从Thread类继承；<br />(2)实现Runnable接口。</p>
		<p>Java运行时系统实现了一个用于调度线程执行的线程调度器，用于确定某一时刻由哪一个线程在<br />CPU上运行。<br />在java技术中，线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的<br />进程)。抢占式调度模型就是许多线程处于可以运行状态（等待状态），但实际上只有一个线程在<br />运行。该线程一直运行到它终止进入可运行状态（等待状态），或者另一个具有更高优级的线程<br />变成可运行状态。在后一种情况下，低优先级的线程被高优先级的线程抢占，高优先级的线程获得<br />运行的机会。<br />Java线程调度器支持不同优先级线程的抢占方式，但其本身不支持相同优先级线程的时间片轮换。<br />Java运行时系统所在的操作系统（例如:windows2000）支持时间片的轮换，则线程调度器就支持<br />相同优先级线程的时间片轮换。</p>
		<p>用多线程技术模拟一个售票系统<br />实现代码如下:<br />class TicketSystem<br />{<br /> public static void main(String[] args)<br /> {<br />  SellTicket st = new SellTicket();<br />  new Thread(st).start();<br />  new Thread(st).start();<br />  new Thread(st).start();<br />  new Thread(st).start();<br /> }<br />}<br />class SellTicket implements Runnable<br />{<br /> int tickets=100;<br /> Object o = new Object();<br /> public void run()<br /> {<br />  while(true)<br />  {<br />   /*<br />    synchronized(o)  //同步块在关键字后得加个对象(任意的对象都可以)<br />    {<br />      if(tickets&gt;0)<br />     {<br />       try<br />      {<br />         Thread.sleep(10);<br />      }<br />      catch(Exception e)<br />      {<br />        e.printStackTrace();<br />      }<br />          System.out.println(Thread.currentThread().getName()+<br />          "sell tickets"+tickets);<br />          tickets--;    <br />     } <br />    }<br />    */<br />    sell(); <br />  }<br /> }<br /> public synchronized void sell()  //同步方法<br /> {<br />      if(tickets&gt;0)<br />     {<br />       try<br />      {<br />         Thread.sleep(10);<br />      }<br />      catch(Exception e)<br />      {<br />        e.printStackTrace();<br />      }<br />          System.out.println(Thread.currentThread().getName()+<br />          "sell tickets"+tickets);<br />          tickets--;    <br />     }   <br /> }<br />}<br /> * 线程的同步<br /> The code segments within a program that access the same object from separate,concurrent<br /> thread are called "critical sections"。<br /> 同步的两种方式：同步块和同步方法<br /> 没一个对象都有一个监视器(monitor),或者叫做琐。<br /> 同步方法利用的是this所代表的对象的琐。<br /> 每个class也有一个琐，是这个class所对应的Class对象的琐。<br />完整示例:<br />class TicketSystem<br />{<br /> public static void main(String[] args)<br /> {<br />  SellTicket st = new SellTicket();<br />  new Thread(st).start();<br />  /*<br />   *写一个try{}catch{}块让main()方法所在的线程睡1秒<br />   *主要是想要线程优先启动<br />  */<br />  try<br />  {<br />   Thread.sleep(1);<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br />  st.b=true;<br />  new Thread(st).start();<br />  //new Thread(st).start();<br />  //new Thread(st).start();<br /> }<br />}<br />class SellTicket implements Runnable<br />{<br /> int tickets=100;<br /> Object obj = new Object();<br /> boolean b=false;<br /> public void run()<br /> {<br />  if(b==false)<br />  {<br />   while(true)<br />      sell();<br />  }<br />  else<br />  {<br />     while(true)<br />   {  <br />    synchronized(this)  //同步块在关键字后得加个对象(任意的对象都可以)<br />    {<br />      if(tickets&gt;0)<br />     {<br />       try<br />      {<br />         Thread.sleep(10);<br />      }<br />      catch(Exception e)<br />      {<br />        e.printStackTrace();<br />      }<br />          System.out.println("obj:"+Thread.currentThread().getName()+<br />          " sell tickets"+tickets);<br />          tickets--;    <br />     } <br />    }    <br />   // sell(); <br />  }<br />  }</p>
		<p> }<br /> public synchronized void sell()  //同步方法<br /> {<br />      if(tickets&gt;0)<br />     {<br />       try<br />      {<br />         Thread.sleep(10);<br />      }<br />      catch(Exception e)<br />      {<br />        e.printStackTrace();<br />      }<br />          System.out.println("sell():"+Thread.currentThread().getName()+<br />          "sell tickets"+tickets);<br />          tickets--;    <br />     }   <br /> }<br />}</p>
		<p> * 线程的死琐<br /> 哲学家进餐的问题<br /> 一帮哲学家在一起进餐，但是每个人都只有1支筷子，大家都在等待别人拿出一支筷子让自己<br /> 先吃，然后再把自己的拿出去，但是大家都不愿意拿出自己的筷子。<br /> 线程1琐住了对象A的监视器，等待对象B的监视器，线程2锁住了对象B的监视器，等待对象A的<br /> 监视器，就造成了死琐。</p>
		<p> 示例代码:<br />class TicketSystem<br />{<br /> public static void main(String[] args)<br /> {<br />  SellTicket st = new SellTicket();<br />  new Thread(st).start();<br />  /*<br />   *写一个try{}catch{}块让main()方法所在的线程睡1秒<br />   *主要是想要线程优先启动<br />  */<br />  try<br />  {<br />   Thread.sleep(1);<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br />  st.b=true;<br />  new Thread(st).start();<br />  //new Thread(st).start();<br />  //new Thread(st).start();<br /> }<br />}<br />class SellTicket implements Runnable<br />{<br /> int tickets=100;<br /> Object obj = new Object();<br /> boolean b=false;<br /> public void run()<br /> {<br />  if(b==false)<br />  {<br />   while(true)<br />      sell();<br />  }<br />  else<br />  {<br />     while(true)<br />   {  <br />    synchronized(obj)  //同步块在关键字后得加个对象(任意的对象都可以)<br />    {<br />       try<br />      {<br />         Thread.sleep(10);<br />      }<br />      catch(Exception e)<br />      {<br />        e.printStackTrace();<br />      } <br />      synchronized(this)<br />      {      <br />            if(tickets&gt;0)<br />             {<br />                System.out.println("obj:"+Thread.currentThread().getName()+<br />                " sell tickets"+tickets);<br />                tickets--;    <br />              } <br />      }<br />      }    <br />    }<br />  }</p>
		<p> }<br /> public synchronized void sell()  //同步方法<br /> {<br />  synchronized(obj)<br />  {<br />      if(tickets&gt;0)<br />     {<br />       try<br />      {<br />         Thread.sleep(10);<br />      }<br />      catch(Exception e)<br />      {<br />        e.printStackTrace();<br />      }<br />          System.out.println("sell():"+Thread.currentThread().getName()+<br />          "sell tickets"+tickets);<br />          tickets--;    <br />     } <br />  } <br /> }<br />}<br /> * wait,notify,notifyAll<br /> 每个对象除了有一个琐之外，还有一个等待队列(wait set),当一个对象刚刚创建的时候，它<br /> 的等待队列是空的。<br /> 我们应该在当前线程锁住对象的琐后，去调用该对象的wait方法。<br /> 当调用对象的notify方法时，将从该对象的等待队列中删除一个任意的线程，这个线程将再次<br /> 成为可运行的线程。<br /> 当调用对象的notifyAll方法时，将从该对象的等待队列中删除所有等待的线程，这些线程将<br /> 成为可运行的线程。<br /> wait和notify重要用于producer-consumer这种关系中。<br /> 代码示例:<br /> class Test<br />{<br /> public static void main(String[] args)<br /> {<br />  Queque q = new Queque();<br />  Procedur p = new Procedur(q);<br />  Consumer c = new Consumer(q);<br />  p.start();<br />  c.start();<br />  <br /> }<br />}</p>
		<p>class Procedur extends Thread   //生产者<br />{<br /> Queque q;<br /> Procedur(Queque q)<br /> {<br />  this.q=q;<br /> }<br /> public void run()<br /> {<br />  for(int i=0;i&lt;10;i++)<br />  {<br />   q.put(i);<br />   System.out.println("Procedur put"+ i);<br />  }<br /> }<br />}</p>
		<p>class Consumer extends Thread   //消费者<br />{<br /> Queque q;<br /> Consumer(Queque q)<br /> {<br />  this.q=q;<br /> }<br /> public void run()<br /> {<br />  while(true)<br />  {<br />   System.out.println("Consumer get"+q.get());<br />  }<br /> }<br />}</p>
		<p>class Queque    //放置数据<br />{<br /> int value;<br /> boolean bFull=false;<br /> public synchronized void put(int i)<br /> {<br />  if(!bFull)<br />  {<br />    value=i; <br />    bFull=true;<br />    notify();  <br />  }<br />  try<br />  {<br />   wait();<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br /> }<br /> public synchronized int get()<br /> {<br />  if(!bFull)<br />  {<br />   try<br />   {<br />    wait();<br />   }<br />   catch(Exception e)<br />   {<br />    e.printStackTrace();<br />   }<br />  }<br />  bFull=false;<br />  notify();<br />  return value;<br /> }<br />}</p>
		<p>
				<br /> 线程的状态图</p>
		<p>   |<br />   | new Thread<br />   |                   yield      sleep,wait,suspend,I/O阻塞<br />  \|/ start                     |------------------------------------&gt;|<br />  New-----&gt;Runnable|                                                        |Not Runnable<br />                            \    |&lt;------------------------------------|         /<br />                             \     sleep结束,notify,resume,I/O操作完成    /<br />                              \                                                                 /<br />                               \                                                              /<br />                                \                                                           /<br />                                 \                                                         /<br />                                  \ run方法退出                                /<br />                                   \stop方法调用                             /<br />                                    \                                                /<br />                                     \                                             /  <br />                                      \                                          /  stop方法调用<br />                                       \                                       /<br />                                        \                                     /<br />                                         \                                   /<br />                                          \                                /<br />                                           \                             /<br />                                            \                           /<br />                                             \ ______ _____/<br />                                              |      Dead         |<br />                                              |____________|<br /> 线程的终止<br /> <br /> 设置一个flag变量。<br /> 结合interrupt()方法。<br /> code:<br />class TestThread<br />{<br /> public static void main(String[] args)<br /> {<br />  Thread1 t1=new Thread1();<br />  t1.start();<br />  int index=0;<br />  while(true)<br />  {<br />   if(index++==500)<br />   {<br />    t1.stopThread();<br />    break;<br />   }<br />   System.out.println(Thread.currentThread().getName());<br />  }<br /> }<br />}</p>
		<p>class Thread1 extends Thread<br />{<br /> private boolean bStop=false;<br /> public void run()<br /> {<br />  while(!bStop)<br />  {<br />   System.out.println(getName());<br />  }<br /> }<br /> public void stopThread()<br /> {<br />  bStop=true;<br /> }<br />}</p>
<img src ="http://www.blogjava.net/blovesaga/aggbug/51302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-08 12:21 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/08/51302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA程序员面试32问</title><link>http://www.blogjava.net/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.blogjava.net/blovesaga/archive/2006/06/05/50503.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50503.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/05/50503.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50503.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JAVA																				程序员面试																				32																				问																																								第一，谈谈														final														，	...&nbsp;&nbsp;<a href='http://www.blogjava.net/blovesaga/archive/2006/06/05/50503.html'>阅读全文</a><img src ="http://www.blogjava.net/blovesaga/aggbug/50503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-05 15:16 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/05/50503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Runtime和Process类</title><link>http://www.blogjava.net/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.blogjava.net/blovesaga/archive/2006/06/05/50491.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50491.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/05/50491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50491.html</trackback:ping><description><![CDATA[
		<p>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;Runtime和Process类&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<br />1&gt; 每一个Java程序都有一个Runtime类的单一实例。<br />2&gt; 通过Runtime.getRuntime()获取Runtime类的实例。<br />3&gt; Runtime类是使用单例模式的一个例子。<br />   Runtime没有public的构造方法。我们必须用Runtime的静态方法getRuntime();我们可以用<br />   Runtime的exec来执行一个外部程序，也可以用来编译一个源文件(用来做图形界面的编译器)。<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(); //从执行ArrayTest类所得来的<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>-------------&gt;&gt;设计模式&lt;&lt;-------------<br />1&gt; 在我们进行程序设计时,逐渐形成了一些典型问题和问题解决方案,这就是软件模式。<br />2&gt; 每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案。<br />3&gt; 当我们碰到模式所描述的问题，就可以直接用相应的解决方法去解决这个问题,这就是设计模式。<br />&lt;$&gt;单例(Singleton)模式<br />1&gt; 一个类只有一个实例，而且自行实例化并像整个系统提供这个实例，这个类称为单例类。<br />2&gt; 单例类的一个重要特点就是类的构造方法是私有的,从而避免了外部用利用构造方法直接创建多个实例。<br />   如:Runtime类。</p>
		<p>单例类的实现:(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.blogjava.net/blovesaga/aggbug/50491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-05 14:47 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/05/50491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>封装类&amp;&amp;Class</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/05/50395.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 21:59:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/05/50395.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50395.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/05/50395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50395.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50395.html</trackback:ping><description><![CDATA[
		<p>=============================封装类===============<br />针对八种基本数据类型定义的相应的引用类型-封装类(包装类，包裹类)<br />基本数据类型          封装类<br /> boolean               Boolean<br /> byte                  Byte<br /> short                 Short<br /> int                   Integer<br /> long                  Long<br /> char                  Character<br /> float                 Float<br /> double                Double<br />所有的封状类都是一个只读类（不能修改的).针对没个基本类型我们只能建立一个这读的。</p>
		<p>class Test<br />{<br /> public static void main(String[] args)<br /> {<br />  int i=3;<br />  Integer in=new Integer(i);<br />  int j=in.intValue();<br />  System.out.println(j);<br />  String str=in.toString();  //把Integer对象转换为String类型<br />  System.out.println("str="+str);<br />  <br />  String str1="123";<br />  System.out.println(Integer.valueOf(str1));  //把String类型转换为Integer类型<br />  <br />  boolean b1=false;<br />  Boolean b=new Boolean(b1);<br />  String s1=b.toString();<br />  System.out.println(s1);<br />  <br />  String s2="NO";<br />  System.out.println(Boolean.valueOf(s2));<br /> }<br />}</p>
		<p>*****************Class*********************<br />1&gt; 在Java中，每个class都有一个相应的Class对象。也就是说，当我们编写一个类，编译完成后,在生成<br />   的.class文件中,就会产生一个Class对象，用于表示这个类的类型信息。<br />2&gt; 获取Class实例的方法有三种:<br />   &lt;1&gt;利用对象调用getClass()方法获得该对象的Class实例。<br />   &lt;2&gt;使用Class类的静态方法forName(),用类的名字获取一个Class的是实例。<br />   &lt;3&gt;运用.class的方式来获取Class实例，对于基本数据类型的封装类，还可以用.TYPE来获取相应的<br />      基本数据类型的Class实例。<br />   &lt;4&gt;在运行期间，如果我们要产生某个类的对象，JAVA虚拟机(JVM)会检查该类型的Class对象是否被<br />      加载，如果没有加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已<br />      经被加载到内存，就可以用它来产生该类型所有的对象。<br />   &lt;5&gt;newInstance()调用类中缺省的构造方法。(好处是我们在不知道类的名字的情况下去创造一个实例）<br />import java.lang.reflect.*;       //子包必须手动导入<br />class ClassTest<br />{<br /> public static void main(String[] args)//throws Exception<br /> {<br />  /*<br />  Point pt=new Point();              <br />  Class c1=pt.getClass();//利用对象调用getClass()方法获得该对象的Class实例<br />  System.out.println(c1.getName());<br />  <br />  Class c2=Class.forName("Point");//使用Class类的静态方法forName(),用类的名字获取一个Class的是实例<br />  System.out.println(c2.getName());<br />  <br />  Class c3=Point.class;//运用.class的方式来获取Class实例<br />  System.out.println(c3.getName());<br />  <br />  Class c4=Integer.TYPE;//封装类用.TYPE来获取相应的基本数据类型的Class实例。<br />  System.out.println(c4.getName());<br />  */<br />  /*<br />  System.out.println("before new Point()");<br />  new Point();<br />  System.out.println("after new Point()");<br />  Class.forName("Line");<br />  */<br />  /*<br />  if(args.length!=1)<br />  {<br />   return;<br />  }<br />  try<br />  {<br />   Class c=Class.forName(args[0]);<br />   Point pt=(Point)c.newInstance();<br />   pt.output();<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br />  */<br />  if(args.length!=1)<br />  {<br />   return;<br />  }<br />  try<br />  {<br />   Class c=Class.forName(args[0]);<br />   Constructor[] cons=c.getDeclaredConstructors();<br />   /*<br />   for(int i=0;i&lt;cons.length;i++)<br />   {<br />    System.out.println(cons[i]);<br />   }<br />   Method[] ms=c.getDeclaredMethods();<br />   for(int i=0;i&lt;ms.length;i++)<br />   {<br />    System.out.println(ms[i]);<br />   }*/<br />   Class[] params=cons[0].getParameterTypes();<br />   Object[] paramValues=new Object[params.length];<br />   for(int i=0;i&lt;params.length;i++)<br />   {<br />    if(params[i].isPrimitive())<br />    {<br />     paramValues[i]=new Integer(i+3);<br />    }<br />   }<br />   Object o=cons[0].newInstance(paramValues);<br />   Method[] ms=c.getDeclaredMethods();<br />   ms[0].invoke(o,null);<br />  }<br />  catch(Exception e)<br />  {<br />   e.printStackTrace();<br />  }<br />  <br /> }<br />}</p>
		<p>class Point<br />{<br /> static<br /> {<br />  System.out.println("Loading Point");<br /> }<br /> int x,y;<br /> void output()<br /> {<br />  System.out.println("x="+x+","+"y="+y);<br /> }<br /> Point(int x,int y)<br /> {<br />  this.x=x;<br />  this.y=y;<br /> }<br />}</p>
		<p>class Line<br />{<br /> static<br /> {<br />  System.out.println("Loading Line");<br /> }<br />}</p>
<img src ="http://www.blogjava.net/blovesaga/aggbug/50395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-05 05:59 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/05/50395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>function transfer in Java</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/05/50393.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 20:19:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/05/50393.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50393.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/05/50393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50393.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50393.html</trackback:ping><description><![CDATA[~~~~~~~~~~~~~~~~~~~~~~~~~~函数的调用~~~~~~~~~~~~~~~~~~~~<br />1&gt; 在java中，传参时，都是以传值的形式惊行。<br />2&gt; 对于基本数据类型，传递的是数据的拷贝，对于引用类型，传递的引用的拷贝。<br />3&gt; 当我们在打印一个对象的时候，比如System.out.println(pt);，它会自动调用类的toString()方法<br />   ，所以建议在所有的子类中重写toString()方法。<br />我们写一个函数用来交换两个变量(x,y)的值.<br /> code:
<div>class StringTest<br />{<br /> public static void change(int x, int y)<br /> {<br />  x=x+y;<br />  y=x-y;<br />  x=x-y;<br /> }<br /> /*<br /> public static void change(int[] num)<br /> {<br />  num[0]=num[0]+num[1];<br />  num[1]=num[0]-num[1];<br />  num[0]=num[0]-num[1];<br /> }<br /> public static void change(Point pt)<br /> {<br />  pt.x=pt.x+pt.y;<br />  pt.y=pt.x-pt.y;<br />  pt.x=pt.x-pt.y;<br /> }<br /> */<br /> public static void main(String[] args)<br /> {<br /> int x=3;<br /> int y=4;<br /> change(3,4);<br /> System.out.println("x="+x+","+"y="+y);<br /> }<br />我们期望的输出结果是 x=4,y=3 然后你运行后发现结果为x=3,y=4,并没有达到我们的要求,为什么呢?那是因为对于基本数据类型，传递的是数据的拷贝，对于引用类型，传递的是引用(首地址)的拷贝。看看下面的内存图解应该你就能看出来了.看看引用类型怎么来实现:<br /><img src="http://tk.files.storage.msn.com/x1pIuxx1VYmtQswcHPAwKaQ-yrErau7hNtnGE6aUTj3uhpVNVypAIyC0UrmgrkQwbG_eWxcbHVi_BCUGixRsexXpmeQJm6kBIQwr0l3XGz-acoQqeNnnp3fc9gOVp8Wgp1PF3CsaXYcAgo" /><br /><br /><div>code:</div><div>class StringTest<br />{<br /> /*<br /> public static void change(int x, int y)<br /> {<br />  x=x+y;<br />  y=x-y;<br />  x=x-y;<br /> }<br /> */<br /> public static void change(int[] num)<br /> {<br />  num[0]=num[0]+num[1];<br />  num[1]=num[0]-num[1];<br />  num[0]=num[0]-num[1];<br /> }<br /> public static void change(Point pt)<br /> {<br />  pt.x=pt.x+pt.y;<br />  pt.y=pt.x-pt.y;<br />  pt.x=pt.x-pt.y;<br /> }<br /> public static void main(String[] args)<br /> {<br />  /*<br />   int x=3;<br />   int y=4;<br />   change(3,4);<br />   System.out.println("x="+x+","+"y="+y);<br />   */<br />   int[] num=new int[]{3,4};<br />   change(num);<br />   System.out.println("x="+num[0]+","+"y="+num[1]);<br />   <br />   Point pt=new Point();<br />   pt.x=3;<br />   pt.y=4;<br />   change(pt);<br />   System.out.println("x="+pt.x+","+"y="+pt.y);  <br /> }<br />class Point<br />{<br /> int x,y; <br />}<br />再看看引用类型的内存变化图:</div><div>以上说明了在Java中函数的调用:</div><div>a&gt; 在Java中，传参时，都是以传值的方式进行。<br />b&gt; 对于基本数据类型，传递的是数据的拷贝，对于引用类型，传递的是引用(首地址)的拷贝。<br /><img src="http://tk.files.storage.msn.com/x1pIuxx1VYmtQswcHPAwKaQ-7C6SaJ0CDgh0i6Ffe25lVLAiy7Nci0TffWpKmDJpM6A-jnNv27Y7frfbCio6LLPC0XSGd8QgC9wURobXzsyHEL22atxDMfr9JmxzYvdXEw2B4ptqO-QF4I" /></div></div><img src ="http://www.blogjava.net/blovesaga/aggbug/50393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-05 04:19 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/05/50393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Object's Clone</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/05/50391.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 20:15:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/05/50391.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50391.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/05/50391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50391.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50391.html</trackback:ping><description><![CDATA[
		<p>^^^^^^^^^^^^^^^对象的克隆^^^^^^^^^^^^^<br />1&gt; 为了获取对象的一份拷贝，我们可以利用Object类的clone()方法。<br />2&gt; 在派生类中覆盖基类的clone()，并声明为public。<br />3&gt; 在派生类的clone()方法中，调用super.clone()。<br />4&gt; 在派生类中实现Cloneable接口。<br />4&gt; 没有抽象方法的接口叫标识接口。<br />5&gt; 为什么我们在派生类中覆盖Object的clone()方法时，一定要调用super.clone()呢?在运行时刻,Object<br />   的clone()方法能识别出你要复制的是哪一个对象，然后为此对象分配空间，并进行对象的复制，将原<br />   始对象的内容一一复制到新的对象空间去。</p>* 浅克隆是针对没有引用类型的变量来克隆。针对引用类型的克隆应该用Deeply Clone。<br /><div>浅克隆:</div><div>Code:</div><div>class FleetClone<br />{<br /> public static void main(String[] args)<br /> {<br />   Professor p=new Professor("feiyang",23);<br />   Student s1=new Student("zhangshan",18,p);<br />   Student s2=(Student)s1.clone();<br /><font color="#0000ff">   s2.p.name="feifei";<br />   s2.p.age=30;</font><br />  <font color="#ff00ff"> System.out.println("name="+s1.p.name+","+"age="+s1.p.age);</font><br /> }<br />}</div><div>class Professor<br />{<br /> String name;<br /> int age;<br /> Professor(String name,int age)<br /> {<br />  this.name=name;<br />  this.age=age;<br /> }<br />}</div><div><br />class Student implements Cloneable<br />{<br /> Professor p;<br /> String name;<br /> int age;<br /> Student(String name, int age,Professor p)<br /> {<br />  this.name=name;<br />  this.age=age;<br />  this.p=p;<br /> }<br /> public Object clone()<br /> {<br />  Object o=null;<br />  try<br />  {<br />   o=super.clone();<br />  }<br />  catch(CloneNotSupportedException e)<br />  {<br />   e.printStackTrace();<br />  }<br />  return o;<br /> }<br />}</div><div>改变学生s2的教授信息，打印s1教授信息,结果为:name=feifei,age=30.产生这个结果是因为String是一个常量类型.</div><div> </div><div>深克隆</div><div>code:</div><div>class DeeplyClone<br />{<br /> public static void main(String[] args)<br /> {<br />   Professor p=new Professor("feiyang",23);<br />   Student s1=new Student("zhangshan",18,p);<br />   Student s2=(Student)s1.clone();</div><div>   s2.p.name="Bill.Gates";<br />   s2.p.age=30;<br />   System.out.println("name="+s1.p.name+","+"age="+s1.p.age);<br /> }<br />}</div><div>class Professor implements Cloneable<br />{<br /> String name;<br /> int age;<br /> Professor(String name,int age)<br /> {<br />  this.name=name;<br />  this.age=age;<br /> }<br /> public Object clone()<br /> {<br />  Object o=null;<br />  try<br />  {<br />   o=super.clone();<br />  }<br />  catch(CloneNotSupportedException e)<br />  {<br />   e.printStackTrace();<br />  }<br />  return o;<br /> }<br />}</div><div><br />class Student implements Cloneable<br />{<br /> Professor p;<br /> String name;<br /> int age;<br /> Student(String name, int age,Professor p)<br /> {<br />  this.name=name;<br />  this.age=age;<br />  this.p=p;<br /> }<br /> public Object clone()<br /> {<br />  //Object o=null;<br />  Student o=null;<br />  try<br />  {<br />   o=(Student)super.clone();<br />  }<br />  catch(CloneNotSupportedException e)<br />  {<br />   e.printStackTrace();<br />  }<br />  o.p=(Professor)p.clone();<br />  return o;<br /> }<br />}</div><div>打印结果为:name=Bill.Gates,age=30,这就是深克隆.</div><img src ="http://www.blogjava.net/blovesaga/aggbug/50391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-05 04:15 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/05/50391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Study- 数组的相关操作</title><link>http://www.blogjava.net/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.blogjava.net/blovesaga/archive/2006/06/04/50300.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50300.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/04/50300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50300.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50300.html</trackback:ping><description><![CDATA[
		<p>Java数组的相关操作</p>
		<p>1&gt; 在Java中所有的数组都有一个缺省的属性length，用于获取数组元素的个数。<br />2&gt; 数组的复制: System.arraycopy()。<br />3&gt; 数组的排序: Arrays.sort()。<br />4&gt; 在已排序的数组中查找某个元素：Arrays.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&lt;num2.length;i++)<br />  {<br />   System.out.println(num2[i]);<br />  }<br />  */<br />  //引用类型的数组copy<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&lt;pts2.length;i++)<br />  {<br />   System.out.println("x="+pts2[i].x+","+"y="+pts2[i].y);<br />  }<br />  /*<br />  *因为引用类型传递的是引用的拷贝，所以我们修改pts2数组的第二个点的坐标，<br />  *当我们打印pts1数组的第一个点的坐标时，它的坐标点已经被修改为(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&lt;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&lt;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&gt;s.num ? 1 :(num==s.num ? 0 : -1);<br />  int result=num&gt;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.blogjava.net/blovesaga/aggbug/50300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-04 17:30 <a href="http://www.blogjava.net/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.blogjava.net/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.blogjava.net/blovesaga/archive/2006/06/04/50242.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50242.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/04/50242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50242.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50242.html</trackback:ping><description><![CDATA[
		<p> 通过覆盖父类的方法来实现,在运行时根据传递对象的引用,来调用相应的方法.<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.blogjava.net/blovesaga/aggbug/50242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-04 11:40 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/04/50242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Basic Study--Java extends</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/04/50233.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/04/50233.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50233.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/04/50233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50233.html</trackback:ping><description><![CDATA[
		<p>   理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类，基类),新的类称为子类(派生类).在Java中不允许多继承.code:<br />class Animal<br />{<br /> int height,weight;<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 />}<br />class Fish extends Animal<br />{<br /> <br />}<br />class DoMain<br />{<br /> public static void main(String[] args)<br /> {<br />  Animal an=new Animal();<br />  Fish fn=new Fish();<br />  <br />  an.breathe();<br />  fn.breathe();<br />  fn.height=30;<br />  fn.weight=20;<br /> }<br />}<br />Result:<br />F:\Java Develop&gt;javac Animal.java</p>
		<p>F:\Java Develop&gt;java DoMain<br />Animal breathe!<br />Animal breathe!<br />(这说明派生类继承了父类的所有方法和成员变量.)<br /><br /><font color="#0000ff">方法的覆盖(override)</font><br />在子类中定义一个与父类同名,返回类型,参数类型均相同的一个方法,称为方法的覆盖,方法的覆盖发生在子类与父类之间.<br />code:<br />class Animal<br />{<br /> int height,weight;<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 />}<br />class Fish extends Animal<br />{<br /> int weight,height;   //隐藏了父类的weight,height;<br /> void breathe()  //override method breathe()<br /> {<br />  super.breathe();  //用super调用父类的构造方法<br />  System.out.println("Fish bubble");<br /> }<br />}<br />class DoMain<br />{<br /> public static void main(String[] args)<br /> {<br /> // Animal an=new Animal();<br />  Fish fn=new Fish();<br />  <br />  an.breathe();<br />  fn.breathe();<br />  fn.height=30;<br />  fn.weight=20;<br /> }<br />}<br />输出结果:<br />F:\Java Develop&gt;javac Animal.java</p>
		<p>F:\Java Develop&gt;java DoMain<br />Animal breathe!<br />Fish bubble<br /><br /><font color="#0000ff">特殊变量super</font><br />* 使用特殊变量super提供对父类的访问<br />* 可以使用super访问父类被子类隐藏的变量或覆盖的方法<br />* 每个子类构造方法的第一条语句都是隐含的调用super,如果父类没有这种形式的构造函数就会报错.<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 /> public static void main(String[] args)<br /> {<br />  //Animal an=new Animal();<br />  Fish fn=new Fish();<br />  <br />  //an.breathe();<br />  //fn.breathe();<br />  //fn.height=30;<br />  //fn.weight=20;<br /> }<br />}<br />输出结果:<br />F:\Java Develop&gt;javac Animal.java</p>
		<p>F:\Java Develop&gt;java DoMain<br />Animal construct<br />Fish construct</p>
<img src ="http://www.blogjava.net/blovesaga/aggbug/50233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-04 11:18 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/04/50233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fist Course of Java Study</title><link>http://www.blogjava.net/blovesaga/archive/2006/06/04/50223.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/archive/2006/06/04/50223.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50223.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/archive/2006/06/04/50223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50223.html</trackback:ping><description><![CDATA[    从今天开始从零学习JAVA,希望可以认识到更多的朋友,可以让自己的JAVA之路走得更为顺利一些!买了几本书来看也听了几接课,觉得JAVA很吸引我,我想我可以走得更远的.自信是最重要的.<br />    OOP(Object Oriented Programming)描述的是对象与对象之间的相互作用.听老师将面向过程与面向对象的最大区别是: 过程化程序设计先确定算法,再确定数据结构,再确定运算.面向过程编程,习惯于先建立数据结构存放数据并定义方法(函数)来操作数据;而面向对象的则是构建一个模型,将数据与方法组织在一起.<br />    我们可以把现实世界的事物抽象为对象.对象一般都有两个特征:状态(Status),行为(Behavior).软件的对象概念是由显示世界对象抽象而来.把现实世界的状态保存软件对象的变量中;现实世界对象的行为通过软件对象的方法(函数)来实现.<br />    我们把相似的对象划分成一个类.在软件中类就是一个模板,它定义了通用于一个特定种类的所有对象的状态(变量)和行为(方法).类是创建对象的模板,对象是类的实例.<br />    面向对象编程的难点在于思路的转变.我们通常习惯与考虑解决问题的方法，而不是抽象成对象再去解决它.<br /> <font color="#0000ff">类的构造方法<br /></font>* 构造方法的名字和类名相同,并且没有返回值.<br />* 构造方法主要用于定义类的初始化状态.<br />* 我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例.<br />* Java的类都要求有构造方法,如果没有定义构造方法,Java编译器会提供一个缺省的构造方法,也就是不参数的构造方法.<br /><font color="#0000ff">方法的重载(overload)<br /> 重载</font><font color="#000000">构成的条件:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载.<br />code:<br />class Point<br />{<br /> int x,y;<br /> /*<br />  *带参数的构造方法和不带参数的构造方法就构成了方法(函数)的重载<br /> */<br /> Point(int a,int b)<br /> {<br />  x=a;<br />  y=b;<br /> }<br /> Point()<br /> {<br />  <br /> }<br /> void output()<br /> {<br />  System.out.println(x);<br />  System.out.println(y);<br /> }<br /> public static void main(String[] args)<br /> {<br />  //调用不带参数的构造方法<br />  //Point p=new Point();<br />  //pt.x=10;<br />  //pt.y=20;<br />  //p.output();<br />  Point p1=new Point(3,3); //调用带参数的构造方法<br />  p1.output();<br /> }<br />}<br /><font color="#0000ff">特殊变量this</font><br />* this变量代表对象本身<br />* 当类中有两个同名变量,一个属于类(类的成员变量),一个属于某个特定的方法(方法中的局部变量),使用this区分成员变量和局部变量.<br />* 使用this简化构造函数的调用<br />code:<br />class Point<br />{<br /> int x,y;<br /> /*<br />  *带参数的构造方法和不带参数的构造方法就构成了方法(函数)的重载<br /> */<br /> Point(int a,int b)<br /> {<br />  x=a;<br />  y=b;<br /> }<br /> Point()<br /> {<br />  this(1,1);<br /> }<br /> void output()<br /> {<br />  System.out.println(x);<br />  System.out.println(y);<br /> }<br /> /*output()方法定义的形参与成员变量同名了，<br /> *那么在output()里就看不到成员变量的x,y了，它被隐藏了.<br /> */<br /> void output(int x, int y)<br /> {<br />  this.x=x;<br />  this.y=y;<br /> }<br /> public static void main(String[] args)<br /> {<br />  Point pt=new Point(3,3);<br />  pt.output(5,5);<br />  pt.output();<br /> }<br />}<br />一个类所有的实例(对象)调用的成员方法在内存中只有一份拷贝,尽管在内存中可能有多个对象,而数据成员在内的没个对象中都存在着一份拷贝.this变量允许相同的实例方法为不同的对象工作.每当调用一个实例方法时,this变量被设置成引用该实例方法的特定的类的对象.方法的代码接着会与this所代表的对象的特定数据建立关联.</font><img src ="http://www.blogjava.net/blovesaga/aggbug/50223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-04 10:51 <a href="http://www.blogjava.net/blovesaga/archive/2006/06/04/50223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>