??xml version="1.0" encoding="utf-8" standalone="yes"?>五月天网站亚洲小说,亚洲高清无码在线观看,亚洲乱码一二三四区乱码http://www.tkk7.com/mayu/category/14209.html生活的理惛_是ؓ(f)?jin)理想的生?)zh-cnThu, 21 Jun 2007 05:27:02 GMTThu, 21 Jun 2007 05:27:02 GMT60JavaE序异常处理的特D情况ZThttp://www.tkk7.com/mayu/articles/125142.htmlmymyTue, 19 Jun 2007 08:25:00 GMThttp://www.tkk7.com/mayu/articles/125142.htmlhttp://www.tkk7.com/mayu/comments/125142.htmlhttp://www.tkk7.com/mayu/articles/125142.html#Feedback0http://www.tkk7.com/mayu/comments/commentRss/125142.htmlhttp://www.tkk7.com/mayu/services/trackbacks/125142.html1、不能在finally块中执行return,continue{语句,否则?x)把异?#8220;吃掉”;

  2、在tryQcatch中如果有return语句Q则在执行return之前先执行finally?/strong>

  请大家仔l看下面的例子:(x)
以下是引用片D:(x)
public class TryTest { 
    public static void main(String[] args) { 
        try { 
            System.out.println(TryTest.test());// q回l果为true其没有Q何异?nbsp;
        } catch (Exception e) { 
            System.out.println("Exception from main"); 
            e.printStackTrace(); 
        } 
        doThings(0); 
    } 
 
    public static boolean test() throws Exception { 
        try { 
            throw new Exception("Something error");// W??抛出异常 
        } catch (Exception e) {// W??捕获的异常匹?声明cL其父c)(j)Q进入控制块 
            System.out.println("Exception from e");// W??打印 
            return false;// W?? return前控制{Udfinally?执行完后再返回(q一步被吃掉?jin),不执行?j) 
        } finally { 
            return true; // W?? 控制转移Q直接返回,吃掉?jin)异?nbsp;
        } 
    } 
     
    public static void doThings(int i) 
    { 
     try 
     { 
      if(i==0) 
      { 
       //在执行return之前?x)先执行finally 
       return; 
      } 
      int t=100/i; 
      System.out.println(t); 
     }catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
     finally 
     { 
      System.out.println("finally"); 
     } 
    } 



my 2007-06-19 16:25 发表评论
]]>
对synchronized(this)的一些理?ZThttp://www.tkk7.com/mayu/articles/122890.htmlmymyFri, 08 Jun 2007 09:12:00 GMThttp://www.tkk7.com/mayu/articles/122890.htmlhttp://www.tkk7.com/mayu/comments/122890.htmlhttp://www.tkk7.com/mayu/articles/122890.html#Feedback0http://www.tkk7.com/mayu/comments/commentRss/122890.htmlhttp://www.tkk7.com/mayu/services/trackbacks/122890.htmlsynchronized 
  Java语言的关键字Q当它用来修C个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线E执行该D代码?/strong> 



一、当两个q发U程讉K同一个对象object中的q个synchronized(this)同步代码块时Q一个时间内只能有一个线E得到执行。另一个线E必ȝ待当前线E执行完q个代码块以后才能执行该代码块?br>


二、然而,当一个线E访问object的一个synchronized(this)同步代码块时Q另一个线E仍然可以访问该object中的非synchronized(this)同步代码块?br>


三、尤其关键的是,当一个线E访问object的一个synchronized(this)同步代码块时Q其他线E对object中所有其它synchronized(this)同步代码块的讉K被d?br>


四、第三个例子同样适用其它同步代码块。也是_(d)当一个线E访问object的一个synchronized(this)同步代码块时Q它?yu)p得了(jin)q个object的对象锁。结果,其它U程对该object对象所有同步代码部分的讉K都被暂时d?br>


五、以上规则对其它对象锁同样适用.



举例说明Q?br>


一、当两个q发U程讉K同一个对象object中的q个synchronized(this)同步代码块时Q一个时间内只能有一个线E得到执行。另一个线E必ȝ待当前线E执行完q个代码块以后才能执行该代码块?br>


package ths;

public class Thread1 implements Runnable {
public void run() {
synchronized(this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
}
}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start();
}
}



l果Q?br>


A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4



二、然而,当一个线E访问object的一个synchronized(this)同步代码块时Q另一个线E仍然可以访问该object中的非synchronized(this)同步代码块?br>


package ths;

public class Thread2 {
public void m4t1() {
synchronized(this) {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
public void m4t2() {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
public static void main(String[] args) {
final Thread2 myt2 = new Thread2();
Thread t1 = new Thread(
new Runnable() {
public void run() {
myt2.m4t1();
}
}, "t1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
myt2.m4t2();
}
}, "t2"
);
t1.start();
t2.start();
}
}



l果Q?br>


t1 : 4
t2 : 4
t1 : 3
t2 : 3
t1 : 2
t2 : 2
t1 : 1
t2 : 1
t1 : 0
t2 : 0



三、尤其关键的是,当一个线E访问object的一个synchronized(this)同步代码块时Q其他线E对object中所有其它synchronized(this)同步代码块的讉K被d?br>


//修改Thread2.m4t2()Ҏ(gu)Q?br>
public void m4t2() {
synchronized(this) {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}

}



l果Q?br>


t1 : 4
t1 : 3
t1 : 2
t1 : 1
t1 : 0
t2 : 4
t2 : 3
t2 : 2
t2 : 1
t2 : 0



四、第三个例子同样适用其它同步代码块。也是_(d)当一个线E访问object的一个synchronized(this)同步代码块时Q它?yu)p得了(jin)q个object的对象锁。结果,其它U程对该object对象所有同步代码部分的讉K都被暂时d?br>


//修改Thread2.m4t2()Ҏ(gu)如下Q?br>
public synchronized void m4t2() {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}



l果Q?br>


t1 : 4
t1 : 3
t1 : 2
t1 : 1
t1 : 0
t2 : 4
t2 : 3
t2 : 2
t2 : 1
t2 : 0



五、以上规则对其它对象锁同样适用:



package ths;

public class Thread3 {
class Inner {
private void m4t1() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
private void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
}
private void m4t1(Inner inner) {
synchronized(inner) { //使用对象?br>inner.m4t1();
}
}
private void m4t2(Inner inner) {
inner.m4t2();
}
public static void main(String[] args) {
final Thread3 myt3 = new Thread3();
final Inner inner = myt3.new Inner();
Thread t1 = new Thread(
new Runnable() {
public void run() {
myt3.m4t1(inner);
}
}, "t1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
myt3.m4t2(inner);
}
}, "t2"
);
t1.start();
t2.start();
}
}



l果Q?br>
管U程t1获得?jin)对Inner的对象锁Q但׃U程t2讉K的是同一个Inner中的非同步部分。所以两个线E互不干扰?br>


t1 : Inner.m4t1()=4
t2 : Inner.m4t2()=4
t1 : Inner.m4t1()=3
t2 : Inner.m4t2()=3
t1 : Inner.m4t1()=2
t2 : Inner.m4t2()=2
t1 : Inner.m4t1()=1
t2 : Inner.m4t2()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=0



现在在Inner.m4t2()前面加上synchronizedQ?br>


private synchronized void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}



l果Q?br>
管U程t1与t2讉K?jin)同一个Inner对象中两个毫不相关的部分,但因为t1先获得了(jin)对Inner的对象锁Q所以t2对Inner.m4t2()的访问也被阻塞,因ؓ(f)m4t2()是Inner中的一个同步方法?br>


t1 : Inner.m4t1()=4
t1 : Inner.m4t1()=3
t1 : Inner.m4t1()=2
t1 : Inner.m4t1()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=4
t2 : Inner.m4t2()=3
t2 : Inner.m4t2()=2
t2 : Inner.m4t2()=1
t2 : Inner.m4t2()=0

my 2007-06-08 17:12 发表评论
]]>
Java同步机制谈――synchronized ZThttp://www.tkk7.com/mayu/articles/122887.htmlmymyFri, 08 Jun 2007 09:09:00 GMThttp://www.tkk7.com/mayu/articles/122887.htmlhttp://www.tkk7.com/mayu/comments/122887.htmlhttp://www.tkk7.com/mayu/articles/122887.html#Feedback0http://www.tkk7.com/mayu/comments/commentRss/122887.htmlhttp://www.tkk7.com/mayu/services/trackbacks/122887.html

Java对多U程的支持与同步机制深受大家的喜爱,g看v来用了(jin)synchronized关键字就可以L地解军_U程׃n数据同步问题。到底如何?――还得对synchronized关键字的作用q行深入?jin)解才可定论?/span>

ȝ说来Q?/span>synchronized关键字可以作为函数的修饰W,也可作ؓ(f)函数内的语句Q也是qx说的同步Ҏ(gu)和同步语句块。如果再l的分类Q?/span>synchronized可作用于instance变量?/span>object referenceQ对象引用)(j)?/span>static函数?/span>class literals(cdU字面常?/span>)w上?/span>

在进一步阐qC前,我们需要明几点:(x)

AQ无?/span>synchronized关键字加在方法上q是对象上,它取得的锁都是对象,而不是把一D代码或函数当作锁――而且同步Ҏ(gu)很可能还?x)被其他U程的对象访问?/span>

BQ每个对象只有一个锁Q?/span>lockQ与之相兌?/span>

CQ实现同步是要很大的pȝ开销作ؓ(f)代h(hun)的,甚至可能造成死锁Q所以尽量避免无谓的同步控制?/span>

接着来讨?/span>synchronized用到不同地方对代码生的影响Q?/span>

 

 

假设P1?/span>P2是同一个类的不同对象,q个cM定义?jin)以下几U情늚同步块或同步Ҏ(gu)Q?/span>P1?/span>P2都可以调用它们?/span>

 

 

1Q?/font>  ?/span>synchronized当作函数修饰W时Q示例代码如下:(x)

Public synchronized void methodAAA()

{

//….

}

q也是同步Ҏ(gu)Q那q时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也是_(d)当一个对?/span>P1在不同的U程中执行这个同步方法时Q它们之间会(x)形成互斥Q达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以Q意调用这个被加了(jin)synchronized关键字的Ҏ(gu)?/span>

上边的示例代码等同于如下代码Q?/font>

public void methodAAA()

{

synchronized (this)      //  (1)

{

       //…..

}

}

 (1)处的this指的是什么呢Q它指的是调用q个Ҏ(gu)的对象,?/span>P1。可见同步方法实质是?/span>synchronized作用?/span>object reference。――那个拿C(jin)P1对象锁的U程Q才可以调用P1的同步方法,而对P2而言Q?/span>P1q个锁与它毫不相qԌE序也可能在q种情Ş下摆脱同步机制的控制Q造成数据混ؕQ(

2Q同步块Q示例代码如下:(x)

            public void method3(SomeObject so)

              {

                     synchronized(so)

{

       //…..

}

}

q时Q锁是soq个对象Q谁拿到q个锁谁可以运行它所控制的那D代码。当有一个明的对象作ؓ(f)锁时Q就可以q样写程序,但当没有明确的对象作为锁Q只是想让一D代码同步时Q可以创Z个特D的instance变量Q它得是一个对象)(j)来充当锁Q?/span>

class Foo implements Runnable

{

       private byte[] lock = new byte[0];  // Ҏ(gu)?/span>instance变量

    Public void methodA()

{

       synchronized(lock) { //… }

}

//…..

}

注:(x)雉度的byte数组对象创徏h比M对象都经――查看编译后的字节码Q生成零长度?/span>byte[]对象只需3条操作码Q?/span>Object lock = new Object()则需?/span>7行操作码?/span>

3Q将synchronized作用?/span>static 函数Q示例代码如下:(x)

      Class Foo

{

public synchronized static void methodAAA()   // 同步?/span>static 函数

{

//….

}

public void methodBBB()

{

       synchronized(Foo.class)   //  class literal(cdU字面常?/span>)

}

       }

