Java - использование ключевого слова super - PullRequest
5 голосов
/ 30 июля 2011

Простой вопрос. Я создал класс с именем Tester1, который расширяет другой класс с именем Tester2. Tester2 содержит открытую строку с именем «ABC».

Вот тестер1:

public class Tester1 extends Tester2
{
    public Tester1()
    {
         ABC = "Hello";
    }
}

Если вместо этого изменить строку 5 на

super.ABC = "Hello"; 

Я все еще делаю то же самое?

Ответы [ 4 ]

8 голосов
/ 30 июля 2011

Да. В вашем объекте есть только одна переменная ABC. Но, пожалуйста, не делайте поля общедоступными. Поля всегда должны быть частными.

Если вы также объявите переменную ABC в Tester1, , тогда будет разница - поле в Tester1 будет скрывать поле в Tester2, но, используя super, вы все равно будете ссылаться на поле в Tester2. Но также не делайте этого - сокрытие переменных - это действительно быстрый способ сделать код не поддерживаемым.

Пример кода:

// Please don't write code like this. It's horrible.
class Super {
   public int x;
}

class Sub extends Super {
    public int x;

    public Sub() {
        x = 10;
        super.x = 5;
    }

}

public class Test {
    public static void main(String[] args) {
        Sub sub = new Sub();
        Super sup = sub;
        System.out.println(sub.x); // Prints 10
        System.out.println(sup.x); // Prints 5
    }
}
2 голосов
/ 30 июля 2011

Да, супер-квалификатор не нужен, но работает так же. Для уточнения:

public static class Fruit {

    protected String color;
    protected static int count;
}

public static class Apple extends Fruit {

    public Apple() {
        color = "red";
        super.color = "red"; // Works the same
        count++;
        super.count++; // Works the same
    }
}
1 голос
/ 30 июля 2011

Вы есть. Учитывая, что ABC виден для Tester1 (дочерний класс), предполагается, что он объявлен как что угодно, кроме частного, и именно поэтому он виден подклассу. В этом случае использование super.ABC просто подтверждает тот факт, что переменная определена в родительском элементе.

Если, с другой стороны, ABC был помечен как закрытый в родительском классе, не было бы никакого способа получить доступ к этой переменной из дочернего класса - даже если используется super (без использования какого-либо необычного отражения, конечно).

Еще один момент, на который следует обратить внимание: если бы переменная была определена как private в родительском классе, вы можете определить переменную с точно таким же именем в дочернем классе. Но опять же, super не предоставит вам доступ к родительской переменной.

1 голос
/ 30 июля 2011

Ну, во-первых, переменная ABC должна быть объявлена ​​в классе Tester2. Если да, то да.

...