среда, 18 апреля 2012 г.

Java и модификаторы доступа

   Привет, Марсиане. Сегодня я поведаю вам еще немного информации о очень увлекательном и самом распространенным языке на планете. На нем говорят даже бабушки. В общем речь идет о JAVA. 
   Что-то зачастил со статьями. Когда-то примерно год назад решил, что буду писать каждый день и хотя бы по чуть-чуть. И таким образом разовью в себе писательский или еще какой-нибудь талант:)
   Речь сегодня пойдет о модификаторах доступа. В Java их всего три:
  1. private - модификатор открытого доступа
  2. public - модификатор закрытого доступа
  3. protected - модификатор защищенного доступа
   Дальше обо всем по порядку.
   Итак, модификатор private позволяет скрывать методы и поля класса от любопытных глаз. Т.е. если у метода или класса будет этот модификатор, то вне класса к нему нельзя будет обратиться. 
Этот модификатор позволяет придерживаться инкапсуляции данных
   Модификатор доступа public предоставляет полную свободу как внутри класса, так и снаружи его. Чем плох этот модификатор? А плох он тем, что предоставляет неограниченную свободу программистам. Дай ребенку волю, так он всю квартиру разнесет и устроит для соседей аквапарк. Тоже самое и с программистом. Свобода должна быть в меру.
   Модификатор protected. Я называю его золотой серединой. Ибо методы и поля, объявленные с таким модификатором можно использовать только в подклассах, а так же классах находящихся в том же пакете. Как правило в большей степени используют этот  модификатор для методов, нежели для полей. Так как существует вероятность, когда без вашего ведома другие программисты будут использовать поля вашего супер класса в своих подклассах. После этого вы уже не сможете изменить реализацию класса не уведомив об этом других программистов.
   
   Ниже определены несколько правил, которые я определил для себя. Но, ими могут пользоваться и другие программисты.
  1. Все поля класса объявлять с модификатором private. 
  2. Все методы, которые не нужны вне класса делать закрытыми (private).
  3. Если метод нужен вне класса, то определять его открытым (public).
  4. Если возможно так случится, что метод понадобится в других классах, то определяем его защищенным.
  5. Если все-таки очень захотелось использовать поля супер класса в подклассах, то конечно же можно использовать модификатор protected. Но лучше этого не делать.
  6. Модификатор public использовать только для констант. Полей объявленных с ключевым словом final.
В заключении хочу сказать, что на самом деле есть еще один модификатор доступа. Он невидимый, но он существует:) Если метод или поле определить без модификатора, то область их видимости распространяется только на пакет. 
     
   

вторник, 17 апреля 2012 г.

Abstract class. What is it?

   Абстрактные классы. Что же это? И с чем это едят? Под сырным или укропным соусом? На эти и другие вопросы ответ будет дан ниже.
   Иногда возникает ситуация, когда мы имеем супер класс, большинство его методов используем в подклассах. Супер классы находясь в верхней части иерархии становятся настолько абстрактными, что их можно рассматривать как определенную базу для разработки других классов. В этом случае необходимо создавать абстрактные классы. 
abstract class   На рисунке слева изображена иерархическая цепочка классов, в которой определен абстрактный класс "Насекомое" и пара подклассов.
   Данный класс имеет два подкласса "Жук" и "Муха". Действительно "Жук" и "Муха" являются насекомыми, а обратное утверждение не может быть верным, ибо не каждое насекомое может быть мухой или же жуком.
   С абстрактными классами действительны следующие утверждения:
  • Нельзя использовать конструктор для абстрактного класса.
  • Если в подклассе не определить все методы абстрактного класса, то подкласс так же становится абстрактным.
  • Возможно создание массива абстрактных классов, где элементы массива инициализированы подклассами. При этом у элементов массива возможно вызывать методы только абстрактного класса.
   Обо всем этом далее более подробно.
   Для начала об определении абстрактного класса. Абстрактный класс обозначается в коде следующим образом
abstract class Insect {

}
   Абстрактный класс по определению должен содержать абстрактные методы, которые представляют собой прототипы методов, реализованных в подклассах.
   Для класса Insect определим метод getDesctiption(). C его помощью мы получим описание данного объекта.К примеру: Жук богомол любит траву, но и не против полакомиться своими соседями
public abstract class Insect {
 private String name;
 
 public Insect(String n){
  this.name = n;
 }
 
 public String getName(){
  return this.name;
 }
 
 abstract public String getDecription();
}
   Чтобы было возможно работать с этим методом, его необходимо определить в подклассе Fly
public class Fly extends Insect {
 public Fly(String n){
  super(n);
 }

 public String getName() {
  return super.getName();
 }

 /**
  * Переопределенный метод
  */
 @Override
 public String getDecription() {
  return  "Жук " + getName() + " любит питаться пальчиками людей";
 }
}
   Класс Fly уже нельзя назвать абстрактным, так как он определил все методы (точнее один единственный) своего супер класса Insect. Обычно переопределенные методы обозначаются с помощью конструкции @override. Она явно дает знать, что данный метод не собственный у класса, а метод переопределенный.
   Для класса Insect нельзя вызывать конструктор, т.к. это приведет к ошибке:
new Insect("полоскун");
Данный код приведет к ошибке. Но без проблем можно создать объект подкласса
Fly fly = new Fly("Навозная");
Несмотря на то, что у абстрактных классов нельзя вызывать конструктор, но переменные абстрактных классов все же можно использовать. Ниже показана эта возможность:
Insect[] insect = new Insect[2];
  insect[0] = new Fly("Цеце");
  insect[1] = new Bug("Усач");
  
  for(Insect i : insect){
   System.out.println(i.getDecription());
  }
Здесь мы создаем массив класса Insect, элементы которого инициализируем экземплярами подклассов Fly и Bug и далее вызываем метод getDecription(). Ниже весь код программы:
public class TestBug {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Fly fly = new Fly("Навозная");
  
  Insect[] insect = new Insect[2];
  insect[0] = new Fly("Цеце");
  insect[1] = new Bug("Усач");
  
  for(Insect i : insect){
   System.out.println(i.getDecription());
  }
 }

}

//Абстрактный класс
public abstract class Insect {
 private String name;
 
 public Insect(String n){
  this.name = n;
 }
 
 public String getName(){
  return this.name;
 }
 
 abstract public String getDecription();
}

public class Bug extends Insect {
 public Bug(String n){
  super(n);
 }
 public String getName(){
  return super.getName();
 }
 @Override
 public String getDecription() {
  return getName() + " спаситель черепах";
 }
}

public class Fly extends Insect {
 public Fly(String n){
  super(n);
 }

 public String getName() {
  return super.getName();
 }

 /**
  * Переопределенный метод
  */
 @Override
 public String getDecription() {
  return  "Жук " + getName() + " любит питаться пальчиками людей";
 }
}
На этом все! Спасибо:)

//ActionScript3 //C# //CSS //Java //JavaScript //Python //Sql //Xml