2016-02-03 3 views
1

Привет люди stackoverflow,Как использовать супер (переменную), созданную в конструкторе?

Я не совсем уверен, что мой вопрос лишний или нет. Однако после того, как инстанцировании переменная используя супер() в конструктор, как бы вы использовать супер (переменная) в другом методе одного и того же класса. Я где-то читал, что если вы используете «protected» в родительском классе, вы должны иметь доступ к нему, однако я хочу этого не делать.

Пример:

public class test extends trial{ 
    public test (trial variable){ 
     super(variable); 
    } 

    public double testMethod(){ 
    return [super(variable)]; //This is where the super(variable) is going 
    } 
} 
+0

Составляет ли это? – Idos

+0

'супер (переменная);' просто вызвать родительский конструктор, нет ничего как «создание экземпляра переменной с помощью функции super()». Если вы хотите получить доступ к атрибутам родителя в дочернем классе, они должны быть определены как защищенные (или общедоступные). – Holt

+2

Или просто используйте открытый/защищенный 'getter' в родительском классе' trial'. –

ответ

0

Я принимаю его Trail выглядит как:

public class Trial { 
    private final Trial variable; 
    public Trail(Trial variable) { 
     this.variable = variable; 
    } 
} 

Если это так, то Test не может получить доступ к super.variable без изменения access control из variable в защищенный (или выше) или имеющий защищенный (или более высокий) геттер для variable. Другого пути вокруг этого нет (1).

после инстанцировании переменной с использованием супер() в конструкторе

Вы не (непосредственно) инстанцировании переменную, вы вызываете конструктор на Trial. Тогда конструктор в Trial создает экземпляр переменной.

1) Вы можете обойти это злым хакером. Однако делать это было бы ошибкой в ​​99% случаев.

+0

Это делает мне гораздо больше смысла. Как я уже сказал в ответ на Мэтью Хьюза, я подумал, что это может быть что-то похожее, но только на 30%. – JavaSam

0

Что вы делаете, это не инициализация переменной, а вы вызываете конструктор родителей, т. Е. Конструктор проб. супер переменная может быть получена из дочернего класса напрямую, если они защищены или открыты. , например

public class A{ 
public int foo; 
protected int foo2; 
private int foo3; 
} 

public class B extends A{ 
public void someMethod() 
{ 
foo=1; 
foo2=3; 
//foo3 cant be accessed because it is private. only and only class A can 
//access it. 

} 
} 
0

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

public class Test extends Trial { 
    private Trial variable; 
    public Test(Trial variable) { 
     super(variable); 
     this.variable = variable; 
    } 

    public void testMethod() { 
     this.variable.doWhatever(); 
    } 
} 
+0

Объяснение вашего и mlk помогает. Я подумал, что это похоже на то, что вы сказали, но я был уверен только на 30%. Если бы я мог выбрать два ответа, это было бы вам обоим, потому что вы показываете напрямую возможный путь, но mlk очень детализирован, что мне очень помогает. – JavaSam

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