   代码中的methodBBB()Ҏ(gu)是把class literal作ؓ(f)锁的情况Q它和同步的static函数产生的效果是一L(fng)Q取得的锁很特别Q是当前调用q个Ҏ(gu)的对象所属的c(ClassQ而不再是p?/span>Class产生的某个具体对象了(jin)Q?/span>

记得在?/span>Effective Java》一书中看到q将 Foo.class?/span> P1.getClass()用于作同步锁q不一P不能?/span>P1.getClass()来达到锁q个Class的目的?/span>P1指的是由FoocM生的对象?/span>

可以推断Q如果一个类中定义了(jin)一?/span>synchronized?/span>static函数AQ也定义?jin)一?/span>synchronized ?/span>instance函数BQ那么这个类的同一对象Obj在多U程中分别访?/span>A?/span>B两个Ҏ(gu)Ӟ不会(x)构成同步Q因为它们的锁都不一栗?/span>AҎ(gu)的锁?/span>Objq个对象Q?/span>B的锁?/span>Obj所属的那个Class?/span>

 

 

结如下Q?/font>

搞清?/span>synchronized锁定的是哪个对象Q就能帮助我们设计更安全的多U程E序?/span>

 

 

q有一些技巧可以让我们对共享资源的同步讉K更加安全Q?/font>

1Q?/font>  定义private ?/span>instance变量+它的 getҎ(gu)Q而不要定?/span>public/protected?/span>instance变量。如果将变量定义?/span>publicQ对象在外界可以l过同步Ҏ(gu)的控制而直接取得它Qƈ改动它。这也是JavaBean的标准实现方式之一?/span>

2Q?/font>  如果instance变量是一个对象,如数l或ArrayList什么的Q那上述Ҏ(gu)仍然不安全,因ؓ(f)当外界对象通过getҎ(gu)拿到q个instance对象的引用后Q又其指向另一个对象,那么q个private变量也就变了(jin)Q岂不是很危险?/span> q个时候就需要将getҎ(gu)也加?/span>synchronized同步Qƈ且,只返回这?/span>private对象?/span>clone()――这P调用端得到的是对象副本的引用了(jin)?/span>



my 2007-06-08 17:09 发表评论
]]>
?Java RunTimec?/title><link>http://www.tkk7.com/mayu/articles/122814.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Fri, 08 Jun 2007 04:02:00 GMT</pubDate><guid>http://www.tkk7.com/mayu/articles/122814.html</guid><wfw:comment>http://www.tkk7.com/mayu/comments/122814.html</wfw:comment><comments>http://www.tkk7.com/mayu/articles/122814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mayu/comments/commentRss/122814.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mayu/services/trackbacks/122814.html</trackback:ping><description><![CDATA[<p align=center><span id="yeanteb" class=Title>RunTime</span></p> <p> </p> <p>Java的类库日益庞大,所包含的类和接口也不计其数。但其中有一些非帔R要的cd接口Q是Javacd中的核心(j)部分。常见的有String、Object、Class、Collection、ClassLoader、Runtime、Process...Q熟(zhn)这些类是学好Java的基。而这些类一般不Ҏ(gu)理解Q需要做深入的研I和实践才能掌握。下面是我对q些cȝ解和使用的一些ȝ。欢q你在阅d你宝贵的意见和d感留下! </p> <p>leizhimin 51cto技术博?br>  </p> <p>leizhimin 51cto技术博?br>一、概q?br>      Runtimecd装了(jin)q行时的环境。每?Java 应用E序都有一?Runtime cd例,使应用程序能够与其运行的环境相连接?br>      一般不能实例化一个Runtime对象Q应用程序也不能创徏自己?Runtime cd例,但可以通过 getRuntime Ҏ(gu)获取当前Runtimeq行时对象的引用?br>      一旦得C(jin)一个当前的Runtime对象的引用,可以调用Runtime对象的方法去控制Java虚拟机的状态和行ؓ(f)?<br>      当Applet和其他不被信ȝ代码调用MRuntimeҎ(gu)Ӟ常常?x)引起SecurityException异常?</p> <p>leizhimin 51cto技术博?br>  </p> <p>leizhimin 51cto技术博?br>二、API预览<br>    addShutdownHook(Thread hook) <br>      注册新的虚拟机来关闭挂钩?<br>    availableProcessors() <br>      ?Java 虚拟回可用处理器的数目?<br>    exec(String command) <br>      在单独的q程中执行指定的字符串命令?<br>    exec(String[] cmdarray) <br>      在单独的q程中执行指定命令和变量?<br>    exec(String[] cmdarray, String[] envp) <br>      在指定环境的独立q程中执行指定命令和变量?<br>    exec(String[] cmdarray, String[] envp, File dir) <br>      在指定环境和工作目录的独立进E中执行指定的命令和变量?<br>    exec(String command, String[] envp) <br>      在指定环境的单独q程中执行指定的字符串命令?<br>    exec(String command, String[] envp, File dir) <br>      在有指定环境和工作目录的独立q程中执行指定的字符串命令?<br>    exit(int status) <br>      通过启动虚拟机的关闭序列Q终止当前正在运行的 Java 虚拟机?<br>    freeMemory() <br>      q回 Java 虚拟Z的空闲内存量?<br>    gc() <br>      q行垃圾回收器?<br>    InputStream getLocalizedInputStream(InputStream in) <br>      已过时??JDK 1.1 开始,本地编码字节流转换?Unicode 字符的首选方法是使用 InputStreamReader ?BufferedReader cR?<br>    OutputStream getLocalizedOutputStream(OutputStream out) <br>      已过时??JDK 1.1 开始,?Unicode 字符{换ؓ(f)本地~码字节的首选方法是使用 OutputStreamWriter、BufferedWriter ?PrintWriter cR?<br>    getRuntime() <br>      q回与当?Java 应用E序相关的运行时对象?<br>    halt(int status) <br>      l止目前正在q行?Java 虚拟机?<br>    load(String filename) <br>      加蝲作ؓ(f)动态库的指定文件名?<br>    loadLibrary(String libname) <br>      加蝲h指定库名的动态库?<br>    maxMemory() <br>      q回 Java 虚拟图用的最大内存量?<br>    removeShutdownHook(Thread hook) <br>      取消注册某个先前已注册的虚拟机关闭挂钩?<br>    runFinalization() <br>      q行挂v finalization 的所有对象的l止Ҏ(gu)?<br>    runFinalizersOnExit(value) <br>      已过时?此方法本w具有不安全性。它可能Ҏ(gu)在用的对象调用l结Ҏ(gu)Q而其他线E正在操作这些对象,从而导致不正确的行为或死锁?<br>    totalMemory() <br>      q回 Java 虚拟Z的内存总量?<br>    traceInstructions(on) <br>      启用Q禁用指令跟t?<br>    traceMethodCalls(on) <br>      启用Q禁用方法调用跟t?</p> <p>leizhimin 51cto技术博?br>  </p> <p>leizhimin 51cto技术博?br>三、常见的应用</p> <p><br>leizhimin 51cto技术博?br>1、内存管理:(x)<br>Java提供?jin)无用单元自动收集机制。通过totalMemory()和freeMemory()Ҏ(gu)可以知道对象的堆内存有多大,q剩多少?br>Java?x)周期性的回收垃圾对象Q未使用的对象)(j)Q以侉K攑ֆ存空间。但是如果想先于攉器的下一ơ指定周期来攉废弃的对象,可以通过调用gc()Ҏ(gu)来根据需要运行无用单元收集器。一个很好的试验Ҏ(gu)是先调用gc()Ҏ(gu)Q然后调用freeMemory()Ҏ(gu)来查看基本的内存使用情况Q接着执行代码Q然后再ơ调用freeMemory()Ҏ(gu)看看分配?jin)多内存。下面的E序演示?jin)这个构惟?</p> <p>leizhimin 51cto技术博?br>//此实例来自《java核心(j)技术》卷一<br>class MemoryDemo{<br>    public static void main(String args[]){<br>        Runtime r = Runtime.getRuntime();<br>        long mem1,mem2;<br>        Integer someints[] = new Integer[1000];<br>        System.out.println("Total memory is Q? + r.totalMemory());<br>        mem1 = r.freeMemory();<br>        System.out.println("Initial free is : " + mem1);<br>        r.gc();<br>        mem1 = r.freeMemory();<br>        System.out.println("Free memory after garbage collection : " + mem1);<br>        //allocate integers<br>        for(int i=0; i<1000; i++) someints[i] = new Integer(i); </p> <p>leizhimin 51cto技术博?br>        mem2 = r.freeMemory();<br>        System.out.println("Free memory after allocation : " + mem2);<br>        System.out.println("Memory used by allocation : " +(mem1-mem2)); </p> <p>leizhimin 51cto技术博?br>        //discard Intergers<br>        for(int i=0; i<1000; i++) someints[i] = null;<br>        r.gc(); //request garbage collection<br>        mem2 = r.freeMemory();<br>        System.out.println("Free memory after collecting " + "discarded integers : " + mem2);<br>    }<br>} </p> <p>leizhimin 51cto技术博?br>~译后运行结果如下(不同的机器不同时间运行的l果也不一定一P(j)Q?br>Total memory is Q?031616<br>Initial free is : 1818488<br>Free memory after garbage collection : 1888808<br>Free memory after allocation : 1872224<br>Memory used by allocation : 16584<br>Free memory after collecting discarded integers : 1888808 </p> <p>leizhimin 51cto技术博?br>  </p> <p>leizhimin 51cto技术博?br>2、执行其他程?br>在安全的环境中,可以在多d操作pȝ中用JavaL行其他特别大的进E(也就是程序)(j)。ecec()Ҏ(gu)有几UŞ式命名想要运行的E序和它的输入参数。ecec()Ҏ(gu)q回一个Process对象Q可以用这个对象控制JavaE序与新q行的进E进行交互。ecec()Ҏ(gu)本质是依赖于环境?br>下面的例子是使用ecec()Ҏ(gu)启动windows的记事本notepad。这个例子必dWindows操作pȝ上运行?</p> <p>leizhimin 51cto技术博?br>//此实例来自《Java核心(j)技术》卷一<br>class ExecDemo {<br>    public static void main(String args[]){<br>        Runtime r = Runtime.getRuntime();<br>        Process p = null;<br>        try{<br>            p = r.exec("notepad");<br>        } catch (Exception e) {<br>            System.out.println("Error executing notepad.");<br>        }<br>    }<br>} </p> <p>leizhimin 51cto技术博?br>ecec()q有其他几种形式Q例子中演示的是最常用的一U。ecec()Ҏ(gu)q回Process对象后,在新E序开始运行后可以用Process的方法了(jin)。可以用destory()Ҏ(gu)杀dq程Q也可以使用waitFor()Ҏ(gu){待E序直到子程序结束,exitValue()Ҏ(gu)q回子进E结束时q回的倹{如果没有错误,返?Q否则返回非0。下面是关于ecec()Ҏ(gu)的例子的改进版本。例子被修改为等待,直到q行的进E退出:(x) </p> <p>leizhimin 51cto技术博?br>//此实例来自《Java核心(j)技术》卷一<br>class ExecDemoFini {<br>    public static void main(String args[]){<br>        Runtime r = Runtime.getRuntime();<br>        Process p = null;<br>        try{<br>            p = r.exec("notepad");<br>            p.waitFor();<br>        } catch (Exception e) {<br>            System.out.println("Error executing notepad.");<br>        }<br>        System.out.println("Notepad returned " + p.exitValue());<br>    }<br>}<br>下面是运行的l果Q当关闭C本后Q会(x)接着q行E序Q打C息)(j)Q?br>Notepad returned 0<br>hL键l? . . </p> <p><br>当子q程正在q行Ӟ可以Ҏ(gu)准输入输?gu)行读写。getOutputStream()Ҏ(gu)和getInPutStream()Ҏ(gu)q回对子q程的标准输入和输出?</p> <a ><u><font color=#800080></font></u></a> <img src ="http://www.tkk7.com/mayu/aggbug/122814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mayu/" target="_blank">my</a> 2007-06-08 12:02 <a href="http://www.tkk7.com/mayu/articles/122814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaE序员面试三十二?http://www.tkk7.com/mayu/articles/120851.htmlmymyWed, 30 May 2007 03:24:00 GMThttp://www.tkk7.com/mayu/articles/120851.htmlhttp://www.tkk7.com/mayu/comments/120851.htmlhttp://www.tkk7.com/mayu/articles/120851.html#Feedback0http://www.tkk7.com/mayu/comments/commentRss/120851.htmlhttp://www.tkk7.com/mayu/services/trackbacks/120851.html W二QAnonymous Inner Class Q匿名内部类Q?nbsp;是否?br> 以extendsQ承)(j)其它c,是否可以 
 implementsQ实玎ͼ(j)interfaceQ接口)(j)Q?nbsp;
 W三QStatic Nested Class ?nbsp;Inner Class的不同,说得
 多好Q面试题有的很笼l)(j)?nbsp;
 W四Q?amp;?amp;&的区别?nbsp;
 W五QHashMap和Hashtable的区别?nbsp;
 W六QCollection ?nbsp;Collections的区别?nbsp;
 W七Q什么时候用assert. 
 W八QGC是什么? Z么要有GCQ?nbsp;
 W九(ji)QString s = new StringQ?xyz"Q;创徏?jin)几个String 
 ObjectQ?nbsp;
 W十QMath.roundQ?1.5Q等於多? 
 Math.roundQ?11.5Q等於多? 
 W十一Qshort s1 = 1Q?nbsp;s1 = s1 + 1Q有什么错Q?nbsp;short 
 s1 = 1Q?nbsp;s1 += 1Q有什么错Q?nbsp;
 W十二,sleepQ)(j) ?nbsp;waitQ)(j) 有什么区别? 
 W十三,Java有没有gotoQ?nbsp;
 W十四,数组有没有lengthQ)(j)q个Ҏ(gu)Q?nbsp;String有没
 有lengthQ)(j)q个Ҏ(gu)Q?nbsp;
 W十五,Overload和Override的区别。Overloaded的方
 法是否可以改变返回值的cdQ?nbsp;
 W十六,Set里的元素是不能重复的Q那么用什么方?br> 来区分重复与否呢Q?nbsp;是用==q是equalsQ)(j)Q?nbsp;
 它们有何区别Q?nbsp;
 W十七,l我一个你最常见到的runtime exception. 
 W十八,error和exception有什么区别? 
 W十?ji),ListQ?nbsp;SetQ?nbsp;Map是否l承自Collection接口Q?nbsp;
 W二十,abstract class和interface有什么区别? 
 W二十一Qabstract的method是否可同时是staticQ是?br> 可同时是nativeQ是否可同时?nbsp;
 synchronizedQ?nbsp;
 W二十二Q接口是否可l承接口Q?nbsp;抽象cL否可实现Q?br> implementsQ接口? 抽象cL否可l承实体 
 c(concrete classQ? 
 W二十三Q启动一个线E是用runQ)(j)q是startQ)(j)Q?nbsp;
 W二十四Q构造器Constructor是否可被overrideQ?nbsp;
 W二十五Q是否可以承Stringc? 
 W二十六Q当一个线E进入一个对象的一
 个synchronizedҎ(gu)后,其它U程是否可进入此对象的其?nbsp;
 Ҏ(gu)Q?nbsp;
 W二十七Qtry {}里有一个return语句Q那么紧跟在q?br> 个try后的finally {}里的code?x)不会(x)被执?nbsp;
 Q什么时候被执行Q在return前还是后Q?nbsp;
 W二十八Q编E题Q?nbsp;用最有效率的Ҏ(gu)出2乘以8{於
 几? 
 W二十九(ji)Q两个对象值相同(x.equalsQyQ?nbsp;== trueQ,
 但却可有不同的hash codeQ这句话对不?nbsp;
 Q?nbsp;
 W三十,当一个对象被当作参数传递到一个方法后Q此
 Ҏ(gu)可改变这个对象的属性,q可q回变化?nbsp;
 的结果,那么q里到底是g递还是引用传递? 
 W三十一Qswtich是否能作用在byte上,是否能作?br> 在long上,是否能作用在String上? 
 W三十二Q编E题Q?nbsp;写一个Singleton出来?nbsp;
 以下是答?nbsp;
 W一Q谈谈finalQ?nbsp;finallyQ?nbsp;finalize的区别?nbsp;
 finalQ修饰符Q关键字Q如果一个类被声明ؓ(f)finalQ意
 味着它不能再z出新的子c,不能作ؓ(f)父类被ѝ因?br> 一个类不能既被声明?nbsp;abstract的,又被声明为final的。将
 变量或方法声明ؓ(f)finalQ?nbsp;可以保证它们在用中不被改变?br> 被声明ؓ(f)final的变量必d声明时给定初|而在以后的引
 用中只能 dQ不可修攏V被声明为final的方法也同样只能
 使用Q不能重载。finallyQ再异常处理时提?nbsp;finally 块来执行
 M清除操作。如果抛Z个异常,那么相匹配的 catch ?br> 句就?x)执行,然后控制׃?x)q入 finally 块(如果有的话)(j)?nbsp;
 finalizeQ方法名。Java 技术允怋?nbsp;finalizeQ)(j) Ҏ(gu)在垃
 圾收集器对象从内存中清除出?nbsp;之前做必要的清理工作?br> q个Ҏ(gu)是由垃圾攉器在定q个对象没有被引用时对这
 个对象调用的。它?nbsp;?nbsp;Object cM定义的,因此所有的c?br> 都承了(jin)它。子c覆?nbsp;finalizeQ)(j) Ҏ(gu)以整理系l资源或
 者执 行其他清理工作。finalizeQ)(j) Ҏ(gu)是在垃圾攉器删
 除对象之前对q个对象调用的?nbsp;
 W二QAnonymous Inner Class Q匿名内部类Q?nbsp;是否?br> 以extendsQ承)(j)其它c,是否可以 
 implementsQ实玎ͼ(j)interfaceQ接口)(j)Q?nbsp;
 匿名的内部类是没有名字的内部cR不能extendsQ?br> Q?nbsp;其它c,但一个内部类可以作ؓ(f)一个接?nbsp;
 Q由另一个内部类实现?nbsp;
 W三QStatic Nested Class ?nbsp;Inner Class的不同,说得
 多好Q面试题有的很笼l)(j)?nbsp;
 Nested Class Q一般是C++的说法)(j)QInner Class Q一
 般是JAVA的说法)(j)。Java内部cMC++嵌套 
 cL大的不同在于是否有指向外部的引用上。具体可
 见httpQ?nbsp;
 //www.frontfree.net/articles/services/view.aspQid=704&page
 =1 
 注:(x) ?rn)态内部类QInner ClassQ意味着1创徏一个static
 内部cȝ对象Q不需要一个外部类对象Q? 
 不能从一个static内部cȝ一个对象访问一个外部类对象 
 W四Q?amp;?amp;&的区别?nbsp;
 &是位q算W?amp;&是布?yu)(dng)逻辑q算W?nbsp;
 W五QHashMap和Hashtable的区别?nbsp;
 都属于Map接口的类Q实C(jin)惟一键映到特定的?br> 上?nbsp;
 HashMap cL有分cL者排序。它允许一?nbsp;null 键和?br> ?nbsp;null 倹{?nbsp;
 Hashtable cM?nbsp;HashMapQ但是不允许 null 键和 null 
 倹{它也比 HashMap 慢,因ؓ(f)它是同步 
 的?nbsp;
 W六QCollection ?nbsp;Collections的区别?nbsp;
 Collections是个java.util下的c,它包含有各种有关集合
 操作的静(rn)态方法?nbsp;
 Collection是个java.util下的接口Q它是各U集合结构的?br> 接口?nbsp;
 W七Q什么时候用assert?nbsp;
 断言是一个包含布?yu)(dng)表辑ּ的语句,在执行这个语句时假?br> 该表辑ּ?nbsp;true。如果表辑ּ计算?nbsp;falseQ那么系l会(x)报告
 一?nbsp;AssertionError。它用于调试目的Q?nbsp;
 assert(a > 0); // throws an AssertionError if a <= 0 
 断言可以有两UŞ式:(x) 
 assert Expression1 ; 
 assert Expression1 : Expression2 ; 
 Expression1 应该L产生一个布?yu)(dng)倹{?nbsp;
 Expression2 可以是得Z个值的L表达式。这个值用?br> 生成昄更多调试信息?nbsp;String 消息?nbsp;
 断言在默认情况下是禁用的。要在编译时启用断言Q需要
 ?nbsp;source 1.4 标记Q?nbsp;
 javac -source 1.4 Test.java 
 要在q行时启用断aQ可使用 -enableassertions 或?nbsp;-ea ?br> 记?nbsp;
 要在q行旉择用断言Q可使用 -da 或?nbsp;
 -disableassertions 标记?nbsp;
 要系l类中启用断aQ可使用 -esa 或?nbsp;-dsa 标记。还可以
 在包的基上启用或者禁用断a?nbsp;可以在预计正常情况下?br> ?x)到辄M位置上放|断a。断a可以用于验证传递给U?br> 有方法的参数。不q,断言不应该用于验证传递给公有Ҏ(gu)
 的参敎ͼ因ؓ(f)不管是否启用?jin)断aQ公有方法都必须(g)查其
 参数。不q,既可以在公有Ҏ(gu)中,也可以在非公有方法中
 利用断言试后置条g。另外,断言不应该以M方式改变
 E序的状态?nbsp;
 W八QGC是什? Z么要有GC? (基础)?nbsp;
 GC是垃圾收集器。Java E序员不用担?j)内存管理,因?f)?br> 圾收集器?x)自动进行管理。要h垃圾?nbsp;
 集,可以调用下面的方法之一Q?nbsp;
 System.gc() 
 Runtime.getRuntime().gc() 
 W九(ji)QString s = new String("xyz");创徏?jin)几个String Object? 
 两个对象Q一个是"xyx",一个是指向"xyx"的引用对象s?nbsp;
 W十QMath.round(11.5){於多少? Math.round(-11.5){於?br> ? 
 Math.round(11.5)q回QlongQ?2QMath.round(-11.5)q?br> 回(longQ?11; 
 W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 
 += 1;有什么错? 
 short s1 = 1; s1 = s1 + 1;有错Qs1是short型,s1+1是int??br> 能显式{化ؓ(f)short型。可修改?nbsp;s1 =(short)(s1 + 1) 。short 
 s1 = 1; s1 += 1正确?nbsp;
 W十二,sleep() ?nbsp;wait() 有什么区? 搞线E的最?nbsp;
 sleep()Ҏ(gu)是ɾU程停止一D|间的Ҏ(gu)。在sleep 旉?br> 隔期满后Q线E不一定立x复执行?nbsp;q是因ؓ(f)在那个时?br> Q其它线E可能正在运行而且没有被调度ؓ(f)攑ּ执行Q除
 ?a)"醒来"的线E具有更高的优先U,(b)正在q行的线E因
 为其它原因而阻塞?nbsp;
 wait()是线E交互时Q如果线E对一个同步对象x 发出一
 个wait()调用Q该U程?x)暂停执行,被调对象q入{待状态,
 直到被唤醒或{待旉到?nbsp;
 W十三,Java有没有goto? 
 Goto?java中的保留字,现在没有在java中用?nbsp;
 W十四,数组有没有length()q个Ҏ(gu)? String有没有length()
 q个Ҏ(gu)Q?nbsp;
 数组没有length()q个Ҏ(gu)Q有length的属性?nbsp;
 String有有length()q个Ҏ(gu)?br>  
 W十五,Overload和Override的区别。Overloaded的方法是
 否可以改变返回值的cd? 
 Ҏ(gu)的重写Overriding和重载Overloading是Java多态性的?br> 同表现。重写Overriding是父cM子类 之间多态性的一U表
 玎ͼ重蝲Overloading是一个类中多态性的一U表现。如果在
 子类中定义某Ҏ(gu)与其父类有相同的名称和参敎ͼ我们说该
 Ҏ(gu)被重?nbsp;(Overriding)。子cȝ对象使用q个Ҏ(gu)Ӟ调
 用子cM的定义,对它而言Q父cM的定义如同被"屏蔽"?br> 。如果在一个类中定义了(jin)多个同名的方法,它们或有不同?br> 参数个数或有不同的参数类型,则称为方法的?br> ?Overloading)。Overloaded的方法是可以改变q回值的c?br> 型?nbsp;
 W十六,Set里的元素是不能重复的Q那么用什么方法来?br> 分重复与否呢? 是用==q是equals()? 它们有何区别? 
 Set里的元素是不能重复的Q那么用iterator()Ҏ(gu)来区分重?br> 与否。equals()是判M个Set是否?nbsp;{?nbsp;
 equals()?=Ҏ(gu)军_引用值是否指向同一对象equals()在类
 中被覆盖Qؓ(f)的是当两个分ȝ对象的内容和cd盔R的话
 Q返回真倹{?nbsp;
 W十七,l我一个你最常见到的runtime exception?nbsp;
 ArithmeticException, ArrayStoreException, 
 BufferOverflowException, 
 BufferUnderflowException, CannotRedoException, 
 CannotUndoException, ClassCastException, 
 CMMException, ConcurrentModificationException, 
 DOMException, EmptyStackException, 
 IllegalArgumentException, IllegalMonitorStateException, 
 IllegalPathStateException, 
 IllegalStateException, ImagingOpException, 
 IndexOutOfBoundsException, 
 MissingResourceException, NegativeArraySizeException, 
 NoSuchElementException, 
 NullPointerException, ProfileDataException, 
 ProviderException, RasterFormatException, 
 SecurityException, SystemException, 
 UndeclaredThrowableException, UnmodifiableSetException, 
 UnsupportedOperationException 
 W十八,error和exception有什么区? 
 error 表示恢复不是不可能但很困隄情况下的一U严重问?br> 。比如说内存溢出。不可能指望E序能处理这L(fng)情况?nbsp;
 exception 表示一U设计或实现问题。也是_(d)它表C如?br> E序q行正常Q从不会(x)发生的情c(din)?nbsp;
 W十?ji),List, Set, Map是否l承自Collection接口? 
 ListQSet?nbsp;
 Map不是 
 W二十,abstract class和interface有什么区? 
 声明Ҏ(gu)的存在而不d现它的类被叫做抽象类Qabstract 
 classQ,它用于要创徏一个体现某些基本行为的c,qؓ(f)?br> cd明方法,但不能在该类中实现该cȝ情况。不能创
 建abstract cȝ实例。然而可以创Z个变量,其类型是一
 个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象?br> 造函数或抽象?rn)态方法。Abstract cȝ子类为它们父cM?br> 所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ(f)。取而代?br> Q在子类中实现该Ҏ(gu)。知道其行ؓ(f)的其它类可以在类中实
 现这些方法?nbsp;
 接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都
 是抽象的。多l承性可通过实现q样的接口而获得。接口中
 的所有方法都是抽象的Q没有一个有E序体。接口只可以?br> 义static final成员变量。接口的实现与子cȝ|除了(jin)该实?br> cM能从接口定义中承行为。当cd现特D接口时Q它?br> 义(卛_E序体给予)(j)所有这U接口的Ҏ(gu)。然后,它可?br> 在实C(jin)该接口的cȝM对象上调用接口的Ҏ(gu).׃有抽
 象类Q它允许使用接口名作为引用变量的cd。通常的动?br> 联编生效。引用可以{换到接口cd或从接口cd?br> 换,instanceof q算W可以用来决定某对象的类是否实现?br> 接口?nbsp;
 W二十一Qabstract的method是否可同时是static,是否可同?br> 是nativeQ是否可同时?nbsp;
 synchronized? 
 都不?nbsp;
 W二十二Q接口是否可l承接口? 抽象cL否可?br> ?implements)接口? 抽象cL否可l承实体c?nbsp;
 (concrete class)? 
 接口可以l承接口。抽象类可以实现(implements)接口Q抽?br> cL否可l承实体c,但前提是实体cdL明确的构造函
 数?nbsp;
 W二十三Q启动一个线E是用run()q是start()? 
 启动一个线E是调用start()Ҏ(gu)QɾU程所代表的虚拟处?br> 机处于可q行状态,q意味着它可以由JVM调度q执行。这
 q不意味着U程׃(x)立即q行。run()Ҏ(gu)可以产生必须退?br> 的标志来停止一个线E?nbsp;
  
 W二十四Q构造器Constructor是否可被override? 
 构造器Constructor不能被承,因此不能重写OverridingQ但
 可以被重载Overloading?nbsp;
 W二十五Q是否可以承Stringc? 
 StringcLfinalcL不可以ѝ?nbsp;
 W二十六Q当一个线E进入一个对象的一个synchronized?br> 法后Q其它线E是否可q入此对象的其它Ҏ(gu)? 
 不能Q一个对象的一个synchronizedҎ(gu)只能׃个线E访
 问?nbsp;
 W二十七Qtry {}里有一个return语句Q那么紧跟在q个try?br> 的finally {}里的code?x)不会(x)被执行Q什么时候被?br> 行,在return前还是后? 
 ?x)执行,在return前执行?nbsp;
 W二十八Q编E题: 用最有效率的Ҏ(gu)出2乘以8{於? 
 有C背景的程序员特别喜欢问这U问题?nbsp;
 2 << 3 
 W二十九(ji)Q两个对象值相?x.equals(y) == true)Q但却可?br> 不同的hash codeQ这句话对不? 
 不对Q有相同的hash code?nbsp;
 W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ(gu)
 可改变这个对象的属性,q可q回变化后的l果Q那么这?br> 到底是g递还是引用传? 
 是g递。Java ~程语言只由g递参数。当一个对象实?br> 作ؓ(f)一个参数被传递到Ҏ(gu)中时Q参数的值就是对该对象的
 引用。对象的内容可以在被调用的方法中改变Q但对象的引
 用是永远不会(x)改变的?nbsp;
 W三十一Qswtich是否能作用在byte上,是否能作用在long?br> Q是否能作用在String? 
 switchQexpr1Q中Qexpr1是一个整数表辑ּ。因此传递给 
 switch ?nbsp;case 语句的参数应该是 int?nbsp;short?nbsp;char 或?nbsp;
 byte。long,string 都不能作用于swtich?nbsp;
 W三十二Q编E题: 写一个Singleton出来?nbsp;
 Singleton模式主要作用是保证在Java应用E序中,一?br> cClass只有一个实例存在?nbsp;
 一般Singleton模式通常有几U种形式: 
 W一UŞ? 定义一个类Q它的构造函Cؓ(f)private的,
 它有一个static的private的该cd量, 在类初始化时实例?br> Q通过一个public的getInstanceҎ(gu)获取对它的引?l而调
 用其中的Ҏ(gu)?nbsp;
 public class Singleton { 
 private Singleton(){} 
 //在自己内部定义自׃个实例,是不是很奇怪? 
 //注意q是private 只供内部调用 
 private static Singleton instance = new Singleton(); 
 //q里提供?jin)一个供外部讉K本class的静(rn)态方法,可以直接
 讉K 
 public static Singleton getInstance() { 
 return instance; 
 } 
 } 
 W二UŞ? 
 public class Singleton { 
 private static Singleton instance = null; 
 public static synchronized Singleton getInstance() { 
 //q个Ҏ(gu)比上面有所改进Q不用每ơ都q行生成对象Q只
 是第一?nbsp;
 //使用时生成实例,提高?jin)效率?nbsp;
 if (instance==null) 
 instanceQnew Singleton(); 
 return instance; } 
 } 
 其他形式: 
 定义一个类Q它的构造函Cؓ(f)private的,所有方法ؓ(f)static?br> ?nbsp;
 一般认为第一UŞ式要更加安全?nbsp;
 W三十三 Hashtable和HashMap 
 Hashtablel承自Dictionaryc,而HashMap是Java1.2引进?br> Map interface的一个实?nbsp;
 HashMap允许null作ؓ(f)一个entry的key?br> 者valueQ而Hashtable不允?nbsp;
 q有是QHashMap把Hashtable的containsҎ(gu)L?jin),?br> 成containsvalue和containsKey。因?nbsp;containsҎ(gu)Ҏ(gu)让h
 引v误解?nbsp;
 最大的不同是,Hashtable的方?br> 是Synchronize的,而HashMap不是Q在多个U程?br> 问HashtableӞ不需要自׃ؓ(f)它的Ҏ(gu)实现?br> 步,而HashMap必Mؓ(f)之提供外同步?nbsp;
 Hashtable和HashMap采用的hash/rehash法都大概一P
 所以性能不会(x)有很大的差异 


