java编程思想第三版(陈昊鹏 饶若楠 等译)
第五章 隐藏具体实现 5.4节最后一段话是:
正如前面所提到的,如果没能为类访问权限指定一个访问修饰符,它就会缺省得到包访问权限。这意味着该类的对象可以由包内任何其他类来创建,但包外则是不行的。(一定要记住,相同目录下的所有不具有明确package声明的文件,都被视作是该目录下缺省包的一部分。)然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象。我对最后一句话的理解是:如果某个类没有指定访问修饰符,但其中有static成员是public的话,在包外的类中仍然可以调用该类的static的public方法或访问static的public成员字段。
于是我做了下面的实验:在Thinking in java\chapter5\下有Test.java,代码如下package chapter5;class Test
{
  public static int i=0;
  public static void print()
  {
    System.out.println("class Test public static procedure");
  }
  
  public void println()
  {
    System.out.println("class Test public procedure");
  }
}
在Thinking in java\下有Test1.java,代码如下
import chapter5.*;public class Test1
{
  public static void main(String[] args)
  {  
     int a;
     a=Test.i;
    //Test.print();
  }
}结果编译器报错,说Test类不是公开类,不可以调用其方法或访问其成员字段。——-----------------------------------------
请问,是我对这段话理解有错,还是我做的实验的例子有错,还是书错了?

解决方案 »

  1.   

    应该是把Test1和Test类放在一起吧
      

  2.   

    我是为了测试
    当一个类只具有包访问权限时,
    包外的类可不可以调用那个类的public中的static方法或字段
      

  3.   

    补充一下,
    我的classpath没有设置,是默认值,即是当前路径。
    我CMD的当前路径Thinking in java。
      

  4.   

    是你的理解有错误吧,你要联系上下文阿
    "然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象。"
    这句话的意思是说,这个类如果不能创建对象,但是如果方法是public static标示的话,仍然可以在该包内使用这个方法。这段文字并没有说在该包以外的类可以访问这个类。例如以下的
    class TestP
    {
    public static TestP tp;

    private TestP(){}

    public static TestP getObj()
    {
    if(tp == null)
    tp = new TestP();
    return tp;

    public void info()
    {
    System.out.println("ok");
    }
    }class TestPe
    {
    public static void main(String[] args)
    {
    TestP.getObj().info();
    }
    }
    显示结果为 ok
      

  5.   

    这跟是不是static没什么关系,主要是说如果是static的方法或字段可以直接用类名来访问.而default修饰的方法或字段自能在同包可见
      

  6.   

    to:Hypercube1024
    多谢你的指点,你的例子我能看懂什么意思,静态方法生成该类的对象。那按你的意思是说,具有包访问权限的类在包外是不能访问的,换名话说,如果具有包访问权限的类,其成员声明为public和protected是没有意义的喽?因为在包外不能访问也不能继承的。
    另外你把这段话连起来看,把中间的括号里的省略掉。    “正如前面所提到的,如果没能为类访问权限指定一个访问修饰符,它就会缺省得到包访问权限。这意味着该类的对象可以由包内任何其他类来创建,但包外则是不行的。然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象。”    这样子看是有歧义的,因为不能生成该类的对象,主要是有二种情况吧,一个是包外的类中不能生成只有包访问权限的类的对象,第二个是构造方法被声明为private。(当然这可以通过static方法来生成对象。)    应该是翻译的不准确吧。
      

  7.   

    翻译问题,但是文中应该是讲的我说的这种情况。这本书虽然是不错,但是将的是jdk1.4的内容,jdk5.0新增加了非常多的内容没有讲java How to program 6th 非常不错,只不过只有英文版的下载很全面讲了jdk5.0的新特性,后面题目也很经典,国内只翻译到4th,但是4th是讲的jdk1.4的。
      

  8.   

    访问权修饰与成员修饰是两个层面上的
    访问权修饰决定了Class本身的可访问性
    成员修饰决定了找到Class后,对其内成员的可访问性所以是书上的问题有误
      

  9.   

    private defaule protected public
    同一类 true true true true
    同一包中的类 false true true true
    子类 false false true true
    不同包中的类 false false false true
      

  10.   

    to:timbear一般的书都是这样子讲的,
    其实这样子说是不准确的,
    因为它得有个前提,那就是类必须是public.thanks Hypercube1024 and welshem