2016-06-14 2 views
0

Так что, если у меня есть два класса, как это:Расширение класса А с класса B, но не может достигнуть атрибуты класса А в методах класса B

public class A extends B{ 

    public String name = "Alpha" 

} 

public class B{ 

    public void revealAName(){ 
     print(this.name); 
    } 
} 

main(){ 
A newA = new A(); 
newA.revealName(); 
} 

В этом случае Eclipse, говорит, что имя атрибута Безразлично не существует. Почему это так? почему я не использую атрибуты класса A, когда я внутри методов класса B? Как я могу это исправить?

+0

вы можете исправить это, выведя B из A, а не A из B – wero

+0

да, но тогда я не могу использовать объекты A, чтобы использовать методы B ... –

+0

, чтобы сказать другое: вы не можете использовать поля производного класса в суперклассе – wero

ответ

0

B ничего не знает об атрибутах в A, оба класса могут быть скомпилированы отдельно.

Но если вы измените его так, чтобы B extends A, вы можете получить доступ к name из производного класса (B):

class A { 
    String name = "Alpha"; 
} 

class B extends A { 
    public void revealAName(){ 
     print(this.name); 
    } 
} 
A a = new A(); 
a.name; // OK 
a.revealName(); // not OK 

B b = new B();  
b.name; // OK 
b.revealName(); // OK 

Смотрите также Oracle tutorial on inheritance

1

Прежде всего, должен быть только одним открытым классом, который должен содержать основной метод. Во-вторых, вы используете наследование. Итак, вы должны предоставить модификатору доступа переменные базового класса для «защиты», чтобы получить доступ к вашим дочерним классам. Таким образом, это должно быть:

protected String name = "Alpha";

поскольку модификатор доступа по умолчанию не разрешает доступ для дочернего класса. Из controlling access to members of class

 
Modifier  Class Package Subclass World 
public   Y  Y  Y  Y 
protected  Y  Y  Y  N 
no modifier Y  Y  N  N 
private  Y  N  N  N 

Другое дело, вы использовали «this.name», который пытается получить «имя» переменную класса В. Вот почему он показывает ошибку.

При использовании наследования вы можете напрямую использовать переменную родительского класса без использования ссылки на объект ИЛИ Вы можете использовать «супер» для ссылки на объект в случае дубликатов имен переменных. You can refer this image in case of doubt ..

Надеюсь, теперь будет ясно.

+0

Я объединил свой ответ в ваш, так как ваш более подробно. Не отказывайтесь от редактирования, если не одобряете. –

+0

Спасибо ... Остин. Это прекрасно. +1 для этого –

Смежные вопросы