2011-06-03 60 views
1

代碼中的問題:我有認識一些Java代碼

package com.keyoti.rapidSpell; 

import java.util.Comparator; 

// Referenced classes of package com.keyoti.rapidSpell: 
//   RapidSpellChecker 

class RapidSpellChecker$CompareL 
    implements Comparator 
{ 

    public int compare(Object a, Object b) 
    { 
     return (int)(100D * (suggestionScore2b(topWord, (String)b) - suggestionScore2b(topWord, (String)a))); 
    } 

    public void with(String w) 
    { 
     topWord = w; 
    } 

    private String topWord; 

    RapidSpellChecker$CompareL() 
    { 
    } 
} 

這是一個在許多類的應用程序。

$登錄class RapidSpellChecker$CompareL implements Comparator是什麼意思?它僅僅是類名還是有一些意義?

+0

這些問題是Java中的一些基本概念。 試試看這本書的第一個:http://www.mindview.net/Books/TIJ4 – sfat 2011-06-03 07:04:00

+0

這是一個Java代碼或反編譯的類代碼? – 2011-06-03 07:04:52

+0

你確定這不是一個反編譯的代碼? ;) – 2011-06-03 07:05:07

回答

5

我懷疑這是反編譯的代碼。 (請參閱底部以獲取更多信息。)$顯示這是嵌套類RapidSpellChecker之內。因此,代碼將原本已經看起來是這樣的:

public class RapidSpellChecker 
{ 
    // Other code withing RapidSpellChecker 

    static class CompareL implements Comparator 
    { 
     // Code for compare, with etc 
    } 
} 

我已經證明這是一個靜態嵌套類,因爲你的代碼已經證明不具有的RapidSpellChecker實例任何隱式引用。如果它這樣做,原來的代碼將是這樣的:

public class RapidSpellChecker 
{ 
    // Other code withing RapidSpellChecker 

    class CompareL implements Comparator 
    { 
     // Code for compare, with etc 
    } 
} 

在這種情況下,它是一個內部類

查看Java tutorial on nested classes瞭解更多信息。


編輯:我原本以爲這是無效的代碼;你不能在Java的標識符中使用$來開始。原來我錯了。來自Java Language Specification, section 3.8

$字符只能用於機械生成的源代碼,或者很少用於訪問傳統系統上的預先存在的名稱。

所以這是有效的,只是氣餒。

+0

實際上它是有效的代碼(或者至少它爲我編譯) - 如果需要,可以使用$作爲變量名。 – 2011-06-03 07:05:12

+0

@傑夫:哎呀,這很令人擔憂。將編輯... – 2011-06-03 07:07:24

+0

......其實RapidSpellChecker類已經繼承了包.... – 2011-06-03 07:14:16

1

如果需要,可以使用$作爲變量名稱。在變量名中它沒有特別的意義。

$通常也用來表示內部類,當您編譯使用javac

如果編譯

class A { 
    class B { 
    } 
} 

你會看到的A.class創建和B.class。爲了好玩和娛樂,您可以在Java中創建令人困惑的「JQuery」代碼(您需要使用靜態導入來使用$靜態方法)。看下面的例子:

import static thisPackage.*; 

public class $ { 
    public static $ $(String s) { return new $(s); } 
    public $ fadeIn(int fade) { return this; } 
    public $ slideUp(int slide) { return this; } 
    public $ delay(int ms) { return this; } 
    public $(String s) { } 

    public static void main(String[] args) { 
     $("#foo").slideUp(300).delay(800).fadeIn(400); 
    } 
} 

用下面的DOM庫實現這將是一個有趣的項目!

2

這是一個嵌套類。當Java編譯器用嵌套類編譯一個類時,它將所有這些類分離到不同的.class文件中。

class A { 
    class B { 
    } 
} 

給出A.class和A $ B。class

+0

@Xr ... oke ....知道了...但是由於我使用反編譯的代碼,所以讓這段代碼運行...我將不得不作出什麼改變? – 2011-06-03 07:58:53