2014-11-23 5 views
3

Я читал в учебнике, что члены класса, отмеченные как частные, не наследуются. Итак, я думал, что если класс A имеет переменную privatex, а класс B будет расширять класс A, тогда не было бы переменной x в классе B. Однако следующий пример показывает, что я понял, что:Частные члены и наследование

public class testdrive 
{ 
    public static void main(String[] args) { 
     B b = new B(); 
     b.setLength(32); 
     System.out.print(b.getLength()); 
    } 
} 

class A { 
    private int length; 
    public void setLength(int len) { 
     length = len; 
    } 
    public int getLength() { 
     return length; 
    } 
} 

class B extends A { 
    public void dummy() { 
    } 
} 

В результате 32 и я смущен, потому что это выглядит как объект с реф b теперь имеет переменную length и это значение равно 32. Но исх b относится к объекту, созданному из класса B, где переменная length не определена. Так что же правда, класс B наследует переменную privatelength? Если да, то что означает, что переменные private не наследуются?

+0

Не добавляйте «Java» в свой заголовок, вы уже отметили свой вопрос с помощью 'java'. – Pshemo

ответ

3

private скрыто в B. Но ваши методы public наследуются и доступны, и они могут обращаться к частному полю.

2

Эй людей это не так, как вы думаете, это, частные поля могут быть доступны только с помощью методов, присутствующих в том же классе (учитывая конечно, что методы доступны из другого класса)

его не то, что вы можете напрямую звоните:

b.length=8; 

Или вы не можете даже сделать это: (пишу это, где вы создали объект для B)

A a = new A(); 
a.length=8; 

оба этих подхода являются invali d!

Для получения дополнительной информации:

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

-1

У вас нет прямого доступа к закрытым полям и методам суперкласса, но вы можете получить к ним доступ с помощью других общедоступных методов.

Это одна из основных концепций объектно-ориентированного программирования и называется Инкапсуляция. Узнайте больше об этом здесь: TutorialsPoint.

Реалистичный: Вы не можете непосредственно доступ к закрытому полю или методу как этот

b.length = 32; 

ни как это (суперкласса)

A a = new A(); 
a.length = 32; 

но вы можете манипулировать этими полями с помощью общедоступного метода, например, в вашем примере.

Причина проста: ваши частных поля/методы скрыты для других классов для класса, который держит их за исключением, но ваше общественных поля/методы не являются скрытой.

+1

Вопрос не в том, как работают геттеры/сеттеры, но почему поле 'length' * унаследовано * или * доступно * в классе B, если поля' private' не наследуются. –

+0

Я отредактировал сообщение и исправил свою ошибку. Спасибо за ответ!:) – SCBbestof

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