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类不是公开类,不可以调用其方法或访问其成员字段。——-----------------------------------------
请问,是我对这段话理解有错,还是我做的实验的例子有错,还是书错了?
第五章 隐藏具体实现 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类不是公开类,不可以调用其方法或访问其成员字段。——-----------------------------------------
请问,是我对这段话理解有错,还是我做的实验的例子有错,还是书错了?
当一个类只具有包访问权限时,
包外的类可不可以调用那个类的public中的static方法或字段
我的classpath没有设置,是默认值,即是当前路径。
我CMD的当前路径Thinking in java。
"然而,如果该类的某个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
多谢你的指点,你的例子我能看懂什么意思,静态方法生成该类的对象。那按你的意思是说,具有包访问权限的类在包外是不能访问的,换名话说,如果具有包访问权限的类,其成员声明为public和protected是没有意义的喽?因为在包外不能访问也不能继承的。
另外你把这段话连起来看,把中间的括号里的省略掉。 “正如前面所提到的,如果没能为类访问权限指定一个访问修饰符,它就会缺省得到包访问权限。这意味着该类的对象可以由包内任何其他类来创建,但包外则是不行的。然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象。” 这样子看是有歧义的,因为不能生成该类的对象,主要是有二种情况吧,一个是包外的类中不能生成只有包访问权限的类的对象,第二个是构造方法被声明为private。(当然这可以通过static方法来生成对象。) 应该是翻译的不准确吧。
访问权修饰决定了Class本身的可访问性
成员修饰决定了找到Class后,对其内成员的可访问性所以是书上的问题有误
同一类 true true true true
同一包中的类 false true true true
子类 false false true true
不同包中的类 false false false true
其实这样子说是不准确的,
因为它得有个前提,那就是类必须是public.thanks Hypercube1024 and welshem