JAVA - Beginner - Можно ли получить доступ к атрибуту частного класса за пределами класса?
Я относительно новичок в Java OO Programming, и рассмотрел вопросы, подобные этому, хотя они, кажется, не отвечают на мой вопрос напрямую.
По сути, я понимаю, что если член данных в классе объявлен как частный, то он доступен только из этого же класса.
Мой лектор всегда советует, чтобы ВСЕ атрибуты были объявлены как частные - почему это так?
Теперь я знаком с использованием методов GET, и мой вопрос заключается в том, можно ли получить доступ к закрытому атрибуту вне его собственного класса посредством вызова метода PUBLIC 'get' (который возвращает вышеупомянутый атрибут) из другого класса?
Например:
public class Class()
{
private int number = 0;
public Class()
{
}
public int getNumber()
{
return number;
}
}
А потом из другого класса:
public class Class2()
{
Class class = new Class();
public void showNumber()
{
System.out.print(class.getNumber());
}
}
Позволит ли второй блок кода методу showInt() внутри Class2 получить доступ к атрибуту private из Class?
Я думаю, что я действительно пытаюсь решить, должен ли какой-либо атрибут или метод быть объявлен общедоступным или частным вообще.
Есть ли какое-то конкретное правило, которое следует соблюдать?
Спасибо ответчикам за любую помощь.
С уважением
5 ответов
Ключевым моментом является то, что общественность get
Метод возвращает только текущее значение вашего личного участника, не предоставляя доступ к самому члену. Это означает, что вы не можете каким-то образом "получить" член и изменить его значение.
Мой лектор всегда советует, чтобы ВСЕ атрибуты были объявлены как частные.
Хороший совет. Есть исключения из этого правила, но я бы начал с этого.
Я понимаю, что если член данных в классе объявлен как частный, то он доступен только из этого же класса.
Это доступно для
- вложенные классы в одном файле.
- доступ через отражение.
Позволит ли второй блок кода методу showInt() внутри Class2 получить доступ к атрибуту private из Class?
Эффективно да в этом случае. С использованием метода получения поле может изменить имя, заменить его на константу или вычисление или войти в систему, и Class2 не должен знать об этом.
Да, если вы делаете общедоступный метод доступа, вы можете получить доступ к закрытому полю.
Смысл состоит в том, чтобы скрыть реализацию, чтобы, как разработчик, вы могли позже решить, что нужно иметь другой тип поля (или косвенное, или динамическое вычисление), не заставляя пользователей вашего класса изменять свой код.
Это также позволяет вам предлагать метод получения, не предлагая никакого метода установки (тогда ваше поле доступно только для чтения вне класса).
Многие вещи не будут компилироваться в вашем коде:
- добавить скобки для вызова метода (getInt)
- класс - зарезервированное слово
- класс не может быть назван классом и не объявлен как вы
Я бы посоветовал вам написать код компиляции в редакторе (например, Eclipse), прежде чем задавать вопрос. Эта задача, вероятно, поможет вам понять хотя бы часть проблем.
Краткий ответ: нет.
Основная причина сделать все конфиденциальным - убедиться, что пользователи вашего класса не могут изменять вещи так, как они не должны.
То, что вы можете сделать, это определить методы получения и установки. Обычно лучше выставлять только геттеры, например
private int foo;
public int getFoo(){
return foo;
}
Таким образом, люди могут видеть foo
но не меняй его.
Да.
Вы должны будете вызвать метод хотя (и вы не можете использовать class
как имя класса):
public class Class2()
{
Class myClass = new Class();
public void showInt()
{
System.out.print(myClass.getInt());
}
}
То, что происходит, - то, что вы не получаете доступ к частному члену, но вы получаете копию значения. В этом случае вы получаете доступ к методу getInt(), а не к атрибуту. Если вы попытаетесь получить доступ к атрибуту:
public class Class2()
{
Class myClass = new Class();
public void showInt()
{
System.out.print(myClass.x);
}
}
вам не будет предоставлен доступ.