2011-06-03 23 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