my 2007-05-30 11:24 发表评论
]]>
详细解析Java中抽象类和接口的区别 转帖http://www.tkk7.com/mayu/articles/120813.htmlmymyWed, 30 May 2007 02:07:00 GMThttp://www.tkk7.com/mayu/articles/120813.htmlhttp://www.tkk7.com/mayu/comments/120813.htmlhttp://www.tkk7.com/mayu/articles/120813.html#Feedback0http://www.tkk7.com/mayu/comments/commentRss/120813.htmlhttp://www.tkk7.com/mayu/services/trackbacks/120813.html 

 
 理解抽象c?br> abstract class和interface在Java语言中都是用来进行抽象类Q本?nbsp;中的抽象cdƈ非从abstract class译而来Q它表示的是一个抽象体Q而abstract class为Java语言中用于定义抽象类的一U方法, 误者注意区分)(j)定义的,那么什么是抽象c,使用抽象c能为我们带来什么好处呢Q?/p>

 ?nbsp;面向对象的概念中Q我们知道所有的对象都是通过cL描绘的,但是反过来却不是q样。ƈ不是 所有的c都是用来描l对象的Q如果一个类中没有包含够的信息来描l一个具体的对象Q这L(fng)cd是抽象类。抽象类往往用来表征我们在对问题领域q行分析?nbsp;设计中得出的抽象概念Q是对一pd看上M同,但是本质上相同的具体概念的抽象。比如:(x)如果我们q行一个图形编辑Y件的开发,׃(x)发现问题领域存在着圆?nbsp;三角形这样一些具体概念,它们是不同的Q但是它们又都属于Ş状这样一个概念,形状q个概念在问题领域是不存在的Q它?yu)是一个抽象概c(din)正是因为抽象的概念 在问题领域没有对应的具体概念Q所以用以表征抽象概늚抽象cL不能够实例化的?/p>

 在面向对象领域,抽象cM要用来进行类型隐藏?nbsp;我们可以构造出一个固定的一l行为的抽象?nbsp;qͼ但是q组行ؓ(f)却能够有L个可能的具体实现方式。这个抽象描q就是抽象类Q而这一lQ意个可能的具体实现则表现为所有可能的zcR模块可以操作一?nbsp;抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允怿改的Q同Ӟ通过从这个抽象体zQ也可扩展此模块的行为功能。熟(zhn)OCP的读者一定知 道,Z(jin)能够实现面向对象设计的一个最核心(j)的原则OCP(Open-Closed Principle)Q抽象类是其中的关键所在?/p>

 从语法定义层面看abstract class ?nbsp;interface
 在语法层面,Java语言对于abstract class和interfacel出?jin)不同的定义方式Q下面以定义一个名为Demo的抽象类Z来说明这U不同?/p>

 使用abstract class的方式定义Demo抽象cȝ方式如下Q?/p>

 abstract class Demo?br>     abstract void method1();
     abstract void method2();
     …
 ?/p>

 使用interface的方式定义Demo抽象cȝ方式如下Q?/p>

 interface Demo{
     void method1();
     void method2();
     …
 }

 在abstract class方式中,Demo可以有自q数据成员Q也可以有非 abstract的成员方法,而在interface方式的实CQDemo只能够有?rn)态的不能被修改的数据成员Q也是必须是static final 的,不过在interface中一般不定义数据成员Q,所有的成员Ҏ(gu)都是abstract的。从某种意义上说Qinterface是一U特DŞ式的 abstract class?/p>

 从编E的角度来看Qabstract class和interface都可以用来实?nbsp;"design by contract" 的思想。但是在具体的用上面还是有一些区别的?/p>

 首先Qabstract class ?nbsp;Java 语言中表C的是一U承关p,一个类只能使用一ơ承关p?因ؓ(f)Java不支持多l承 -- 转注)。但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折中考虑吧?/p>

 其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ(f)。但是在interface的定义中Q方法却不能拥有默认行ؓ(f)Qؓ(f)?jin)绕q这个限Ӟ必须使用委托Q但是这?x)增加一些复杂性,有时?x)造成很大的麻?ch)?/p>

 ?nbsp;抽象cM不能定义默认行ؓ(f)q存在另一个比较严重的问题Q那是可能?x)造成l护上的ȝ(ch)。因 为如果后来想修改cȝ界面Q一般通过 abstract class 或者interface来表C)(j)以适应新的情况Q比如,d新的Ҏ(gu)或者给已用的方法中?nbsp;加新的参敎ͼ(j)Ӟ׃(x)非常的麻?ch),可能要花费很多的旉Q对于派生类很多的情况,ؓ(f)如此Q。但是如果界面是通过abstract class来实现的Q那 么可能就只需要修改定义在abstract class中的默认行ؓ(f)可以了(jin)?/p>

 同样Q如果不能在抽象cM定义默认行ؓ(f)Q就?x)导致同L(fng)Ҏ(gu)实现出现在该抽象cȝ每一个派生类中,q反?nbsp;"one ruleQone place" 原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小?j)?/p>

 从设计理念层面看 abstract class ?nbsp;interface
 ?nbsp;面主要从语法定义和编E的角度?jin)abstract class和interface的区 别,q些层面的区别是比较低层ơ的、非本质的。本节从另一个层面:(x)abstract class和interface所反映出的设计理念Q来分析一下二 者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在?/p>

 ?nbsp;面已l提到过Qabstract class在Java语言中体C(jin)一U承关p,要想使得 l承关系合理Q父cdzcM间必d?is-a"关系Q即父类和派生类在概忉|质上应该是相同的Q参考文献?〕中有关?is-a"关系的大幅?nbsp;入的 Q有兴趣的读者可以参考)(j)。对于interface来说则不?dng)q不要求interface的实现者和interface定义在概忉|质上是一致的Q?nbsp;仅仅是实C(jin)interface定义的契U而已。ؓ(f)?jin)便于理解Q下面将通过一个简单的实例q行说明?/p>

 考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:(x)

 使用abstract class方式定义DoorQ?/p>

 abstract class Door{
     abstract void open();
     abstract void close()Q?br> }

 使用interface方式定义DoorQ?/p>

 interface Door{
     void open();
     void close();
 }

 其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别?/p>

  

 ?nbsp;果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中, 主要是ؓ(f)?jin)展C?nbsp;abstract class 和interface 反映在设计理念上的区别,其他斚w无关的问题都做了(jin)化或者忽略)(j)Q下面将|列出可能的?nbsp;x案,q从设计理念层面对这些不同的Ҏ(gu)q行分析?/p>

 解决Ҏ(gu)一Q?/p>

 单的在Door的定义中增加一个alarmҎ(gu)Q如下:(x)

 abstract class Door{
     abstract void open();
     abstract void close()Q?br>     abstract void alarm();
 }

 或?/p>

 interface Door{
     void open();
     void close();
     void alarm();
 }

 那么h报警功能的AlarmDoor的定义方式如下:(x)

 class AlarmDoor extends Door{
     void open(){…}
     void close(){…}
     void alarm(){…}
 }

 或?/p>

 class AlarmDoor implements Door?br>     void open(){…}
     void close(){…}
     void alarm(){…}
 ?/p>

 q种Ҏ(gu)q反?jin)面向对象设计中的一个核?j)原?nbsp;ISP (Interface Segregation Principle)Q在Door的定义中把Door概念本n固有的行为方法和另外一个概?报警?的行为方 法؜在了(jin)一赗这样引L(fng)一个问题是那些仅仅依赖于Doorq个概念的模块会(x)因ؓ(f)"报警?q个概念的改变(比如Q修改alarmҎ(gu)的参敎ͼ(j)而改变,?nbsp;之依然?/p>

 解决Ҏ(gu)二:(x)

 ?nbsp;然open、close和alarm属于两个不同的概念,Ҏ(gu)ISP原则应该把它们分别定 义在代表q两个概늚抽象cM。定义方式有Q这两个概念都?nbsp;abstract class 方式定义Q两个概念都使用interface方式定义Q一个概?nbsp;使用 abstract class 方式定义Q另一个概念用interface方式定义?/p>

 昄Q由于Java语言不支持多重承,所以两个概念都使用abstract class方式定义是不可行的。后面两U方式都是可行的Q但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意囄反映是否正确、合理。我们一一来分析、说明?/p>

 ?nbsp;果两个概念都使用interface方式来定义,那么反映出两个问题Q?、我们可能没?nbsp;理解清楚问题领域QAlarmDoor在概忉|质上到底是Doorq是报警器?2、如果我们对于问题领域的理解没有问题Q比如:(x)我们通过对于问题领域的分 析发现AlarmDoor在概忉|质上和Door是一致的Q那么我们在实现时就没有能够正确的揭C我们的设计意图Q因为在q两个概늚定义上(均?nbsp;interface方式定义Q反映不Zq含义?/p>

 ?nbsp;果我们对于问题领域的理解是:(x)AlarmDoor在概忉|质上是DoorQ同时它有具有报 警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢Q前面已l说q,abstract class在Java语言中表CZU承关p,而承关p?nbsp;在本质上?is-a"关系。所以对于Doorq个概念Q我们应该用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,?nbsp;明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所C:(x)

 abstract class Door{
     abstract void open();
     abstract void close()Q?br> }
 interface Alarm{
     void alarm();
 }
 class Alarm Door extends Door implements Alarm{
     void open(){…}
     void close(){…}
     void alarm(){…}
 }

 q?nbsp;U实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭C我们的设计意图。其 实abstract class表示的是"is-a"关系Qinterface表示的是"like-a"关系Q大家在选择时可以作Z个依据,当然q是建立在对 问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又hDoor的功能,那么上述的定义方式就要反q来?jin)?/p>

  

 结
 1.abstract class ?nbsp;Java 语言中表C的是一U承关p,一个类只能使用一ơ承关pR但是,一个类却可以实现多个interface?br> 2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有?rn)态的不能被修改的数据成员Q也是必须是static final的,不过?nbsp;interface中一般不定义数据成员Q,所有的成员Ҏ(gu)都是abstract的?br> 3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系Qinterface表示的是"like-a"关系?nbsp;
 4.实现抽象cd接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现Ҏ(gu)?br> 5.接口中定义的变量默认是public static final 型,且必ȝ其初|所以实现类中不能重新定义,也不能改变其倹{?br> 6.抽象cM的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋倹{?nbsp;
 7.接口中的Ҏ(gu)默认都是 public,abstract cd的?br> l论

 abstract class ?nbsp;interface ?nbsp;Java语言中的两种定义抽象cȝ方式Q它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概 忉|质的理解、对于设计意囄反映是否正确、合理,因ؓ(f)它们表现?jin)概念间的不同的关系Q虽焉能够实现需求的功能Q。这其实也是语言的一U的惯用法,希望 读者朋友能够细l体?x)?/p>

 参考文?br> [1] Thinking in Java, Bruce Eckel
 [2] Design Patterns Explained: A New Perspective on Object-Oriented Design, Alan Shalloway and James R. Trott
 [3] Effective C++: 50 Specific Ways to Improve Your Programs and Design, Scott Meyers



