Почему защищенные и закрытые атрибуты доступны одному и тому же классу, а не одному и тому же объекту? - PullRequest
3 голосов
/ 07 октября 2010

Например, у нас есть класс Man

Если Man.age защищено, то я не понимаю, почему chuckNorris (экземпляр класса Man) может изменить атрибут защищенного / частного * age объекта jackBauer (другой экземпляр класса *). 1009 *). Он не должен быть в состоянии сделать это (ИМО).

На мой взгляд, значение атрибута protected / private должно принадлежать только самому объекту , а не классу ...

Мне нужно какое-то объяснение, я думаю, я в замешательстве.

Ответы [ 3 ]

2 голосов
/ 22 января 2012

Матье прав. cuckNorris может сделать jackBauer.age

Но в этом нет проблем. Если вы ссылаетесь на атрибуты экземпляра Man внутри Man, это означает, что вы кодируете класс Man, поэтому вы знаете, что делаете.

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

Сеттеры и геттеры могут выполнять некоторую бизнес-логику, которую я не знаю, и мне не нужно знать. Но тот, кто закодировал маму, знает.

1 голос
/ 09 октября 2010

Рассмотрим этот класс Java:

public class Base {
  private int a
  protected int b;

  public Base(int a,int b) {
    this.a = a;
    this.b = b;
  }

  public int getA() {
     return a;
  }

  public int getB() {
    return b;
  } 
}

...
 Base foo = new Base(1,2);
 Base bar = new Base(3,4);

Нет никакого способа (возможно, кроме как посредством грязного отражения), экземпляр foo может изменить защищенную или приватную переменную в bar

Вы можете разрешить это, если хотите,

public class Base {
  private int a
  protected int b;

  public Base(int a,int b) {
    this.a = a;
    this.b = b;
  }

  public int getA() {
     return a;
  }

  public int getB() {
    return b;
  } 
 public void changeB(int newB,Base other) {
   other.b = newB;
 }
}
... 
Base foo = new Base(1,2);
Base bar = new Base(3,4);
foo.changeB(5,bar);

Вы не можете защитить метод changeB от изменения содержимого объекта other [*], вам просто нужно быть осторожным с тем, что выпрограмма делает.В некоторых языках вы могли бы пометить аргумент other как неизменяемый, но не в Java - я не нахожу это большим делом.

[*} Вы могли бы, отметив все поля Base как окончательное, хотя тогда даже сам экземпляр не может изменить членов после того, как объект был построен.

0 голосов
/ 07 октября 2010

Закрытый атрибут доступен только методом в классе.Защищенный атрибут - accessibe только в классе-потомке.Поэтому объект Джекбауэр не может изменить ничего частного или защищенного в объекте chuckNorris класса Man.Надеюсь, это поможет

...