明确写公开和不写公共有什么区别?

时间:2013-03-23 23:06:31

标签: java compiler-errors

我认为没有区别,但后来我遇到了这个:

public class Whatever
{

 String toString()  
{
//stuff
}

}

此代码导致编译器错误:

  toString()中的{p> Whatever无法覆盖toString()中的java.lang.Object;试图分配较弱的访问权限;是public

如果我明确键入public String toString(),则代码编译得很好。

3 个答案:

答案 0 :(得分:5)

如果您不对方法和字段使用public访问说明符,则假定它们位于package级别的可见性之下。

以下是一个很好的图表,其中列出了packagepublic在您班级以外的知名度方面的含义:

Modifier       Class    Package   Subclass  World
----------------------------------------------------------
public           Y         Y         Y        Y       
protected        Y         Y         Y        N
no modifier      Y         Y         N        N       <--- This is package level
private          Y         N         N        N

Y表示方法,类或字段可见。

N表示方法,类或字段可见

答案 1 :(得分:0)

@Hunter McMillen提到了包级别的可见性(+1)。

我只想补充一个简短的解释是什么意思。这意味着来自相同包的类和当前类的子类即使它们本身属于其他包也可以访问此方法/字段。

答案 2 :(得分:0)

在继承中,当覆盖方法时,无法缩小方法的访问范围。此处,toString()类的Object方法具有public访问权限,而您的班级Whatever正在尝试通过将访问级别更改为package来缩小其范围(相当于package没有指定访问修饰符),这是不允许的。

void someMethod () { } 级别方法可以定义为

void

如果您在此处看到,则public之前没有访问修饰符,即protectedprivateWhatever,这意味着与{位于同一个包中的所有类{1}}将能够访问它。包外的任何包都无法访问此方法,甚至不能访问Whatever的子类。

当你明确地写public时,整个人都可以随意使用它。