my 2007-05-30 10:07 发表评论
]]>
区分引用cd和原始类?/title><link>http://www.tkk7.com/mayu/articles/120647.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Tue, 29 May 2007 03:35:00 GMT</pubDate><guid>http://www.tkk7.com/mayu/articles/120647.html</guid><wfw:comment>http://www.tkk7.com/mayu/comments/120647.html</wfw:comment><comments>http://www.tkk7.com/mayu/articles/120647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mayu/comments/commentRss/120647.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mayu/services/trackbacks/120647.html</trackback:ping><description><![CDATA[<font face=宋体>Java 提供两种不同的类型:(x)引用cd和原始类型(或内|类型)(j)。另外,Java qؓ(f)每个原始cd提供?jin)封装?Wrapper)。如果需要一个整型变量,是用基本的 int 型呢Q还是?Integer cȝ一个对象呢Q如果需要声明一个布?yu)(dng)类型,是用基本?booleanQ还是用Boolean cȝ一个对象呢Q本文可帮助(zhn)作出决定? <p>下面列出?jin)原始类型以及(qing)它们的对象装cR?/p> <p>原始cd封装类<br>booleanBoolean<br>char Character<br>byte Byte<br>shortShort<br>intInteger<br>long Long<br>floatFloat<br>double?Double</p> <p>引用cd和原始类型的行ؓ(f)完全不同Qƈ且它们具有不同的语义。例如,假定一个方法中有两个局部变量,一个变量ؓ(f) int 原始cdQ另一个变量是对一?Integer 对象的对象引用:(x)</p> <p>int i = 5;                       // 原始cd<br>Integer j = new Integer(10);     // 对象引用<br> <br>q两个变量都存储在局部变量表中,q且都是?Java 操作数堆栈中操作的,但对它们的表C却完全不同。(本文中以下部分将用通用术语堆栈代替操作数堆栈或局部变量表。)(j)原始cd int 和对象引用各占堆栈的 32 位。(要表CZ?int 或一个对象引用,Java 虚拟机实现至需要?32 位存储。)(j)Integer 对象的堆栈项q不是对象本w,而是一个对象引用?/p> <p>Java 中的所有对象都要通过对象引用讉K。对象引用是指向对象存储所在堆中的某个区域的指针。当声明一个原始类型时Q就为类型本w声明了(jin)存储。前面的两行代码表示如下Q?/p> <p>引用cd和原始类型具有不同的特征和用法,它们包括Q大和速度问题Q这U类型以哪种cd的数据结构存储,当引用类型和原始cd用作某个cȝ实例数据时所指定的缺省倹{对象引用实例变量的~省gؓ(f) nullQ而原始类型实例变量的~省g它们的类型有兟?/p> <p>许多E序的代码将同时包含原始cd以及(qing)它们的对象封装。当(g)查它们是否相{时Q同时用这两种cdq了(jin)解它们如何正相互作用和共存成为问题。程序员必须?jin)解q两U类型是如何工作和相互作用的Q以避免代码出错?/p> <p>例如Q不能对原始cd调用Ҏ(gu)Q但可以对对象调用方法:(x)</p> <p>int j = 5;<br>j.hashCode();     // 错误<br>//...<br>Integer i = new Integer(5);<br>i.hashCode();     // 正确</p> <p>使用原始cd无须调用 newQ也无须创徏对象。这节省?jin)时间和I间。؜合用原始类型和对象也可能导致与赋值有关的意外l果。看h没有错误的代码可能无法完成?zhn)希望做的工作。例如:(x)</p> <p>import java.awt.Point;<br>class Assign<br>{<br>public static void main(String args)<br>{<br>   int a = 1;<br>   int b = 2;<br>   Point x = new Point(0,0);<br>   Point y = new Point(1,1);                  // 1<br>   System.out.println("a is " + a);<br>   System.out.println("b is " + b);<br>   System.out.println("x is " + x);<br>   System.out.println("y is " + y);<br>   System.out.println("Performing assignment and " + <br>                      "setLocation..."); <br>   a = b;<br>   a++;<br>   x = y;                                    // 2<br>   x.setLocation(5,5);                       // 3<br>   System.out.println("a is "+a); <br>   System.out.println("b is "+b); <br>   System.out.println("x is "+x); <br>   System.out.println("y is "+y);<br>}<br>}</p> <p>q段代码生成以下输出Q?/p> <p>a is 1<br>b is 2<br>x is java.awt.Point<br>y is java.awt.Point<br>Performing assignment and setLocation...<br>a is 3<br>b is 2<br>x is java.awt.Point<br>y is java.awt.Point</p> <p>修改整数 a ?b 的结果没什么意外的地方。b 的D赋予整型变量 aQ结?a 的值增加了(jin) 1。这一输出反映?jin)我们希望发生的情况。但是,令h感到意外的,是在赋值ƈ调用 setLocation之后 x ?y 对象的输出。我们在完成 x = y 赋g后特意对 x 调用?setLocationQx ?y 的值怎么?x)相同呢Q我们毕竟将 y 赋予 xQ然后更改了(jin) xQ这与我们对整数 a ?b q行的操作没什么不同?/p> <p>q种h是由原始cd和对象的使用造成的。赋值对q两U类型所L(fng)作用没什么不同。但它可能看h所有不同。赋gɽ{号 (=) 左边的值等于右边的倹{这一点对于原始类型(如前面的 int a ?bQ是显而易见的。对于非原始cdQ如 Point 对象Q,赋g改的是对象引用,而不是对象本w。因此,在语?x = y; 之后Qx {于 y。换句话_(d)因ؓ(f) x ?y 是对象引用,它们现在引用同一个对象。因此,?x 所作的M更改也会(x)更改 y?br> <br>因ؓ(f) x ?y 引用同一个对象,所以对 x 执行的所有方法与?y 执行的方法都作用于同一个对象?/p> <p>区分引用cd和原始类型ƈ理解引用的语义是很重要的。若做不到这一点,则会(x)使编写的代码无法完成预定工作?/p> =========================================================================<br><br><br>Java 提供两种不同的类型:(x)引用cd和原始类型(或内|类型)(j)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java</font> <p><font face=宋体>为每个原始类型提供了(jin)装cR?br>原始cd装c?booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble<br>引用cd和原始类型的行ؓ(f)完全不同Qƈ且它们具有不同的语义。引用类型和原始cdh不同的特征和用法Q它们包括:(x)大小和速度问题Q?/font></p> <p><font face=宋体>q种cd以哪U类型的数据l构存储Q当引用cd和原始类型用作某个类的实例数据时所指定的缺省倹{对象引用实例变量的~省gؓ(f) nullQ?/font></p> <p><font face=宋体>而原始类型实例变量的~省g它们的类型有?br><br></p> <p>在java中一切都是以cMؓ(f)基础的,q且java对基本的数据cd也进行了(jin)装Q如下所C,介l几个基本的数据cd?qing)其装c:(x)</p> <p>1  Boolean VS boolean</p> <dl> <dt> <pre>public final class <strong>Boolean</strong><dt>extends <a title="java.lang 中的c? href="file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Object.html"><font color=#0000ff><u>Object</u></font></a><dt>implements <a title="java.io 中的接口" href="file:///G:/html_zh_CN/html/zh_CN/api/java/io/Serializable.html"><font color=#0000ff><u>Serializable</u></font></a>, <a title="java.lang 中的接口" href="file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Comparable.html"><font color=#0000ff><u>Comparable</u></font></a><<a title="java.lang 中的c? href="file:///G:/html_zh_CN/html/zh_CN/api/java/lang/Boolean.html"><font color=#0000ff><u>Boolean</u></font></a>></dt></pre> </dt></dl> <pre> </pre> <p>Boolean cd基本cd?<code><font face=新宋?boolean</font></code> 的值包装在一个对象中。一?<code><font face=新宋?Boolean</font></code> cd的对象只包含一个类型ؓ(f) <code><font face=新宋?boolean</font></code> 的字Dc(din)?</p> <p>此外Q此c还?<code><font face=新宋?boolean</font></code> ?<code><font face=新宋?String</font></code> 的相互{换提供了(jin)许多Ҏ(gu)Qƈ提供?jin)处?<code><font face=新宋?boolean</font></code> 旉常有用的其他一些常量和Ҏ(gu)?br>.............<br>Byte  QCharacter  QDouble  {等都是一?br><br><strong>表A Java原始数据cd<br></strong><br>单类?大小 范围/_ֺ <br><br>float 4 字节 32位IEEE 754单精?<br><br>double 8 字节 64位IEEE 754双精?<br><br>byte 1字节 -128?27 <br><br>short 2 字节 -32,768?2,767 <br><br>int 4 字节 -2,147,483,648?,147,483,647 <br><br>long 8 字节 -9,223,372,036,854,775,808?,223,372,036, 854,775,807 <br><br>char 2 字节 整个Unicode字符?<br><br>boolean 1 ?True或者f(xi)alse <br></font></p> <img src ="http://www.tkk7.com/mayu/aggbug/120647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mayu/" target="_blank">my</a> 2007-05-29 11:35 <a href="http://www.tkk7.com/mayu/articles/120647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.util.Date 构造函?/title><link>http://www.tkk7.com/mayu/articles/119466.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Wed, 23 May 2007 10:12:00 GMT</pubDate><guid>http://www.tkk7.com/mayu/articles/119466.html</guid><wfw:comment>http://www.tkk7.com/mayu/comments/119466.html</wfw:comment><comments>http://www.tkk7.com/mayu/articles/119466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mayu/comments/commentRss/119466.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mayu/services/trackbacks/119466.html</trackback:ping><description><![CDATA[1. Date = new Date(); <br>不介l了(jin)<br>2. Date = new Date(107, 0, 1);<br>三个参数是year,month,day,都是int型,<br>107代表2007Q是减去1900得到的数Q比如要new一?005q的Q就?05Q?999q的是99<br>0代表1月,q里月䆾?-11的数字,0代表1月,1代表2月,依此cL<br>1表示天数Q数字范?-31<br>3. Date = new Date(65, 2, 6, 9, 30, 15, 0);<br>public Date([yearOrTimevalue:Number], [month:Number], [date:Number], [hour:Number], [minute:Number], [second:Number], [millisecond:Number])<br>_到毫U?br> <img src ="http://www.tkk7.com/mayu/aggbug/119466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mayu/" target="_blank">my</a> 2007-05-23 18:12 <a href="http://www.tkk7.com/mayu/articles/119466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些基的精?/title><link>http://www.tkk7.com/mayu/articles/92819.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Wed, 10 Jan 2007 01:54:00 GMT</pubDate><guid>http://www.tkk7.com/mayu/articles/92819.html</guid><wfw:comment>http://www.tkk7.com/mayu/comments/92819.html</wfw:comment><comments>http://www.tkk7.com/mayu/articles/92819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mayu/comments/commentRss/92819.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mayu/services/trackbacks/92819.html</trackback:ping><description><![CDATA[1?对象的初始化 <br />(1) 非静(rn)态对象的初始?<br />在创建对象时Q对象所在类的所有数据成员会(x)首先q行初始化?<br />基本cdQint型,初始化ؓ(f)0?<br />如果为对象:(x)q些对象?x)按序初始化?<br />d所有类成员初始化完成之后,才调用本cȝ构造方法创建对象?<br />构造方法的作用是初始化?<br />(2) ?rn)态对象的初始?<br />E序中主cȝ?rn)态变量会(x)在mainҎ(gu)执行前初始化?<br />不仅W一ơ创建对象时Q类中的所有静(rn)态变量都初始化,q且W一ơ访问某c(注意此时 <br />未创建此cd象)(j)的静(rn)态对象时Q所有的?rn)态变量也要按它们在类中的序初始化?<br />2?l承Ӟ对象的初始化q程 <br />(1) ȝ的超cȝ高到低按序初始化静(rn)态成员,无论?rn)态成员是否ؓ(f)private?<br />(2) ȝ?rn)态成员的初始化?<br />(3) ȝ的超cȝ高到低进行默认构造方法的调用。注意,在调用每一个超cȝ默认构?<br />Ҏ(gu)前,先进行对此超c进行非?rn)态对象的初始化?<br />(4) ȝ非静(rn)态成员的初始化?<br />(5) 调用ȝ的构造方法?<br />3?关于构造方?<br />(1) cd以没有构造方法,但如果有多个构造方法,应该要有默认的构造方法,否则在承此cLQ需要在子类中显式调用父cȝ某一个非默认的构造方法了(jin)?<br />(2) 在一个构造方法中Q只能调用一ơ其他的构造方法,q且调用构造方法的语句必须?<br />W一条语句?<br />4?有关public、private和protected <br />(1) 无public修饰的类Q可以被其他c访问的条g是:(x)a.两个cd同一文g中,b.两个c?<br />在同一文g夹中Qc.两个cd同一软g包中?<br />(2) protectedQ承类和同一软g包的cd讉K?<br />(3) 如果构造方法ؓ(f)privateQ那么在其他cM不能创徏该类的对象?<br />5?抽象c?<br />(1) 抽象cM能创建对象?<br />(2) 如果一个类中一个方法ؓ(f)抽象Ҏ(gu)Q则q个cdMؓ(f)abstract抽象cR?<br />(3) l承抽象cȝcdcM必须实现抽象cM的抽象方法?<br />(4) 抽象cM可以有抽象方法,也可有非抽象Ҏ(gu)。抽象方法不能ؓ(f)private?<br />(5) 间接l承抽象cȝcd以不l出抽象Ҏ(gu)的定义?<br />6?final关键?<br />(1) 一个对象是帔RQ不代表不能转变对象的成员,仍可以其成员q行操作?<br />(2) 帔R在用前必须赋|但除?jin)在声明的同时初始化外,只能在构造方法中初始?<br />?<br />(3) final修饰的方法不能被重置Q在子类中不能出现同名方法)(j)?<br />(4) 如果声明一个类为finalQ则所有的Ҏ(gu)均ؓ(f)finalQ无论其是否被final修饰Q但数据 <br />成员可ؓ(f)final也可不是?<br />7?接口interface Q用implements来实现接口)(j) <br />(1) 接口中的所有数据均?static和final即静(rn)态常量。尽可以不用这两个关键字修?<br />Q但必须l常量赋初倹{?<br />(2) 接口中的Ҏ(gu)均ؓ(f)publicQ在实现接口cMQ实现方法必dpublic关键字?<br />(3) 如果使用public来修饰接口,则接口必M文g名相同?<br />8?多重l承 <br />(1) 一个类l承?jin)一个类和接口,那么必须类写在前面Q接口写在后面,接口之间用?<br />号分隔?<br />(2) 接口之间可多重承,注意使用关键字extends?<br />(3) 一个类虽只实现?jin)一个接口,但不仅要实现q个接口的所有方法,q要实现q个接口 <br />l承的接口的Ҏ(gu)Q接口中的所有方法均dcM实现?<br />9?接口的嵌?<br />(1) 接口嵌入cMQ可以用private修饰。此Ӟ接口只能在所在的cM实现Q其他类?<br />能访问?<br />(2) 嵌入接口中的接口一定要为public?<br />10、类的嵌?<br />(1) cd以嵌入另一个类中,但不能嵌入接口中?<br />(2) 在静(rn)态方法或其他Ҏ(gu)中,不能直接创徏内部cd象,需通过手段来取得?<br />手段有两U:(x) <br />class A { <br />class B {} <br />B getB() { <br />B b = new B(); <br />return b; <br />} <br />} <br />static void m() { <br />A a = new A(); <br />A.B ab = a.getB(); // 或者是 A.B ab = a.new B(); <br />} <br />(3) 一个类l承?jin)另一个类的内部类Q因cL内部c,而内部类的构造方法不能自?<br />被调用,q样需要在子类的构造方法中明确的调用超cȝ构造方法?<br />接上例:(x) <br />class C extends A.B { <br />C() { <br />new A().super(); // q一句就实现?jin)对内部cL造方法的调用?<br />} <br />} <br />构造方法也可这样写Q?<br />C(A a) { <br />a.super(); <br />} // 使用q个构造方法创建对象,要写成C c = new C(a); a是A的对象?<br />11、异常类 <br />JAVA中除?jin)RunTimeException c,其他异常均须捕获或抛?img src ="http://www.tkk7.com/mayu/aggbug/92819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mayu/" target="_blank">my</a> 2007-01-10 09:54 <a href="http://www.tkk7.com/mayu/articles/92819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的一些常用词?/title><link>http://www.tkk7.com/mayu/articles/82551.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Tue, 21 Nov 2006 07:49:00 GMT</pubDate><guid>http://www.tkk7.com/mayu/articles/82551.html</guid><wfw:comment>http://www.tkk7.com/mayu/comments/82551.html</wfw:comment><comments>http://www.tkk7.com/mayu/articles/82551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mayu/comments/commentRss/82551.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mayu/services/trackbacks/82551.html</trackback:ping><description><![CDATA[Abstract class 抽象c?抽象cL不允许实例化的类Q因此一般它需要被q行扩展l承。  ?br /><br />  Abstract method 抽象Ҏ(gu):抽象Ҏ(gu)即不包含M功能代码的方法。  ?br /><br />  Access modifier 讉K控制修饰W?讉K控制修饰W用来修饰Java中类、以?qing)类的方法和变量的访问控制属性。  ?br /><br />  Anonymous class 匿名c?当你需要创建和使用一个类Q而又不需要给出它的名字或者再ơ用的使用Q就可以利用匿名cR  ?br /><br />  Anonymous inner classes 匿名内部c?匿名内部cL没有cd的局部内部类。  ?br /><br />  API 应用E序接口:提供特定功能的一l相关的cdҎ(gu)的集合。  ?br /><br />  Array 数组:存储一个或者多个相同数据类型的数据l构Q用下标来讉K。在Java中作为对象处理。  ?br /><br />  Automatic variables 自动变量:也称为方法局部变量method local variablesQ即声明在方法体中的变量。  ?br /><br /><br />  Base class 基类:卌扩展l承的类。  ?br /><br />  Blocked state d状?当一个线E等待资源的时候即处于d状态。阻塞状态不使用处理器资源  ?br /><br />  Call stack 调用堆栈:调用堆栈是一个方法列表,按调用顺序保存所有在q行期被调用的方法。  ?br /><br />  Casting cd转换 :即一个类型到另一个类型的转换Q可以是基本数据cd的{换,也可以是对象cd的{换。  ?br /><br />  char 字符:容纳单字W的一U基本数据类型。  ?br /><br />  Child class 子类:见承类Derived class   <br /><br />  Class c?面向对象中的最基本、最重要的定义类型。  ?br /><br />  Class members cL?定义在类一U的变量Q包括实例变量和?rn)态变量。  ?br /><br />  Class methods cL?cL法通常是指的静(rn)态方法,即不需要实例化cd可以直接讉K使用的方法。  ?br /><br />  Class variable cd?见静(rn)态变量Static variable   <br /><br />  Collection 容器c?容器cd以看作是一U可以储存其他对象的对象Q常见的容器cLHashtables和Vectors。  ?br /><br />  Collection interface 容器cL?容器cL口定义了(jin)一个对所有容器类的公共接口。  ?br /><br />  Collections framework 容器cL?接口、实现和法三个元素构成?jin)容器类的架构。  ?br /><br />  Constructor 构造函?在对象创建或者实例化时候被调用的方法。通常使用该方法来初始化数据成员和所需资源。  ?br /><br />  Containers容器:容器是一U特D的lgQ它可以容纳其他lg。  ?br /><br />  Declaration 声明:声明x在源文g中描q类、接口、方法、包或者变量的语法。  ?br /><br />  Derived class l承c?l承cL扩展l承某个cȝcR  ?br /><br />  Encapsulation 装?装性体C(jin)面向对象E序设计的一个特性,方法和数据l织在一P隐藏其具体实现而对外体现出公共的接口。  ?br /><br />  Event classes 事gc?所有的事gc都定义在java.awt.event包中。  ?br /><br />  Event sources 事g?产生事g的组件或对象UCؓ(f)事g源。事件源产生事gq把它传递给事g监听器event listener*。  ?br /><br />  Exception 异常:异常在Java中有两方面的意思。首先,异常是一U对象类型。其ơ,异常q指的是应用中发生的一U非标准程情况Q即异常状态。  ?br /><br />  Extensibility扩展?扩展性指的是面向对象E序中,不需要重写代码和重新设计Q能Ҏ(gu)的增强源设计的功能。  ?br /><br />  Finalizer 收尾:每个c都有一个特D的Ҏ(gu)finalizerQ它不能被直接调用,而被JVM在适当的时候调用,通常用来处理一些清理资源的工作Q因此称为收机制。  ?br /><br />  Garbage collection 垃圾回收机制:当需要分配的内存I间不再使用的时候,JVM调用垃圑֛收机制来回收内存I间。  ?br /><br />  Guarded region 监控区域:一D는来监控错误生的代码。  ?br /><br />  Heap?Java中管理内存的l构UC堆。  ?br /><br />  Identifiers 标识W?x定类、方法、变量的名字。注意Java是大写敏感的语a。  ?br /><br />  Import statement 引入语法:引入语法允许你可以不使用某个cȝ全名可以参考这个类。  ?br /><br />  Inheritance l承:l承是面向对象程序设计的重要特点Q它是一U处理方法,通过q一Ҏ(gu)Q一个对象可以获得另一个对象的特征。  ?br /><br />  Inner classes 内部c?内部cM一般的cȝ|只是它被声明在类的内部,或者甚x个类Ҏ(gu)体中。  ?br /><br />  Instance 实例:cd例化以后成ؓ(f)一个对象。  ?br /><br />  Instance variable 实例变量:实例变量定义在对象一U,它可以被cM的Q何方法或者其他类的中Ҏ(gu)讉KQ但是不能被?rn)态方法访问。  ?br /><br />  Interface 接口:接口定义的是一l方法或者一个公共接口,它必通过cL实现。  ?br /><br />  Java source file Java源文?Java源程序包含的是JavaE序语言计算机指令。  ?br /><br />  Java Virtual Machine (JVM) Java虚拟?解释和执行Java字节码的E序Q其中Java字节码由Java~译器生成。  ?br /><br />  javac Java~译?Javac是Java~译E序的名U。  ?br /><br />  JVM Java虚拟?见Java虚拟机  ?br /><br />  Keywords 关键?即Java中的保留字,不能用作其他的标识符。  ?br /><br />  Layout managers 布局理?布局理器是一些用来负责处理容器中的组件布局排列的类。  ?br /><br />  Local inner classes 局部内部类:在方法体中,或者甚x的语句块中定义的内部类。  ?br /><br />  Local variable 局部变?在方法体中声明的变量   <br /><br />  Member inner classes 成员内部c?定义在封装类中的没有指定static修饰W的内部cR  ?br /><br />  Members 成员:cM的元素,包括Ҏ(gu)和变量。  ?br /><br />  Method Ҏ(gu):完成特定功能的一D|代码Q可以传递参数和q回l果Q定义在cM。  ?br /><br />  Method local variables Ҏ(gu)局部变?见自动变量Automatic variables   <br /><br />  Modifier 修饰W?用来修饰cR方法或者变量行为的关键字。  ?br /><br />  Native methods 本地Ҏ(gu):本地Ҏ(gu)是指使用依赖q_的语a~写的方法,它用来完成Java无法处理的某些依赖于q_的功能。  ?br /><br />  Object 对象:一旦类实例化之后就成ؓ(f)对象。  ?br /><br />  Overloaded methods 名称重蝲Ҏ(gu):Ҏ(gu)的名U重载是指同一个类中具有多个方法,使用相同的名U而只是其参数列表不同。  ?br /><br />  Overridden methods 覆盖重蝲Ҏ(gu):Ҏ(gu)的覆盖重载是指父cd子类使用的方法采用同L(fng)名称、参数列表和q回cd。  ?br /><br />  Package ?包即是将一些类聚集在一L(fng)一个实体。  ?br /><br />  Parent class 父类:被其他类l承的类。也见基cR  ?br /><br />  Private members U有成员:U有成员只能在当前类被访问,其他Mc都不可以访问之。  ?br /><br />  Public members 公共成员:公共成员可以被Q何类讉KQ而不该cd于那个包。  ?br /><br />  Runtime exceptions q行旉异常:q行旉异常是一U不能被你自qE序处理的异常。通常用来指示E序BUG。  ?br /><br />  Source file 源文?源文件是包含你的Java代码的一个纯文本文g。  ?br /><br />  Stack trace 堆栈轨迹:如果你需要打印出某个旉的调用堆栈状态,你将产生一个堆栈轨qV  ?br /><br />  Static inner classes ?rn)态内部类:?rn)态内部类是内部类最单的形式Q它于一般的cd怼Q除?jin)被定义在?jin)某个cȝ内部。  ?br /><br />  Static methods ?rn)态方??rn)态方法声明一个方法属于整个类Q即它可以不需要实例化一个类可以通过cȝ接访问之。  ?br /><br />  Static variable ?rn)态变?也可以称作类变量。它cM于静(rn)态方法,也是可以不需要实例化cd可以通过cȝ接访问。  ?br /><br />  Superclass 类:被一个或多个cȝ承的cR  ?br /><br />  Synchronized methods 同步Ҏ(gu):同步Ҏ(gu)是指明某个方法在某个时刻只能׃个线E访问。  ?br /><br />  Thread U程:U程是一个程序内部的序控制。  ?br /><br />  Time-slicing 旉?调度安排U程执行的一U方案。  ?br /><br />  Variable access 变量讉K控制:变量讉K控制是指某个c读或者改变一个其他类中的变量的能力。  ?br /><br />  Visibility 可见? 可见性体C(jin)Ҏ(gu)和实例变量对其他cd包的讉K控制?<br /><img src ="http://www.tkk7.com/mayu/aggbug/82551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mayu/" target="_blank">my</a> 2006-11-21 15:49 <a href="http://www.tkk7.com/mayu/articles/82551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA~译为EXE的几U方?http://www.tkk7.com/mayu/articles/77541.htmlmymyFri, 27 Oct 2006 01:51:00 GMThttp://www.tkk7.com/mayu/articles/77541.htmlhttp://www.tkk7.com/mayu/comments/77541.htmlhttp://www.tkk7.com/mayu/articles/77541.html#Feedback0http://www.tkk7.com/mayu/comments/commentRss/77541.htmlhttp://www.tkk7.com/mayu/services/trackbacks/77541.htmlJAVA~译为EXE的几U方?
--------------------------------------------------------------------------------

