Самый непонятый модификатор доступа в Java - protected
. Мы знаем, что он похож на модификатор по умолчанию с одним исключением, в котором подклассы могут его видеть. Но как? Вот пример, который, надеюсь, прояснит путаницу:
Father
и Son
, каждый в своем собственном пакете: package fatherpackage;
public class Father
{
}
-------------------------------------------
package sonpackage;
public class Son extends Father
{
}
foo()
в Father
. package fatherpackage;
public class Father
{
protected void foo(){}
}
foo()
можно вызвать в 4 контекстах: внутри класса, который находится в том же пакете, где foo()
определен (fatherpackage
): package fatherpackage;
public class SomeClass
{
public void someMethod(Father f, Son s)
{
f.foo();
s.foo();
}
}
Внутри подкласса , в текущем экземпляре через this
или super
: package sonpackage;
public class Son extends Father
{
public void sonMethod()
{
this.foo();
super.foo();
}
}
В ссылке, тип которой является одним и тем же классом: package fatherpackage;
public class Father
{
public void fatherMethod(Father f)
{
f.foo(); // valid even if foo() is private
}
}
-------------------------------------------
package sonpackage;
public class Son extends Father
{
public void sonMethod(Son s)
{
s.foo();
}
}
В ссылке, тип которой является родительским классом, и внутри пакет, где foo()
определен (fatherpackage
) [Это может быть включено внутри контекста no. 1]: package fatherpackage;
public class Son extends Father
{
public void sonMethod(Father f)
{
f.foo();
}
}
fatherpackage
: package sonpackage;
public class Son extends Father
{
public void sonMethod(Father f)
{
f.foo(); // compilation error
}
}
: не подкласс внутри пакета подкласса наследует защищенные члены от своего родителя и делает их частными для не-подклассов): package sonpackage;
public class SomeClass
{
public void someMethod(Son s) throws Exception
{
s.foo(); // compilation error
}
}
Вы пропустите объявление класса.
public class DerivativeQuiz{
public static void derivativeQuiz(String args[]){ ... }
}
Посмотрите на определение функции. Если вы забыли использовать «()» после объявления функции где-нибудь, вы получите много ошибок в том же формате:
... ??: class, interface, or enum expected ...
А также вы забыли закрытие скобки после завершения определения вашего класса или функции. Но обратите внимание, что эти недостающие скобки не являются единственной причиной такого типа ошибок.
Вы забыли свое объявление класса:
public class MyClass {
...
класс, интерфейс или enum expected
Вышеприведенная ошибка даже возможна, если инструкция импорта пропущена. Правильное утверждение - «import com.company.HelloWorld;»
Если по ошибке при написании и редактировании кода это не написано как «t com.company.HelloWorld;»
компилятор покажет «класс, интерфейс или ожидаемое перечисление»
Каждый метод должен находиться внутри класса. Ваш метод derivativeQuiz
находится за пределами класса.
public class ClassName {
///your methods
}
основной класс должен быть объявлен в вашем классе следующим образом:
public class derivativeQuiz_source{
// bunch of methods .....
public static void main(String args[])
{
// code
}
}