Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .equals () переопределяется для сравнения содержимого:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)
Квалификаторы доступа просто применяются к коду, который следует до следующего квалификатора. Нет никаких ограничений на количество или порядок таких квалификаторов.
Обычно нет необходимости повторять один и тот же квалификатор доступа в классе, и это может запутать читателя. Они также могут влиять на структуру класса, поскольку члены данных, следующие за одним и тем же квалификатором, должны располагаться в том порядке, в котором они объявлены, но между квалификаторами такого ограничения нет.
Как объясняется в ответе @Marcelo Cantos , это разрешено. При написании кода самостоятельно вы должны избегать этого, поскольку это приведет к путанице только тогда, когда другие читают ваш код. Единственное место, где я когда-либо видел это в реальной жизни, - это код, сгенерированный различными мастерами MFC. Всякий раз, когда вы добавляете что-то в свой класс с помощью мастера, он просто добавляет дополнительный раздел в конец вашего класса.
Как говорит Марсело, вы можете использовать классификаторы public, private и protected столько раз, сколько захотите. «Когда» полностью личное. Некоторым людям нравится это:
class AClass
{
public:
// all the public stuff
protected:
// all the protected stuff
private:
// all the private stuff
};
но лично (и это на самом деле просто личное предпочтение) мне нравится делать следующее:
class AClass
{
// constructors and destructors
public:
// public cons/dest
protected:
// protected cons/dest
private:
// private cons/dest
// accessors
public:
protected:
private:
// methods
public:
protected:
private:
// members
public:
protected:
private:
};
Не стесняйтесь придумывать свой собственный стиль, какой бы вам ни был удобен. Нет правильного или неправильного способа сделать это. Просто постарайся быть последовательным.
Обычно я стараюсь организовать объявление класса так, чтобы другим было легко использовать указанный класс.
Обычно это: общедоступный / защищенный / частный
, в таком порядке, потому что это упрощает жизнь читателям.
protected
, все, что будет после этого, их не касается.
, все, что находится после него, - это детали реализации. Это, в сочетании с отказом от написания кода методов в точке их объявления, делает интерфейс более удобным для чтения.
Однако есть несколько уловок:
public / protected / private
friend
), у вас есть общедоступный раздел
, который на самом деле предназначен только для небольшой части пользователей и лучше всего изолирован либо внизу обычного раздела public
, либо после раздела protected
. Наконец, что касается комментария по поводу макета проблемы среди атрибутов. Инкапсуляция означает, что атрибуты должны быть частными
. Итак, либо у вас есть структура
, и все общедоступно
, либо у вас есть класс, и все частное
, смешивание этих двух означает нарушение инкапсуляции, и это ошибка в разработке.
Да, это правильно, но лично я предпочитаю иметь только одну общедоступную секцию в верхней части класса, на которую программисты обращают внимание в первую очередь при изучении нового класса. Тогда легче увидеть, какие части должны быть доступны, а какие нет, вместо того, чтобы просматривать весь заголовок класса.
Класс правильный, public - это просто квалификатор доступа и будет применяться до тех пор, пока не будет виден следующий квалификатор или до конца объявления класса. Нет ограничений на количество этих квалификаторов доступа (общедоступных, частных, защищенных), которые вы можете иметь в классе. Что касается того, почему это полезно, это помогает писать объявления классов так, как вы хотите. Например, я мог бы захотеть, чтобы все функции-члены (общедоступные, защищенные или частные) были объявлены перед (скажем) частными членами данных.