Java应用E序本地~译为EXE的几U方?使用JOVE和JET)  

a. 利用微Y的SDK-Java 4.0所提供的jexegen.exe创徏EXE文gQ这个Y件可以 
从微软的|站免费下蝲Q地址如下Q 
http://www.microsoft.com/java/download/dl_sdk40.htm 
jexegen的语法如下:(x) 
jexegen /OUT:exe_file_name 
/MAIN:main_class_name main_class_file_name.class 
[and other classes] 
b. Visual Cafe提供?jin)一个能够创建EXE文g的本地编译器。你需要安装该光盘 
上提供的EXElg。 
c. 使用InstallAnywhere创徏安装盘。 
d. 使用IBM AlphaWorks提供的一个高性能Java~译器,该编译器可以从下面的 
地址获得Q 
http://www.alphaworks.ibm.com/tech/hpc 
e. JET是一个优U的Java语言本地~译器。该~译器可以从q个|站获得一个 
试版本Q 
http://www.excelsior-usa.com/jet.html 
f. Instantiations公司的JOVE 
http://www.instantiations.com/jove/...ejovesystem.htm 
JOVE公司合ƈ?jin)以前的SuperCedeQ一个优U的本地编译器Q现在SuperCede 
已经不复存在?jin)。 
g. JToEXE 
Bravo Zulu Consulting, Inc开发的一ƾ本地编译器Q本来可以从该公司的 
|页上免费下载的Q不q目前在该公司的主页上找不到?jin)。?br />h. ?a >www.towerj.com获得一个TowerJ~译器,该编译器可以你的CLASS文g 
~译成EXE文g。 

