﻿<?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-拼搏的人生-文章分类-Java Core</title><link>http://www.blogjava.net/DuYang/category/10755.html</link><description>拼搏在繁华的都市</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:32:59 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:32:59 GMT</pubDate><ttl>60</ttl><item><title>Outer Class &amp; Inner Class</title><link>http://www.blogjava.net/DuYang/articles/49496.html</link><dc:creator>Dalston.Young</dc:creator><author>Dalston.Young</author><pubDate>Thu, 01 Jun 2006 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/DuYang/articles/49496.html</guid><wfw:comment>http://www.blogjava.net/DuYang/comments/49496.html</wfw:comment><comments>http://www.blogjava.net/DuYang/articles/49496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DuYang/comments/commentRss/49496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DuYang/services/trackbacks/49496.html</trackback:ping><description><![CDATA[
		<p>                                                                     Inner Class</p>
		<p>a&gt; 在一个类中定义一个类，这个类就叫做内部类或者内置类(inner class).<br />b&gt; 内部类可以让我们将逻辑上相关的一组类组织起来，并由外部类(outer class)<br />   来控制内部类的可见性.<br />c&gt; 当我们建立一个inner class的时候,其对象就拥有了与外部类对象之间的一种关系,<br />   这是通过一个特殊的this inference形成的，使得内部类对象可以随意的访问外部<br />   类中的所有成员。<br />d&gt; 在内部类中可以访问外部类的私有成员变量，也就是在内部类中可以随意的访问<br />   外部类中的所有的成员方法和变量<br />e&gt; 可以把内部类放到一个方法中来定义，但是它的使用范围必须是在这个方法里<br />f&gt; 当我们在一个方法中定义一个内部类时，如果我们需要在方法中内部类去访问这个<br />   本地变量（方法中声明的变量）时，我们必须把这个变量声明为final才行，不然<br />   编译器会报错<br />eg:<br /> void fn(int final a)<br /> {<br />  if(true)<br />  {<br />   class Middle<br />   {<br />    private int index=70;<br />    class Inner<br />    {<br />     private int index=60;<br />     void print()<br />     {<br />      int index=80;<br />      System.out.println(index);  //访问print()方法中的index=80变量<br />      System.out.println(this.index); //访问Inner类的成员变量index=60;<br />      System.out.println(Middle.this.index); //访问Middle类的成员变量index=70;<br />      System.out.println(Outer.this.index);  //访问Outer类的成员变量index=100;<br />     }<br />    }<br />   }<br />  }<br /> }<br />f&gt; 对于Inner类的访问权限我们可以声明为所有的(protected,private,public,default)。<br />h&gt; 对于内部类来说，如果起访问权限为protected，那么他可以在同一个类被访也可以在同<br />   一个包中被访问。而如果声明为private的那么那只能在Outer这个外部类被访问。我们<br />   可以把它生命为abstract(这个时候不能用Inner直接去实例化一个内部类)，我们可以在<br />   外部类中定义一个类，从Inner派生出来，直接实例化。当我们声明为final，那就不能再<br />   派生了，对于内部类来说还可以声明为static，那么这个时候就可以不需要同时存在外部<br />   类的对象，那么这个时候我们也不能访问外部类的非静态的成员变量和方法。相当于切断<br />   了与外部内对象的联系。非静态的内部类不能在内部类本身中定义静态的方法(反之可以)。<br />   非static的内部类中的成员变量不能声明为static的，只在顶层类或static的内部类中可以<br />   声明为static的。<br />g&gt; 为什么要使用内部类？<br />   1.在内部类(inner class)中可以随意访问外部类中的成员，让我们更好的管理和组织我们<br />   的代码。增强代码的可读性。<br />   2.内部类用于创建适配器类,适配器类是用于实现接口的类，使用内部类来实现接口，可以<br />   更好的定位与接口关联的方法在代码中的位置。<br />   3.其他的用法<br />   a&gt; 我们可以通过把内部类声明为private来隐藏接口的实现细节<br />   b&gt; 我们需要派生一个类，同时又需要去实现一个接口，如果基类中有个方法和接口中的方法<br />   同名，但是他们的用法不一样，我们就可以用内部类来解决。<br />=============================================================================<br /><br />内部类的一般用法:<br />class Outer            //Outer class<br />{<br /> private int index=100;  //私有的变量<br /> /*<br /> class Inner           //Inner Class,independence individual<br /> {                     //可以整体的把Inner类看成是Outer类的一个成员<br />  private int index=50;<br />  void print()<br />  {<br />   int index=30;<br />   System.out.println(index);<br />   System.out.println(this.index);<br />   System.out.println(Outer.this.index);<br />  }<br /> }*/<br /> /*<br /> *Inner类不管嵌套层次有多深，都可以随意的访问外部的成员变量<br /> *当我们在一个方法中定义一个内部类时，如果我们需要在方法中内部类去访问这个<br />  *本地变量（方法中声明的变量）时，我们必须把这个变量声明为final才行，不然<br />  *编译器会报错<br /> void fn(final int a)<br /> {<br />  final int b=1;<br />  if(true)<br />  {<br />   class Middle<br />   {<br />    private int index=70;<br />    class Inner<br />    {<br />     private int index=60;<br />     void print()<br />     {<br />      int index=80;<br />      System.out.println(index);  //访问print()方法中的index=80变量<br />      System.out.println(this.index); //访问Inner类的成员变量index=60;<br />      System.out.println(Middle.this.index); //访问Middle类的成员变量index=70;<br />      System.out.println(Outer.this.index);  //访问Outer类的成员变量index=100;<br />      System.out.println(a);<br />      System.out.println(b);<br />     }<br />    }<br />   }<br />  }<br /> }<br />/*<br /> *我们可以把内部类放到一个方法中，但是它的使用范围也定在了这个方法的范围里，甚至可以放到if()块<br /> *代码块中{}中，它告诉我们，不管我们把Inner()嵌套有多深，它都可以随意的访问外部类中的所有成员<br />  void fn()<br />  {<br />  class Inner           <br />  {                    <br />  private int index=50;<br />  void print()<br />  {<br />   int index=30;<br />   System.out.println(index);<br />   System.out.println(this.index);<br />   System.out.println(Outer.this.index);<br />  }<br />  }   <br />  }<br />  */<br />  static class Inner       <br /> {                   <br />  private int index=50;<br />  void print()<br />  {<br />    int index=80;<br />    System.out.println(index);  //访问print()方法中的index=80变量<br />    System.out.println(this.index); //访问Inner类的成员变量index=60;<br />    System.out.println(Outer.this.index);  //访问Outer类的成员变量index=100;<br />  }<br /> }<br />  <br /> void print()<br /> {<br />  //Inner inner=new Inner();<br />  //inner.print();<br /> }<br /> /*<br /> Inner getInner()<br /> {<br />  return new Inner();<br /> }<br /> */<br /> /*<br /> public static void main(String[] args)<br /> {<br />  Outer outer=new Outer();<br />  //outer.print();<br />  //Inner in=outer.getInner();这是一句错误的代码，因为Inner是定义在Outer类的内部的，所以对外是<br />  //不可见的，这个时候需要我们，使用外部类名来调用<br />  Inner in=outer.getInner(); //因为现在main()方法在Outer类里，这个时候Inner类对于main()方法来说是可见的<br />  Inner in=new Inner();<br />  in.print();<br /> }*/<br />}<br />class Test<br />{<br /> /*public static void main(String[] args)<br /> {<br />  Outer outer=new Outer();<br />  //outer.print();<br />  //Inner in=outer.getInner();这是一句错误的代码，因为Inner是定义在Outer类的内部的，所以对外是<br />  //不可见的，这个时候需要我们，使用外部类名来调用<br />  Outer.Inner in=outer.getInner();<br />  in.print();<br /> }*/<br /> public static void main(String[] args)<br /> {<br />  Outer outer=new Outer();<br />  //outer.print();<br />  //Inner in=outer.getInner();这是一句错误的代码，因为Inner是定义在Outer类的内部的，所以对外是<br />  //不可见的，这个时候需要我们，使用外部类名来调用<br />  //Outer.Inner in=outer.getInner();<br />  Outer.Inner in=outer.new Inner();  //用外部类对象来产生<br />  in.print();<br /> }<br />}<br />*****************************************************************************<br /><br />从内部类派生的用法:<br />/*<br /> *从内部类派生的用法<br />*/<br />class Car<br />{<br /> class Wheel<br /> {<br /> }<br />}<br />class PlaneWheel extends Car.Wheel<br />{<br /> PlaneWheel(Car car)<br /> {<br />  car.super();  //建立内部类对象到子类的引用<br /> }<br /> public static void main(String[] args)<br /> {<br />  Car car=new Car();<br />  PlaneWheel pw=new PlaneWheel(car);<br /> }<br />}<br />////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><br />内部类实现接口:<br />//用内部类实现接口,接口不能被实例化<br />interface Animal<br />{<br /> void eat();<br /> void sleep();<br />}<br />class Zoo<br />{<br /> private class Tiger implements Animal<br /> {<br />  public void eat()<br />  {<br />   System.out.println("Tiger eat!");<br />  }<br />  public void sleep()<br />  {<br />   System.out.println("Tiger sleep!");<br />  }<br /> }<br /> <br /> Animal getAnimal()<br /> {<br />  return new Tiger();<br /> }<br /> /*<br /> Animal getAnimal()<br /> {<br />  return new Animal()<br />  {                       //这是就是匿名的类<br />   public void eat()<br />   {<br />    System.out.println("Animal eat!");<br />   }<br />   public void sleep()<br />   {<br />    System.out.println("Animal sleep!");<br />   }<br />  };                   //这是就是匿名的类<br /> }*/<br />}<br />class DoTest<br />{<br /> public static void main(String[] args)<br /> {<br />  Zoo z=new Zoo();<br />  Animal an=z.getAnimal();<br />  an.eat();<br />  an.sleep();<br /> }<br />}<br />!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br /><br />基类中有个方法和接口中的方法,同名，但是他们的用法不一样:<br />//基类中有个方法和接口中的方法,同名，但是他们的用法不一样<br />interface Machine<br />{<br /> void run();<br />}</p>
		<p>class Person<br />{<br /> public void run()<br /> {<br />  System.out.println("run");<br /> }<br />}</p>
		<p>class Robot extends Person<br />{<br /> private class MachineHeart implements Machine<br /> {<br />  public void run()<br />  {<br />   System.out.println("heart run");<br />  }<br /> }<br /> Machine getMachine()<br /> {<br />  return new MachineHeart();<br /> }<br />}</p>
		<p>class Work<br />{<br /> public static void main(String[] args)<br /> {<br />   Robot robot=new Robot();<br />   Machine m=robot.getMachine();<br />   m.run();<br />   robot.run();  <br /> }<br />}</p>
<img src ="http://www.blogjava.net/DuYang/aggbug/49496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DuYang/" target="_blank">Dalston.Young</a> 2006-06-01 11:24 <a href="http://www.blogjava.net/DuYang/articles/49496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈Java的Clone</title><link>http://www.blogjava.net/DuYang/articles/44918.html</link><dc:creator>Dalston.Young</dc:creator><author>Dalston.Young</author><pubDate>Sun, 07 May 2006 13:52:00 GMT</pubDate><guid>http://www.blogjava.net/DuYang/articles/44918.html</guid><wfw:comment>http://www.blogjava.net/DuYang/comments/44918.html</wfw:comment><comments>http://www.blogjava.net/DuYang/articles/44918.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/DuYang/comments/commentRss/44918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DuYang/services/trackbacks/44918.html</trackback:ping><description><![CDATA[
		<p>    我们知道在Java在java中，传参时，都是以传值的形式进行。对于基本数据类型，传递的是数据的拷贝，对于引用类型，传递的引用的拷贝。为了获取对象的一份拷贝，我们可以利用Object类的clone()方法。至于怎么样来实现Clone我们必须做以下的事情:<br />1&gt; 在派生类中覆盖基类的clone()，并声明为public。<br />2&gt; 在派生类的clone()方法中，调用super.clone()。<br />3&gt; 在派生类中实现Cloneable接口。<br />4&gt; 没有抽象方法的接口叫标识接口。<br />5&gt; 为什么我们在派生类中覆盖Object的clone()方法时，一定要调用super.clone()呢?在运行时刻,Object<br />   的clone()方法能识别出你要复制的是哪一个对象，然后为此对象分配空间，并进行对象的复制，将原<br />   始对象的内容一一复制到新的对象空间去。<br />我们看下面的例子:<br /><br />class TestClone<br />{<br /> public static void main(String[] args)<br />   {<br />      Animal an1=new Animal("Dog",50);<br />      Animal an2=(Animal)an1.clone();<br />      an2.name="Fox";<br />      an2.weight=30;<br />      System.out.println(an1);<br />    }<br />}<br />class Animal implements Cloneable<br />{<br />   String name;<br />   int weight;<br /> public Animal(String name,int weight)<br />   {<br />       this.name=name;<br />       this.weight=weight;<br />   }<br /> public String toString()<br />  {<br />       return "name="+name+","+"weight="+weight;<br />  }<br /> public Object clone()<br />  {<br />     Object o=null;<br />  try<br />    {<br />       o=super.clone();<br />     }<br />  catch(CloneNotSupportedException e)<br />  {<br />       System.out.println(e.toString());<br />  }<br />      return o;<br />   }<br />}<br />运行结果如下:<br />F:\Java Develop&gt;javac TestClone.java<br />F:\Java Develop&gt;java TestClone<br />name=Dog,weight=50<br />我们看到我们修改an2的值并没有影响到an1里的值,这就是克隆的作用.是因为在这里通过Clone我们在内存中有2块地方用来储存不同的an1,an2<br />我们在看下面一个例子,我们再增加一个动物的饲养员类,来相关到具体的每个动物.<br />class TestClone<br />{<br /> public static void main(String[] args)<br /> {<br />  Feeder f=new Feeder("google",50);<br />  Animal an1=new Animal("Dog",50,f);<br />  Animal an2=(Animal)an1.clone();<br />  an2.f.name="baidu";<br />  an2.f.age=60;<br />  System.out.println(an1.f.name);<br />  System.out.println(an1.f.age);<br /> }<br />}</p>
		<p>/*<br />class Feeder implements Cloneable<br />{<br /> String name;<br /> int age;<br /> public Feeder(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 />   System.out.println(e.toString());<br />  }<br />  return o;<br /> }<br />}<br />*/</p>
		<p>class Feeder<br />{<br /> String name;<br /> int age;<br /> public Feeder(String name,int age)<br /> {<br />  this.name=name;<br />  this.age=age;<br /> }<br />}</p>
		<p>class Animal implements Cloneable<br />{<br /> String name;<br /> int weight;<br /> Feeder f;<br /> public Animal(String name,int weight,Feeder f)<br /> {<br />  this.name=name;<br />  this.weight=weight;<br />  this.f=f;<br /> }<br /> public String toString()<br /> {<br />  return "name="+name+","+"weight="+weight;<br /> }<br /> public Object clone()<br /> {<br />  Object o=null;<br />  //Animal o=null;<br />  try<br />  {<br />   o=super.clone();<br />  }<br />  catch(CloneNotSupportedException e)<br />  {<br />   System.out.println(e.toString());<br />  }<br />  //o.f=(Feeder)f.clone();<br />  return o;<br /> }<br />}<br />我们看输出结果:<br />F:\Java Develop&gt;javac TestClone.java<br />F:\Java Develop&gt;java TestClone<br />baidu<br />60<br />从结果可以看出来我们修改了an2.f.name和an.f.age但是an1去发生了变化,这是因为我们没有对Feeder类进行克隆,这就是浅克隆,为了解决这个问题我们需要用到Deeply克隆,java默认的克隆方式是浅克隆.<br />代码如下:<br />class TestClone<br />{<br /> public static void main(String[] args)<br /> {<br />  Feeder f=new Feeder("google",50);<br />  Animal an1=new Animal("Dog",50,f);<br />  Animal an2=(Animal)an1.clone();<br />  an2.f.name="baidu";<br />  an2.f.age=60;<br />  System.out.println(an1.f.name);<br />  System.out.println(an1.f.age);<br /> }<br />}</p>
		<p>class Feeder implements Cloneable<br />{<br /> String name;<br /> int age;<br /> public Feeder(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 />   System.out.println(e.toString());<br />  }<br />  return o;<br /> }<br />}</p>
		<p>class Animal implements Cloneable<br />{<br /> String name;<br /> int weight;<br /> Feeder f;<br /> public Animal(String name,int weight,Feeder f)<br /> {<br />  this.name=name;<br />  this.weight=weight;<br />  this.f=f;<br /> }<br /> public String toString()<br /> {<br />  return "name="+name+","+"weight="+weight;<br /> }<br /> public Object clone()<br /> {<br />  //Object o=null;<br />  Animal o=null;<br />  try<br />  {<br />   o=(Animal)super.clone();<br />  }<br />  catch(CloneNotSupportedException e)<br />  {<br />   System.out.println(e.toString());<br />  }<br />  o.f=(Feeder)f.clone();<br />  return o;<br /> }<br />}<br />输出结果如下:<br />F:\Java Develop&gt;javac TestClone.java<br />F:\Java Develop&gt;java TestClone<br />google<br />50<br />java浅克隆是指copy类里所有没有引用类型的变量.Deeply Clone则刚好相反.</p>
<img src ="http://www.blogjava.net/DuYang/aggbug/44918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DuYang/" target="_blank">Dalston.Young</a> 2006-05-07 21:52 <a href="http://www.blogjava.net/DuYang/articles/44918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式小谈</title><link>http://www.blogjava.net/DuYang/articles/44582.html</link><dc:creator>Dalston.Young</dc:creator><author>Dalston.Young</author><pubDate>Fri, 05 May 2006 00:04:00 GMT</pubDate><guid>http://www.blogjava.net/DuYang/articles/44582.html</guid><wfw:comment>http://www.blogjava.net/DuYang/comments/44582.html</wfw:comment><comments>http://www.blogjava.net/DuYang/articles/44582.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/DuYang/comments/commentRss/44582.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DuYang/services/trackbacks/44582.html</trackback:ping><description><![CDATA[
		<p>在新的JDK中加入了对使用正则表达式的模式匹配的支持。正则表达式是根据文本匹配模式的方法－类似于编译器生成类文件的工作原理。<br />在正则表达式的上下文中，模式是序列的文本表示方法。例如，我们想知道一个字符序列中是否存在"money"这个词，就可以使用模式money,<br />因为这是精确表示该字符串的方法。<br />   我们这样来检验用户输入的是否为一合法的email地址:<br />Code:<br />import java.util.regex.Pattern;<br />import java.util.regex.Matcher;</p>
		<p>public class TestRegex<br />{<br /> public boolean isEmail(String email)<br /> {<br />             //指定使用的模式<br />  Pattern pattern=Pattern.compile<br />            ("<a href="file://%5C%5Cp%7BDigit%7D+@%5C%5Cw+%5C%5C.%5C%5Cp%7BAlpha%7D%7B2,3/">\\p{Digit}+@\\w+\\.\\p{Alpha}{2,3</a>}");<br />  String[] words=pattern.split(email);<br />  Matcher matcher=pattern.matcher(email);<br />  if(matcher.find()&amp;&amp;words.length==0)<br />    return true;<br />  else<br />    return false;<br /> }<br />}<br />来看怎么用它:<br />Code:<br />public class Client<br />{<br /> public static void main(String[] args)<br /> {<br />  TestRegex regex=new TestRegex();<br />  String s1="<a href="mailto:DuYang163@gmail.com">DuYang163@gmail.com</a>";<br />  String s2="<a href="mailto:feiyang@126.123.com">feiyang@126.123.com</a>";<br />  System.out.println(s1+(regex.isEmail(s1)?"是":"不是")+"Email格式!");<br />  System.out.println(s2+(regex.isEmail(s2)?"是":"不是")+"Email格式!");<br /> }<br />}<br />一些常用的表达式格式:<br />文字(Literal): 表达式内任何不具有特殊意义的字符都被看做是一个文字，并与自身匹配。<br />量词(Quantifier): 某些字符或者表达式，他们被用来计算一个文字或分组可以字符列中出现的次数，以便该序列与表达式匹配。<br />例：<br />? 表示出现一次或根本不出现。<br />* 表示出现零次或一次以上(含一次)。<br />+ 表示出现一次或多次。<br />字符类(Character class): 一个字符类就是方括号内的一个字符集，其中，匹配可以是括号内的任意一个字符。可以把字符和量词结合起来，例如，[acegikmoqsuwy*]<br />                        将是只包含字母表中奇数字母的任意字符列。某些字符列是预先定义好的:<br />\d-数字(0到9)<br />\D－非数字<br />\s-空白字符，如制表符或换行符<br />\S-非空白字符<br />\w-单字符(a到z,A到Z,0到9以及下划线)<br />\W-非单字字符(其他任意字符)<br />Posix 字符类(Posix character class): 某些字符仅在用于US-ASCII比较时才有效。<br />例如：<br />\p{Lower}-小写字符<br />\p{Upper}-大写字符<br />\p{ASCII}-所有ASCII字符<br />\p{Alpha}-字符字符(\p{Lower}与\p{Upper}相结合)<br />\p{Digit}-从0到9的数字<br />\p{Alnum}-字母数字字符<br />范围(Range): 使用短线(dash)来指定范围。例如：[A-J]表示从A到J的大写字母。<br />否定(Negation): 使用脱字符^表示否定字符。例如：[^A-K]表示除A到K之外的任何字符。</p>
<img src ="http://www.blogjava.net/DuYang/aggbug/44582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DuYang/" target="_blank">Dalston.Young</a> 2006-05-05 08:04 <a href="http://www.blogjava.net/DuYang/articles/44582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>