Перейти к тексту

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Вся введенная информация защищена.

  • Закрыть [x]

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

Вся введенная информация защищена.

  • Закрыть [x]

Успешное прохождение Java-сертификации, Часть 1: SCJP

Прадип (Pradeep) Чопра (Chopra) , Cofounder, WHIZlabs Software
Прадип Чопра (Pradeep Chopra) является одним из основателей компании WHIZlabs Software, мирового лидера в области оценки навыков в сфере ИТ и подготовки к сертификационным экзаменам. Прадип Чопра - выпускник Индийского Технологического Института в Дели. Он является автором множества экзаменационных симуляторов и учебных пособий для ИТ-сертификаций, а также статей в области J2EE. С ним можно связаться по адресу pradeep@whizlabs.com.

Описание:  Это руководство разработано для подготовки программистов к экзамену по платформе 1.4 Sun Certified Java Programmer (SCJP) и включает подробный обзор основных экзаменационных задач.

Дата:  02.04.2007
Уровень сложности:  простой

Активность:  50805 просмотров
Комментарии:  

Замещение, перегрузка и ориентация объектов

Инкапсуляция

Инкапсуляция - это упрятывание деталей реализации класса и разрешение доступа к классу посредством интерфейса общего пользования. Для этого необходимо описать переменные экземпляра класса как приватные или защищённые. Клиентский код должен иметь доступ только к общим методам, а не напрямую к данным. Кроме того, методы должны соответствовать соглашению об именах Java-компонентов set и get.