h......exe4jQ,呵呵 不用说了(jin)吧?/p>

my 2006-10-27 09:51 发表评论
]]>
Java中常见的异常http://www.tkk7.com/mayu/articles/74724.htmlmymyThu, 12 Oct 2006 02:13:00 GMThttp://www.tkk7.com/mayu/articles/74724.htmlhttp://www.tkk7.com/mayu/comments/74724.htmlhttp://www.tkk7.com/mayu/articles/74724.html#Feedback0http://www.tkk7.com/mayu/comments/commentRss/74724.htmlhttp://www.tkk7.com/mayu/services/trackbacks/74724.html1. java.lang.NullPointerException
  q个异常大家肯定都经帔R刎ͼ异常的解释是"E序遇上?jin)空指?Q简单地说就是调用了(jin)未经初始化的对象或者是不存在的对象Q这个错误经常出现在创徏囄Q调用数l这些操作中Q比如图片未l初始化Q或者图片创建时的\径错误等{。对数组操作中出现空指针Q很多情况下是一些刚开始学?fn)编E的朋友常犯的错误,x数组的初始化和数l元素的初始化؜淆v来了(jin)。数l的初始化是Ҏ(gu)l分配需要的I间Q而初始化后的数组Q其中的元素q没有实例化Q依然是I的Q所以还需要对每个元素都进行初始化Q如果要调用的话Q?br />
  2. java.lang.ClassNotFoundException
  q个异常是很多原本在JB{开发环境中开发的E序员,把JB下的E序包放在WTk下编译经常出现的问题Q异常的解释?指定的类不存?Q这里主要考虑一下类的名U和路径是否正确卛_Q如果是在JB下做的程序包Q一般都是默认加上Package的,所以{到WTK下后要注意把Package的\径加上?br />
  3. java.lang.ArithmeticException
  q个异常的解释是"数学q算异常"Q比如程序中出现?jin)除以零q样的运就?x)出q样的异常,对这U异常,大家p好好(g)查一下自q序中涉及(qing)到数学运的地方Q公式是不是有不妥了(jin)?br />
  4. java.lang.ArrayIndexOutOfBoundsException
  q个异常怿很多朋友也经帔R到过Q异常的解释?数组下标界"Q现在程序中大多都有Ҏ(gu)l的操作Q因此在调用数组的时候一定要认真(g)查,看自p用的下标是不是超Z(jin)数组的范_(d)一般来_(d)昄Q即直接用常数当下标Q调用不太容易出q样的错Q但隐式Q即用变量表CZ标)(j)调用q常出错了(jin)Q还有一U情况,是程序中定义的数l的长度是通过某些特定Ҏ(gu)军_的,不是事先声明的,q个时候,最好先查看一下数l的lengthQ以免出现这个异常?br />
  5. java.lang.IllegalArgumentException
  q个异常的解释是"Ҏ(gu)的参数错?Q很多J2ME的类库中的方法在一些情况下都会(x)引发q样的错误,比如音量调节Ҏ(gu)中的音量参数如果写成负数׃(x)出现q个异常Q再比如g.setColor(int red,int green,int blue)q个Ҏ(gu)中的三个|如果有超q2Q5的也?x)出现这个异常,因此一旦发现这个异常,我们要做的,是赶紧L查一下方法调用中的参C递是不是出现?jin)错误?br />
  6. java.lang.IllegalAccessException
  q个异常的解释是"没有讉K权限"Q当应用E序要调用一个类Q但当前的方法即没有对该cȝ讉K权限便会(x)出现q个异常。对E序中用?jin)Package的情况下要注意这个异常?br />

