Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在调用构造函数后从main调用私有包方法_Java_Scjp - Fatal编程技术网

Java 在调用构造函数后从main调用私有包方法

Java 在调用构造函数后从main调用私有包方法,java,scjp,Java,Scjp,我正在研究SCJP,在研究过程中,我发现一个练习起初似乎非常简单,但我没有解决它,我不理解答案。该练习(摘自OCP Java SE 6程序员实践考试,Bert Bates和Kathy Sierra),内容如下: 鉴于: import java.util.*; public class MyPancake implements Pancake { public static void main(String[] args) { List<String> x = new Ar

我正在研究SCJP,在研究过程中,我发现一个练习起初似乎非常简单,但我没有解决它,我不理解答案。该练习(摘自OCP Java SE 6程序员实践考试,Bert Bates和Kathy Sierra),内容如下:

鉴于:

import java.util.*;
public class MyPancake implements Pancake {
  public static void main(String[] args) {
    List<String> x = new ArrayList<String>();
    x.add("3");x.add("7");x.add("5");
    List<String> y = new MyPancake().doStuff(x);
    y.add("1");
    System.out.println(x);
  }

  List<String> doStuff(List<String> z) {
    z.add("9");
    return z;
  }
}

interface Pancake {
  List<String> doStuff(List<String> s);
}


What is the most likely result?

A. [3, 7, 5]

B. [3, 7, 5, 9]

C. [3, 7, 5, 9, 1]

D. Compilation fails.

E. An exception is thrown at runtime
我猜是C,因为doStuff方法在MyPancake类中,所以主方法应该可以访问它

重新考虑这个问题,当从静态上下文调用new时,如果doStuff是私有的,它可能无法访问私有方法。这是真的吗?我对此不确定

但无论如何,我仍然认为它可以访问包私有doStuff方法。 我想我错了,但我不知道为什么

你能帮我吗


谢谢大家!

很遗憾,它没有给你一个关于它为什么会编译失败的答案——但幸运的是,当你有了一个编译器,你可以自己发现:

Test.java:11: error: doStuff(List<String>) in MyPancake cannot implement doStuff
(List<String>) in Pancake
  List<String> doStuff(List<String> z) {
               ^
  attempting to assign weaker access privileges; was public
2 errors
Test.java:11:错误:MyPancake中的doStuff(列表)无法实现doStuff
(列表)在煎饼里
列表doStuff(列表z){
^
正在尝试分配较弱的访问权限;是公共的
2个错误
基本上,接口成员总是公共的,所以你必须用公共方法实现接口。调用方法不是问题,而是实现接口的问题。如果你去掉“实现”部分,它就可以正常工作了

发件人:

所有接口成员都是隐式公开的。根据§6.6的规则,如果接口也被声明为公开或受保护,则可以在声明接口的包外访问这些成员


非常遗憾的是,它没有给你一个关于它为什么会编译失败的答案——但幸运的是,当你有了一个编译器,你可以自己找到:

Test.java:11: error: doStuff(List<String>) in MyPancake cannot implement doStuff
(List<String>) in Pancake
  List<String> doStuff(List<String> z) {
               ^
  attempting to assign weaker access privileges; was public
2 errors
Test.java:11:错误:MyPancake中的doStuff(列表)无法实现doStuff
(列表)在煎饼里
列表doStuff(列表z){
^
正在尝试分配较弱的访问权限;是公共的
2个错误
基本上,接口成员总是公共的,所以你必须用公共方法实现接口。调用方法不是问题,而是实现接口的问题。如果你去掉“实现”部分,它就可以正常工作了

发件人:

所有接口成员都是隐式公开的。根据§6.6的规则,如果接口也被声明为公开或受保护,则可以在声明接口的包外访问这些成员


当您实现Pancake接口时

您正在MyPancake类中提供方法doStuff()的实现

在MyPancake类中提供方法doStuff()的实现时,还应将其定义为public,因为接口中的所有成员变量和方法默认为public


因此,当您不提供访问修改器时,它会降低可见性。

当您实现Pancake接口时

您正在MyPancake类中提供方法doStuff()的实现

在MyPancake类中提供方法doStuff()的实现时,还应将其定义为public,因为接口中的所有成员变量和方法默认为public


因此,当您不提供访问修饰符时,它会降低可见性。

当您定义方法时

List<String> doStuff(List<String> s);
List doStuff(列表s);
在Pancake界面中,您真正要说的是:

public List<String> doStuff(List<String> s);
public List doStuff(列表s);
因为接口中的所有方法都是公共的,即使您没有明确地将它们标记为公共的


现在,MyPancake类具有分配给doStuff(List s)方法的默认访问权限,因此不遵循接口,代码也不会编译。

当您定义该方法时

List<String> doStuff(List<String> s);
List doStuff(列表s);
在Pancake界面中,您真正要说的是:

public List<String> doStuff(List<String> s);
public List doStuff(列表s);
因为接口中的所有方法都是公共的,即使您没有明确地将它们标记为公共的


现在,MyPancake类具有分配给doStuff(列表s)的默认访问权限方法,因此不遵循接口,代码也不编译。

非常感谢!我专注于查看我的笔记,这本书,但我没有尝试编译它。我应该记得接口成员总是公开的。非常感谢!我专注于查看我的笔记,这本书,但我没有尝试编译它。我应该记得接口成员始终是公共的。谢谢你的帮助!我忘记了接口中的始终是公共的成员。谢谢你的帮助!我忘记了接口中的始终是公共的成员。也谢谢你。我以前应该意识到问题出在可见性中。也谢谢你。我应该意识到这一点问题在于以前的可见性。