【发布时间】:2017-12-19 16:50:56
【问题描述】:
今天我写了一个考试,有一个问题,如果我们在TestCountry类中写import countries.*;而不是package countries;,哪些代码行将不起作用。这是两个类:
package countries;
public class Country {
private String name;
private int population;
boolean isEuropean;
public double area;
protected Country[] neighbors;
protected boolean inEurope() {
return this.isEuropean;
}
private void updatePopulation(int newBorns) {
this.population += newBorns;
}
public String toString() {
String str ="";
for (int i=0; i<this.neighbors.length; i++){
str += neighbors[i].name+"\n";
}
return str;
}
Countries[] getNeighbors() {
return this.neighbors;
}
String getName() {
return this.name;
}
}
还有
import countries.*;
// package countries;
public class TestCountry extends Country {
public void run() {
System.out.println(name);
System.out.println(population);
System.out.println(isEuropean);
System.out.println(inEurope());
System.out.println(area);
System.out.println(toString());
updatePopulation(100);
System.out.println(getNeighbors());
System.out.println(getName());
}
public static void main(String[] args){
TestCountry o1 = new TestCountry();
o1.run();
}
}
当然,我试过了,发现以下行不再起作用(如果我们将package countries; 改为import countries.*;):
System.out.println(isEuropean);
System.out.println(getNeighbors());
System.out.println(getName());
有人能解释一下为什么他们不工作吗?import countries.*; 到底是做什么的?
【问题讨论】:
-
如果没有修饰符,
isEuropean、getName()具有默认范围,也称为 package 范围。您的测试不再与该类在同一个包中,因此它只能访问public和protected成员(受保护,因为它是Country的子类。请参阅:docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html