2016-11-13 8 views
0

Я пытаюсь изучить java oop, и я нахожу некоторую проблему, понимая использование супер метода, когда я делаю пример. Пожалуйста, введите код ниже.использование super() в Java?

не могли бы вы рассказать мне, почему супер(); метод не относится к суперклассу? я не понимаю.

суперкласса:

package javaapplication; 

public class A { 

    protected String val; 

    public A(){ 

     this.val = " Class A "; 
    } 
} 

Подкласс

package javaapplication; 


public class B extends A { 


    public B(){ 

     this.val = " Class B"; 
     System.out.println(super.val); 


    } 
} 

Главный класс

package javaapplication; 

public class JavaApplication { 

    public static void main(String[] args) { 

     B a = new B(); 


    } 

} 

выход: бежать: Класс B

почему я получил "класса B"?

+1

Поскольку вы назначили его в 'Class b' в' b' конструктора? Чего ты ожидал? 'val' - это одно и то же в обоих классах. – Li357

+0

Что вы ожидали от вывода? –

+0

Возможный дубликат [Когда я использую super()?] (Http://stackoverflow.com/questions/4090834/when-do-i-use-super) –

ответ

7

Поскольку существует только одна переменная val, а ваш конструктор B устанавливает его в «Класс B».

Вы можете использовать super.something для обозначения something (переменной-члена или метода) на суперкласса вместо текущего класса, но это будут только разные, если оба класса объявить something. В этом случае оба A и B делят val, определяемые A.

1

Конструктор в Java (теперь сосредоточиться на вашем конструкторе класса B) ВСЕГДА называет либо другой конструктор класса B, если вы явно говорите вам об этом с помощью this(arguments...) или конструктором суперкласса A, если вы прямо скажете вам сделайте это с помощью super(arguments...) или если вы не укажете какой-либо вызов другому конструктору, он вызывает super(). И этот вызов является первой инструкцией любого конструктора. Если класс, о котором вы говорите, это Object.

Итак, сначала вызывается конструктор, устанавливающий значение val в «класс A», но затем конструктор класса B непрерывно стирает это значение и заменяет его «классом B».

Хотя хороший пример того, как работают конструкторы, но по сути плохое программирование, поскольку это не то, что вы сделали бы. Хороший программист добавит в класс A конструктор, принимающий значение val и в классе B, который вы назвали бы его с помощью супер («класс B»), и val будет частной переменной, определенной в классе A.

Обратите внимание, что класс B расширяет класс A, любой экземпляр класса B имеет атрибуты, определенные в классе B и классе A, поэтому super.val или this.val делает ссылку на точно такую ​​же переменную. Можно добавить новую переменную val в классе B, но опять же это было бы плохое программирование, если компилятор согласился бы с этим, я не уверен.

1

, когда вы делаете B a = new B(); Выполняется конструктор B, который внутренне вызывает конструктор базового класса в качестве первой операции. Таким образом, устанавливается значение переменной val как Class A. Но тогда вы вручную делать this.val = Class B, который устанавливает значение снова Class B

Просто раскомментируйте this.val = Class B из конструктора B, он будет печатать Class A

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