Почему можно получить доступ к полю без геттера? - PullRequest
2 голосов
/ 07 августа 2011

У меня есть следующий пример:

package cage;

import java.util.HashSet;
import java.util.Set;

import animals.Animal;

public class Cage<T extends Animal> {  //A cage for some types of animals
    private Set<T> set = new HashSet<T>();

    public void add(T animal)  {
        set.add(animal);
    }

    public void showAnimals()  {
        for (T animal : set) {
            System.out.println(animal.getName());
        }
    }

    public void transferTo(Cage<? super T> cage) {
        cage.set.addAll(this.set);
    }
}

Основной класс:

package exe;

import cage.Cage;
import animals.Animal;
import animals.Ape;
import animals.Lion;
import animals.Rat;

public class Main {

    public static void main(String[] args) {
        System.out.println("Test with super........");
        Cage<Animal> animals = new Cage<Animal>();
        Cage<Lion> lions = new Cage<Lion>();
        animals.add(new Rat(true, 4, "Rat", true)); // OK to put a Rat into a Cage<Animal> 
        lions.add(new Lion(true, 4, "King", 9));
        lions.transferTo(animals); // invoke the super generic method -> animals is SUPER of lion.
        animals.showAnimals();
    }
}

В клетке класса есть вызов

cage.set.addAll (this.set);

Почему это работает, чтобы вызвать "cage.set ..." с точечной нотацией, хотя у меня нет ни метода getSet, ни "set" статического? Какое техническое образование?

Ответы [ 4 ]

2 голосов
/ 07 августа 2011

Вы просто используете полевой доступ.Наличие метода getSet() не имеет значения, поскольку компилятор Java не будет автоматически использовать метод доступа для вас.

Я подозреваю, что вам не хватает того, что доступ private не определяется объект , к которому вы пытаетесь получить доступ - код в Cage имеет доступ к закрытым членам любого другого Cage, включая поле set.

Раздел 6.6 Спецификации языка Java описывает управление доступом, включая:

В противном случае, если член или конструктор объявлен private, тогда доступ разрешается, если и только если это происходитвнутри тела класса верхнего уровня (§7.6), который содержит объявление члена или конструктора.

1 голос
/ 07 августа 2011

Это работает, потому что методы из класса Cage могут получить доступ к закрытым членам из того же класса Cage.Здесь не имеет значения, что член в этом случае доступен в другом экземпляре класса.

1 голос
/ 07 августа 2011

вы получаете доступ изнутри вашего класса. Так что частная декларация не считается.

Попробуйте его в своем главном классе, и он потерпит неудачу, поскольку set является приватным.

1 голос
/ 07 августа 2011

Синтаксис

cage.set

просто обращается к полю set внутри вашего объекта cage. Поле объявлено закрытым, но вы все еще находитесь в том же классе Cage.

...