在TIJ中有一段:As previously mentioned, if you don’t put an access specifier for class access, it defaults to package access. This means that an object of that class can be created by any other class in the package, but not outside the package. (Remember, all the files within the same directory that don’t have explicit package declarations are implicitly part of the default package for that directory.) However, if a static member of that class is public, the client programmer can still access that static member even though they cannot create an object of that class.但是我在package1中定义了一个非public类Class1,其中有一个public static的int变量t,然后在package2中定义一个public类Class2,通过**.package1.Class1.t来访问前一个package中的public静态变量,编译时不通过,报错“The type ××× is not visible”,这是为何?

解决方案 »

  1.   

    你看最后一段:However, if a static member of that class is public, the client programmer can still access that static member even though they cannot create an object of that class.MS是能访问的
      

  2.   

    不定义成public类只对本包可见
      

  3.   

    在 frendly的类中 的参数不管你是 PUBLIC 还是其他 都只能在这个包里调用 ,这个参数的PUBLIC STATIC作用域只在这个包里面
      

  4.   

    定义类时 什么修饰符都不加 那么它默认的是 default 只有它本省的类和在同一个包的类里
    可以访问它。访问修饰符 :
    1.private:只对本类可见
    2.默认(default):不需要修饰符,对本包可见(包访问权限)
    3.protected:对所有子类和本包可见
    4.public:对一切可见
      

  5.   

    楼主的问题应该这样解决:
    1,把作用域修饰符再去看看。
    你还是只看了前半段
    ----------------------
    2,你应该去程序员英语版块,过多纠缠报错的语句有意义吗?
    wuheng66888(吴恒) ( ) 信誉:100    Blog   加为好友 
    不定义成public类只对本包可见
    -----------------------
    已经说得很清楚了。。
      

  6.   

    回tuifeirensheng(想要个中文ID) :我说的后半段并不是报错语句,我只是对“However, if a static member of that class is public, the client programmer can still access that static member even though they cannot create an object of that class.”这句有疑问。如果你能告诉我这句是错的,那这个问题就此打住。如果此句是正确的,那么the client programmer如何access that static member。还有大家的答复我都理解,我所在意的只是最后一句话。
      

  7.   

    冒死回楼上的问题(本身是菜鸟,想法不一定正确):静态方法调用时,只需要类名调用即可啊.为什么还有“the client programmer如何access that static member”
      

  8.   

    回biggestfinger() :1。不定义成public类只对本包可见
    2。静态变量通过声明所在类的对象来访问,或者直接通过类名来访问。然后,在我顶楼的那段话中,TIJ的作者认为非public类的静态public成员可以被其他程序员调用,even though they cannot create an object of that class。所以他应该是说通过类名来访问。然后我写了如下的代码://包含静态public成员的非public类
    package javas.com.pzl.chap3;class Class1 {
    public static int t = 10;
    }//另外一个package中的public类
    package javas.com.pzl.chap4;public class Class2 {
    public static void main(String[] args){
    System.out.println(javas.com.pzl.chap3.Class1.t);
    }
    }结果是不能访问。所以才有了顶楼的问题。
      

  9.   

    我看了中文版的翻译,与原文的观点是一致的:正如前面所提到的,如果你没能为类访问权限指定一个访问修饰符,它就会缺省得到包访问权限。这就意味着该类的对象可以由包内任何其他类来创建,但在包外则是不行的。然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,哪怕是他们并不能生成该类的对象。
    希望大虾们给个指点。
      

  10.   

    不会是楼主要玩文字游戏吧?
    这很容易理解.....读英文的文章有时候只看一句不看完.
    就像你说的那样,你也只读了后面一段.没读前面.
    上下文联系一下,就能理解了.这里有个前提,如果你没能为类访问权限指定一个访问修饰符.
    这是大前提.不是说该类的某个static成员是public的话,所有的程序员都能调用static成员.而且,这句话并没指是不是在同一个包里面.所以要考虑调用就是在大前提下:到底是默认权限还是public权限下调用.这样应该理解为什么了吧..我也在看TIJ.但是英文的多看几次,不然容易把自己转悠进去.
    总得来说这句话没错.难道还有问题么?事实和理论都证明是正确的..感觉LZ有点鸡蛋里面挑骨头
      

  11.   

    首先谢谢KK15378924。
    但是你还是不理解我的意思,或者说你还没理解这段话本身的意思。干脆挑骨头就挑到底吧:就像你说的那样,你也只读了后面一段.没读前面.
    上下文联系一下,就能理解了.
    =======================================
    如果不结合上下文,不会有这个帖子:)不是说该类的某个static成员是public的话,所有的程序员都能调用static成员.而且,这句话并没指是不是在同一个包里面.所以要考虑调用就是在大前提下:到底是默认权限还是public权限下调用.这样应该理解为什么了吧..
    =======================================
    可以简化这个问题,“even though they cannot create an object of that class.”这是后面半段话的前提。如果如你所说,在同一个包内,或者将类定义成public权限,这个前提就不存在了,我们可以很轻松的create an object of that class。也就是说,作者要说的意思是在不同的包内,而且这个类不是public的。所以我认为你误解了这段话。
      

  12.   

    我的本意不是玩文字游戏,只是觉得如TIJ作者这般的大牛,写的文章如果不能完全理解,就需要仔细推敲。我不确定我自己是否是正确的,所以帖出来与各位讨论。
      

  13.   

    还是那句话,尽信书不如无书。
    最少偶看这个地方的时候没发现什么问题,是我的懒得深层次理解呢还是偶理解能力快呢。。
    总之是不觉得这里有问题。
    TIJ本来就是把一些概念绕来绕去了的。。每看一便都会有不同的感觉。。
    很容易理解,方法的访问级别不可能会比类的访问级别还大啊。就像你家里的电视机就只可以你用,把时代推前一点也就摆在客厅里,但也是把人请回家里看。也就是说还是呆在自己的空间里的。内部的东西再大也不能大于类的本身的访问级别。
    个人认为这贴结了吧。。有点浪费时间的感觉。
      

  14.   

    GhostAdai(幽灵阿呆) 
    楼主不仅英文没学好,连中文也没学好,鉴定完毕!================
    麻烦你给出鉴定过程,谢谢