Инкапсуляция упрощает поддержку и изменение кода. Когда внутренняя реализация кода меняется, клиентский код остаётся прежним, в то время как сигнатуры общего метода не изменяются. Например:

  public class Employee	
  {
    private float salary;
    public float getSalary()
    { 
      return salary;
    }
    public void setSalary(float salary)
    {
      this.salary = salary;
    }  

Взаимосвязь IS-A ("ЕСТЬ")
Взаимосвязь IS-A основана на наследовании. В Java-программировании она реализуется с помощью ключевого слова extends. Например:

  public class Animal {...}
  public class Cat extends Animal
  {
    // Code specific to a Cat. Animal's common code is inherited
  }

Здесь Cat extends Animal означает, что Cat наследует от Animal или Cat является типом Animal . Таким образом, Cat имеет взаимосвязь IS-A с Animal.

Взаимосвязь HAS-A ("ИМЕЕТ")
Если экземпляр класса A имеет ссылку на экземпляр класса B, мы говорим, что A HAS-A B. Например:

  class Car
  {
    private Engine e;
  }
  class Engine {}

Здесь класс Car может использовать функционал класса Engine, не имея в нём специфических методов класса Engine. Таким образом, мы можем многократно применять класс Engine в множестве приложений. Следовательно, взаимосвязь HAS-A позволяет иметь специализированные классы для специфических функций.


Полиморфизм

Полиморфизм означает "любые формы". В объектно-ориентированном программировании это относится к способности объектов по-разному реагировать на один и тот же метод. В языке Java полиморфизм может реализовываться в том, что множество методов имеют одно и то же имя. Java-код использует позднее связывание для поддержания полиморфизма; вызываемый метод, выбирается во время выполнения.

Перегруженные методы - это методы с идентичным именем, но с разными списками аргументов. Замещение, происходит тогда, когда метод подкласса имеет такое же имя, такой же тип возврата и список аргументов, как и метод суперкласса.

Перегрузка
Как говорилось выше, перегруженные методы обязательно имеют одинаковое имя, но разные списки аргументов. Аргументы могут отличаться по типу или количеству (или и то и др.) Тем не менее, типы возвращаемого значения перегруженных методов могут быть одинаковыми или различаться. Они могут иметь разные модификаторы доступа и генерировать разные проверенные исключения.

Рассмотрим метод print(), используемый для данных вывода. Данные могут иметь типы int, boolean или char. Для каждого типа данных метод print() должен реализовываться по-разному. Ниже приведён пример использования перегруженных методов:

  void print(int i) {}
  void print(boolean b) {}
  void print(char c) {}

Активизированный метод зависит от типа переданных аргументов. Подкласс может перегружать методы, которые он наследует от своего суперкласса. Конструкторы могут перегружаться, что позволяет нам создавать экземпляр класса с разными типами аргументов. В следующем примере конструктор подкласса активизирует перегруженный конструктор суперкласса, который принимает целочисленный аргумент:

  class Base
  {
    Base() {}
    Base(int a) 
    { 
      System.out.println(a); 
    } //Overloaded constructors
  }

  class Derived 
  {
    Derived(int a, int b){ super(a); } 
  }

Замещение
Подкласс может переопределить метод, наследуемый им от суперкласса. Метод, фактически вызываемый, зависит от типа вызывающего объекта во время выполнения. Замещающий метод должен иметь такое же имя, аргументы и тип возвращаемого значения, как и замещённый метод.

Замещающий метод должен быть таким же общедоступным, как и переопределённый метод. Замещающий метод не должен генерировать новые или более широкие проверенные исключения, не объявленные исходным методом. В следующем примере активизируется замещённая версия метода print(), так как вызывающий объект является экземпляром производного класса:

  class Base
  {
    void print()
    {
      System.out.println("Base");
    }
  }	
  class Derived extends Base
  {
    void print()
    {
      System.out.println("Derived");
    }
    public static void main(String args[])	
    {
      Base obj = new Derived();
      obj.print(); 	// "Derived" is printed 	
    }
  }

Чтобы вызвать суперкласс-версию замещённого метода из подкласса используйте super.methodName(). В вышеприведённом примере подкласс может использовать функционал метода print() из суперкласса, вызвав super.print().

Методы, объявленные как конечные, не могут быть замещены подклассом. Несмотря на то, что конструкторы могут быть перегружены, они не могут быть замещены, так как они не наследуемы.


Резюме

В этом разделе мы рассмотрели преимущества инкапсуляции. Итак, взаимосвязь наследования свойств называется "IS-A" взаимосвязь. Взаимосвязь "HAS-A" указывает, что один класс содержит ссылку на другой класс. Вы должны уметь идентифицировать тип взаимосвязи из данного сценария. Разберитесь в различиях между перегрузкой и замещением.


Упражнение

Вопрос:

Какой из предложенных вариантов может быть выбран при запросе " insert code here (вставьте код)" в следующем коде?

  class Parent
  { 
    public void print(int i) 
    { 
    }
  } 
  public class Child extends Parent
  {
    public static void main(String argv[])	
    {
    } 
    // insert code here
  }

Варианты ответа:

  • A. public void print(int i, byte b) throws Exception {}
  • B. public void print(int i, long i) throws Exception {}
  • C. public void print(long i) {}
  • D. public void print(int i) throws Exception {}
  • E. public int print(int i)

Правильный ответ:

  • A, B, and C

Пояснение:

Вариант D не скомпилируется, так как он пытается сгенерировать проверенное исключение, не объявленное в классе Parent. Вариант E не скомпилируется, так как отличается только тип возвращаемого значения; список аргументов и имя метода одинаковые. Это недопустимо ни в перегрузке, ни в замещении. Варианты A, B, и C имеют разные списки аргументов, следовательно, они представляют перегрузку, а не замещение. Они достоверны, так как они могут сгенерировать любые исключения.

7 из 13 | предыдущая | следующая

Комментарии



static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Технология Java
ArticleID=205807
TutorialTitle=Успешное прохождение Java-сертификации, Часть 1: SCJP
publish-date=04022007
author1-email=
author1-email-cc=

Теги

Help
Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Используйте ползунок, чтобы отразить больше или меньше тегов.

КнопкаПопулярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere).

Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).

Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Кнопка Популярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere). Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).