my 2006-10-12 10:13 发表评论
]]>
查看自己机器上可以用的 字体http://www.tkk7.com/mayu/articles/74721.htmlmymyThu, 12 Oct 2006 02:10:00 GMThttp://www.tkk7.com/mayu/articles/74721.htmlhttp://www.tkk7.com/mayu/comments/74721.htmlhttp://www.tkk7.com/mayu/articles/74721.html#Feedback0http://www.tkk7.com/mayu/comments/commentRss/74721.htmlhttp://www.tkk7.com/mayu/services/trackbacks/74721.html又学C个方?br />import java.awt.*;
class Ziti
{
    public static void main(String args[])
    {
        String s1[] = GraphicsEnvironment.getLocalGraphicsEnvironment()
        .getAvailableFontFamilyNames();
        for(int i=0;i<s1.length;i++)
        {
            System.out.println(s1[i]);        
        }
    }
}


my 2006-10-12 10:10 发表评论
]]>
一个最单的计算?/title><link>http://www.tkk7.com/mayu/articles/74720.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Thu, 12 Oct 2006 02:09:00 GMT</pubDate><guid>http://www.tkk7.com/mayu/articles/74720.html</guid><wfw:comment>http://www.tkk7.com/mayu/comments/74720.html</wfw:comment><comments>http://www.tkk7.com/mayu/articles/74720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mayu/comments/commentRss/74720.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mayu/services/trackbacks/74720.html</trackback:ping><description><![CDATA[ <span id="ShowBody" style="FONT-SIZE: 12px; LINE-HEIGHT: 15px">import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;<br /><br />class MyFrame extends JFrame implements ActionListener<br />{<br />        private JButton ButtonNum[]=new JButton[16];<br />        private String countCode[]={"/","*","-","+","=","."};<br />        <br />        private JTextField displayField=new JTextField();        <br />        private JPanel pan=new JPanel();<br />        <br />        private String displayStr="";<br />        private double firstNum=0,secondNum=0;<br />        private int countNum;<br />        private boolean start=false,end=false;<br />        <br />    public MyFrame()<br />    {    <br />        super("模拟便计器");<br />        setSize(400,400);<br />        Container c=getContentPane();<br />        c.setLayout(new BorderLayout());    <br />        <br />        displayField.setHorizontalAlignment(JTextField.RIGHT);<br />        displayField.setFont(new Font("TimesRoman",Font.BOLD,50));<br />        displayField.setBackground(Color.gray);<br />        displayField.setEditable(false);<br />        displayField.addActionListener(this);        <br />        c.add(displayField,"North");<br />        c.add(pan,"Center");<br />            <br />        pan.setLayout(new GridLayout(4,4));<br />        <br />        for(int n=0;n<16;n++)  //定义按键属?br />        {    <br />            if(n<10)<br />            {<br />                ButtonNum[n]=new JButton(n+"");<br />                ButtonNum[n].setFont(new Font("TimesRoman",Font.BOLD,50));                <br />                ButtonNum[n].setBackground(Color.lightGray);<br />                ButtonNum[n].addActionListener(this);<br />                pan.add(ButtonNum[n]);<br />            }<br />            <br />            else<br />            {<br />                ButtonNum[n]=new JButton(countCode[15-n]);<br />                ButtonNum[n].setFont(new Font("TimesRoman",Font.BOLD,50));      <br />                ButtonNum[n].addActionListener(this);<br />                pan.add(ButtonNum[n]);<br />            }    <br />        }    <br />        setVisible(true);<br />    }<br />    <br />    public static void main(String args[])<br />    {    <br />        MyFrame myFrame=new MyFrame();<br />    }<br />        <br />    public void windowClosing(WindowEvent e)<br />    {<br />        dispose();<br />        System.exit(0);<br />    }<br />    <br />    public void actionPerformed(ActionEvent e)<br />    {<br />        for(int i=0;i<16;i++)<br />        {<br />            if(i<=10)   //数按钮输入事g处理  判断q显C入的q算数字<br />            {<br />                if(e.getSource()==ButtonNum[i] && start==false)<br />                {<br />                    displayStr=displayStr+ButtonNum[i].getLabel();<br />                    displayField.setText(displayStr);<br />                    <br />                }<br />                <br />                if(e.getSource()==ButtonNum[i] && start==true)<br />                {<br />                    displayStr=displayStr+ButtonNum[i].getLabel();<br />                    displayField.setText(displayStr);<br />                    end=true;        <br />                }            <br />            }<br />        <br />            if(i>=12 && i<=15)     //q算按钮事g处理  判断q接受输入的q算数字<br />            {    <br />                if(e.getSource()==ButtonNum[i] && start==false)<br />                {<br />                    firstNum=Double.valueOf(displayField.getText()).doubleValue();<br />                    countNum=i;<br />                    displayField.setText("");<br />                    displayStr="";<br />                    start=true;            <br />                }<br />                <br />                else<br />                {    if(e.getSource()==ButtonNum[i] )<br />                    {<br />                        countNum=0;<br />                        displayField.setText("");<br />                        displayStr="";<br />                        firstNum=0;<br />                        secondNum=0;<br />                        end=false;    <br />                    }                                                                        <br />                }                    <br />            }<br />        <br />            if(e.getSource()==ButtonNum[11])    //{号按钮事g处理<br />            {<br />                secondNum=Double.valueOf(displayField.getText()).doubleValue();<br />                        <br />                if(start=true && end==true)<br />                {                                                        <br />                    if(countNum==12)<br />                        displayField.setText(firstNum+secondNum+"");<br />                    if(countNum==13)<br />                        displayField.setText(firstNum-secondNum+"");<br />                    if(countNum==14)<br />                        displayField.setText(firstNum*secondNum+"");<br />                    if(countNum==15 && secondNum!=0)<br />                        displayField.setText(firstNum/secondNum+"");                                <br />                }<br />                            <br />                countNum=0;<br />                displayStr="";<br />                firstNum=0;<br />                secondNum=0;<br />                start=false;<br />                end=false;    <br />            }<br />        }            <br />    }<br />} <br /></span> <img src ="http://www.tkk7.com/mayu/aggbug/74720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mayu/" target="_blank">my</a> 2006-10-12 10:09 <a href="http://www.tkk7.com/mayu/articles/74720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对String的深ȝ?/title><link>http://www.tkk7.com/mayu/articles/64366.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Fri, 18 Aug 2006 07:41:00 GMT</pubDate><guid>http://www.tkk7.com/mayu/articles/64366.html</guid><wfw:comment>http://www.tkk7.com/mayu/comments/64366.html</wfw:comment><comments>http://www.tkk7.com/mayu/articles/64366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mayu/comments/commentRss/64366.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mayu/services/trackbacks/64366.html</trackback:ping><description><![CDATA[1?abc"与new String("abc"); l常?x)问到的面试题?x)String s = new String("abc");创徏?jin)几个String Object?【如q里创徏?jin)多对? 和一道小的面试?? q个问题比较单,涉及(qing)的知识点包括Q? 引用变量与对象的区别Q? 字符串文?abc"是一个String对象Q? 文字池[pool of literal strings]和堆[heap]中的字符串对象? 一、引用变量与对象Q除?jin)一些早期的Java书籍和现在的垃圾书籍Qh们都可以从中比较清楚地学?fn)到两者的区别。A aa;语句声明一个类A的引用变量aa[我常常称之ؓ(f)句柄]Q而对象一般通过new创徏。所以题目中s仅仅是一个引用变量,它不是对象。[ref 句柄、引用与对象] 二、Java中所有的字符串文字[字符串常量]都是一个String的对象。有人[特别是CE序员]在一些场合喜Ƣ把字符?当作/看成"字符数组Q这也没有办法,因ؓ(f)字符串与字符数组存在一些内在的联系。事实上Q它与字W数l是两种完全不同的对象? System.out.println("Hello".length()); char[] cc={'H','i'}; System.out.println(cc.length); 三、字W串对象的创?׃字符串对象的大量使用[它是一个对象,一般而言对象L在heap分配内存]QJava中ؓ(f)?jin)节省内存空间和q行旉[如比较字W串Ӟ==比equals()快]Q在~译阶段把所有的字符串文字放C个文字池[pool of literal strings]中,而运行时文字池成为常量池的一部分。文字池的好处,是该池中所有相同的字符串常量被合ƈQ只占用一个空间。我们知道,对两个引用变量,使用==判断它们的值[引用]是否相等Q即指向同一个对象:(x) String s1 = "abc" ;String s2 = "abc" ;if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");else System.out.println("trouble"); q里的输出显C,两个字符串文字保存ؓ(f)一个对象。就是说Q上面的代码只在pool中创Z(jin)一个String对象? 现在看String s = new String("abc");语句Q这?abc"本n是pool中的一个对象,而在q行时执行new String()Ӟpool中的对象复制一份放到heap中,q且把heap中的q个对象的引用交ls持有。okQ这条语句就创徏?个String对象? String s1 = new String("abc") ;String s2 = new String("abc") ;if( s1 == s2 ){ //不会(x)执行的语句} q时?=判断可知,虽然两个对象?内容"相同[equals()判断]Q但两个引用变量所持有的引用不同, BTWQ上面的代码创徏?jin)几个String Object? [三个Qpool中一个,heap?个。] [Java2 认证考试学习(fn)指南 (W??( 英文?p197-199有图解。] 2、字W串?q算和字W串转换 字符串{换和串接是很基础的内容,因此我以个问题简直就是送分题。事实上Q我自己q错了(jin)? String str = new String("jf"); // jf是接? str = 1+2+str+3+4; 一共创Z(jin)多少String的对象?[我开始的{案Q?个。jf、new?jf?jf3?jf34] 首先看JLS的有兌qͼ(x) 一、字W串转换的环境[JLS 5.4 String Conversion] 字符串{换环境仅仅指使用双元?q算W的情况Q其中一个操作数是一个String对象。在q一特定情Ş下,另一操作数{换成StringQ表辑ּ的结果是q两个String的串接? 二、串接运符[JLS 15.18.1 String Concatenation Operator + ] 如果一个操作数/表达式是StringcdQ则另一个操作数在运行时转换成一个String对象Qƈ两者串接。此ӞMcd都可以{换成String。[q里Q我漏掉?3"?4"] 如果是基本数据类型,则如同首先{换成其包装类对象Q如int x视ؓ(f)转换成Integer(x)? 现在全部统一到引用类型向String的{换了(jin)。这U{换如同[as if]调用该对象的无参数toStringҎ(gu)。[如果是null则{换成"null"]。因为toStringҎ(gu)在Object中定义,故所有的c都有该Ҏ(gu)Q而且Boolean, Character, Integer, Long, Float, Double, and String改写?jin)该?gu)? 关于+是串接还是加法,由操作数军_?+2+str+3+4 很Ҏ(gu)知道?3jf34"。[BTW :在JLS?5.18.1.3中D的一个jocular little exampleQ真的很无趣。] 下面的例子测试了(jin)改写toStringҎ(gu)的情?? class A{ int i = 10; public static void main(String []args){ String str = new String("jf"); str += new A(); System.out.print(str); } public String toString(){ return " a.i ="+i+"\n"; }} 三、字W串转换的优? 按照上述说法Qstr = 1+2+str+3+4;语句g应该应该生?个String对象Q? 1+2 Q?Qthen 3↺nteger(3)?3" in pool? [假设如此] "3"+str(in heap) = "3jf" (in heap) "3jf" +3 ,first 3↺nteger(3)?3" in pool? [则不创徏] then "3jf3" "3jf3"+4 create "4" in pool then "3jf34" q里我ƈ不清??转换成字W串后是否在池中Q所以上q结果仍然是猜测? Z(jin)减少创徏中间q渡性的字符串对象,提高反复q行串接q算时的性能Qa Java compiler可以使用StringBuffer或者类似的技术,或者把转换与串接合q成一步。例如:(x)对于 a + b + c QJava~译器就可以它视ؓ(f)[as if] new StringBuffer().append(a).append(b).append(c).toString(); 注意Q对于基本类型和引用cdQ在append(a)q程中仍然要先将参数转换Q从q个观点看,str = 1+2+str+3+4;创徏的字W串可能?3"?4"?3jf34"[以及(qing)一个StringBuffer对象]? 现在我仍然不知道怎么回答str = 1+2+str+3+4;创徏?jin)多String的对象,。或许,q个问题不需要过于研IӞ臛_SCJP不会(x)考它? 3、这又不同:(x)str = "3"+"jf"+"3"+"4"; 如果是一个完全由字符串文字组成的表达式,则在~译Ӟ已经被优化而不?x)在q行时创Z间字W串。测试代码如下:(x) String str1 ="3jf34"; String str2 ="3"+"jf"+"3"+"4"; if(str1 == str2) { System.out.println("str1 == str2"); }else { System.out.println("think again"); } if(str2.equals(str1)) System.out.println("yet str2.equals(str1)"); 可见Qstr1与str2指向同一个对象,q个对象在pool中。所有遵循Java Language Spec的编译器都必d~译时对constant expressions q行化。JLS规定QStrings computed by constant expressions (ý15.28) are computed at compile time and then treated as if they were literals. 对于String str2 ="3"+"jf"+"3"+"4";我们说仅仅创Z个对象。注意,“创建多对象”的讨论是说q行时创建多对象? BTWQ编译时优化 String x = "aaa " + "bbb "; if (false) { x = x + "ccc "; } x += "ddd "; {h(hun)于:(x) String x = "aaa bbb "; x = x + "ddd "; 4、不变类 String对象是不可改变的(immutable)。有人对str = 1+2+str+3+4;语句提出疑问,怎么str的内容可以改变?其实仍然是因Z清楚Q引用变量与对象的区别。str仅仅是引用变量,它的值——它持有的引用可以改变。你不停地创建新对象Q我׃断地改变指向。[参考TIJ的Read-only classes。] 不变cȝ关键是,对于对象的所有操作都不可能改变原来的对象[只要需要,p回一个改变了(jin)的新对象]。这׃证了(jin)对象不可改变。ؓ(f)什么要一个类设计成不变类Q有一个OOD设计的原则:(x)Law of Demeter。其q义解读是:(x) 使用不变cR只要有可能Q类应当设计Z变类? <img src ="http://www.tkk7.com/mayu/aggbug/64366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mayu/" target="_blank">my</a> 2006-08-18 15:41 <a href="http://www.tkk7.com/mayu/articles/64366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://ncmyw.com" target="_blank">õƵƵ</a>| <a href="http://jxszzhzs.com" target="_blank">av߲ </a>| <a href="http://zjztauto.com" target="_blank">ۺϺݺݰ</a>| <a href="http://sdzntg.com" target="_blank">һƷƵ</a>| <a href="http://www09191z.com" target="_blank">Ļ߸ѵӰ</a>| <a href="http://701807.com" target="_blank">պӰ߹ۿƵ </a>| <a href="http://haiwaizhuyun.com" target="_blank">þ99ƷƵ</a>| <a href="http://mangshigas.com" target="_blank">aëƬѧѹۿ</a>| <a href="http://goodwaysi.com" target="_blank">С˵ͼƬ</a>| <a href="http://ding001.com" target="_blank">ѹҹƵ</a>| <a href="http://gepuw.com" target="_blank">AV˾Ʒ </a>| <a href="http://ebanyou.com" target="_blank">aƬձþ</a>| <a href="http://228609.com" target="_blank">ձѲv</a>| <a href="http://cn-zggx.com" target="_blank">av³˿һ</a>| <a href="http://kwknc.com" target="_blank">ҹӰȫѿ</a>| <a href="http://linmh.com" target="_blank">ŮݽƵѿ</a>| <a href="http://bearsou.com" target="_blank">ŷ޹ۺ</a>| <a href="http://wwwby1385.com" target="_blank">þùӾƷŮ</a>| <a href="http://tzkanglong.com" target="_blank">պһ</a>| <a href="http://yangguang882.com" target="_blank">޹Ʒһ</a>| <a href="http://dodxs.com" target="_blank">վѹۿ</a>| <a href="http://gxshenquan.com" target="_blank">þۺϾƷ</a>| <a href="http://hnkangshi.com" target="_blank">һ߹ۿ</a>| <a href="http://0551dfcy.com" target="_blank">ȫëƬ</a>| <a href="http://pecbj.com" target="_blank">޳aƬ߹ۿ</a>| <a href="http://888-28.com" target="_blank">߹ۿav</a>| <a href="http://wlamyx.com" target="_blank">޾Ʒվ</a>| <a href="http://ttooyuyu.com" target="_blank">պ뾫Ʒþһ</a>| <a href="http://joob4s.com" target="_blank">޾Ʒa߹ۿapp</a>| <a href="http://wbkk88.com" target="_blank">ŷһ</a>| <a href="http://tc116.com" target="_blank"> </a>| <a href="http://zgdhuibao.com" target="_blank">AVƬվ</a>| <a href="http://wxbhnkyy39.com" target="_blank">ҹƵѹۿƵ</a>| <a href="http://xiaochidaquan.com" target="_blank">޹ģ߲</a>| <a href="http://445848.com" target="_blank">ĻƷƵѹۿ</a>| <a href="http://by23336.com" target="_blank">޹ۺרӰ </a>| <a href="http://xin-matai.com" target="_blank">ʪôýˬƵ</a>| <a href="http://7766ks.com" target="_blank">˵һ </a>| <a href="http://szgyk.com" target="_blank">A߹ۿվȫ</a>| <a href="http://f2dai.com" target="_blank">ŷƵ߹ۿ</a>| <a href="http://339258.com" target="_blank">ŮպѲ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>