🗊Презентация Наследование в Java. (Лекция 2)

Нажмите для полного просмотра!
Наследование в Java. (Лекция 2), слайд №1Наследование в Java. (Лекция 2), слайд №2Наследование в Java. (Лекция 2), слайд №3Наследование в Java. (Лекция 2), слайд №4Наследование в Java. (Лекция 2), слайд №5Наследование в Java. (Лекция 2), слайд №6Наследование в Java. (Лекция 2), слайд №7Наследование в Java. (Лекция 2), слайд №8Наследование в Java. (Лекция 2), слайд №9Наследование в Java. (Лекция 2), слайд №10Наследование в Java. (Лекция 2), слайд №11Наследование в Java. (Лекция 2), слайд №12Наследование в Java. (Лекция 2), слайд №13Наследование в Java. (Лекция 2), слайд №14Наследование в Java. (Лекция 2), слайд №15Наследование в Java. (Лекция 2), слайд №16Наследование в Java. (Лекция 2), слайд №17Наследование в Java. (Лекция 2), слайд №18Наследование в Java. (Лекция 2), слайд №19Наследование в Java. (Лекция 2), слайд №20Наследование в Java. (Лекция 2), слайд №21Наследование в Java. (Лекция 2), слайд №22Наследование в Java. (Лекция 2), слайд №23Наследование в Java. (Лекция 2), слайд №24

Содержание

Вы можете ознакомиться и скачать презентацию на тему Наследование в Java. (Лекция 2). Доклад-сообщение содержит 24 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Лекция 2
Описание слайда:
Лекция 2

Слайд 2





Наследование
Наследование в Java имеет тот же смысл, что и в С++. Однако наследование в Java осуществляется при помощи ключевого слова extends. Рассмотрим пример:
class Attr { 
   private String name; 
   private Object value = null; 
   public Attr(String nameOf) { name = nameOf; } 
   public Attr(String nameOf, Object valueOf){ 
      name = nameOf; 
      value = valueOf; 
   } 
public String nameOf() { return name; } 
public Object valueOf() { return value; } 
…………………………….}
Описание слайда:
Наследование Наследование в Java имеет тот же смысл, что и в С++. Однако наследование в Java осуществляется при помощи ключевого слова extends. Рассмотрим пример: class Attr { private String name; private Object value = null; public Attr(String nameOf) { name = nameOf; } public Attr(String nameOf, Object valueOf){ name = nameOf; value = valueOf; } public String nameOf() { return name; } public Object valueOf() { return value; } …………………………….}

Слайд 3





class ColorAttr extends Attr { 
class ColorAttr extends Attr { 
    private ScreenColor myColor;
    public ColorAttr(String name, Object value) {
        super(name, value); //вызов конструктора суперкласса
        decodeColor(); 
     } 
    public ColorAttr(String name) { 
       this(name, “transparent”); // вызов первого конструктора
    } 
    public ColorAttr(String name, ScreenColor value) { 
      super(name, value.toString()); 
      myColor = value; 
    } 
    public Object valueOf(Object newValue) { 
      // сначала выполнить метод valueOf() суперкласса 
      Object retval = super.valueOf(newValue); 
      decodeColor(); 
      return retval; 
    }
    …………………………….
}
Описание слайда:
class ColorAttr extends Attr { class ColorAttr extends Attr { private ScreenColor myColor; public ColorAttr(String name, Object value) { super(name, value); //вызов конструктора суперкласса decodeColor(); } public ColorAttr(String name) { this(name, “transparent”); // вызов первого конструктора } public ColorAttr(String name, ScreenColor value) { super(name, value.toString()); myColor = value; } public Object valueOf(Object newValue) { // сначала выполнить метод valueOf() суперкласса Object retval = super.valueOf(newValue); decodeColor(); return retval; } ……………………………. }

Слайд 4





 Иерархия классов для нашего примера выглядит следующим образом(класс Object присуствует в любой иерархии):
 Иерархия классов для нашего примера выглядит следующим образом(класс Object присуствует в любой иерархии):
Описание слайда:
Иерархия классов для нашего примера выглядит следующим образом(класс Object присуствует в любой иерархии): Иерархия классов для нашего примера выглядит следующим образом(класс Object присуствует в любой иерархии):

Слайд 5





Порядок вызова конструкторов в производных классах
Порядок вызова конструкторов в производных классах
При создании объекта всем его полям присваиваются исходные значения по умолчанию в зависимости от их типа. Затем происходит вызов конструктора. Каждый конструктор выполняется за три фазы:
1. Вызов конструктора суперкласса.
2. Присвоение значений полям при помощи инициализаторов.
3. Выполнение тела конструктора.
Рассмотрим пример:
Описание слайда:
Порядок вызова конструкторов в производных классах Порядок вызова конструкторов в производных классах При создании объекта всем его полям присваиваются исходные значения по умолчанию в зависимости от их типа. Затем происходит вызов конструктора. Каждый конструктор выполняется за три фазы: 1. Вызов конструктора суперкласса. 2. Присвоение значений полям при помощи инициализаторов. 3. Выполнение тела конструктора. Рассмотрим пример:

Слайд 6





class X { 
class X { 
   protected int xMask = 0x00ff; 
   protected int fullMask; 
 public X() { fullMask = xMask; } 
 public int mask(int orig){
     return (orig & fullMask);
 } 
}
class Y extends X { 
   protected int yMask = 0xff00; 
    public Y() {yMask |= fullMask; }
}
Рассмотрим значения полей на каждом этапе:
Присвоение значений полям по умолчанию.
 xMask=0, fullMask=0, yMask=0.
Описание слайда:
class X { class X { protected int xMask = 0x00ff; protected int fullMask; public X() { fullMask = xMask; } public int mask(int orig){ return (orig & fullMask); } } class Y extends X { protected int yMask = 0xff00; public Y() {yMask |= fullMask; } } Рассмотрим значения полей на каждом этапе: Присвоение значений полям по умолчанию. xMask=0, fullMask=0, yMask=0.

Слайд 7





 2. Вызов конструктора класса Y
 2. Вызов конструктора класса Y
xMask=0, fullMask=0, yMask=0.
3. Вызов конструктора X
   xMask=0, fullMask=0, yMask=0.
4. Инициализация полей X
 xMask= 0x00ff, fullMask=0, yMask=0.
5. Выполнение конструктора X
xMask= 0x00ff, fullMask= 0x00ff, yMask=0.
6. Инициализация полей Y
xMask= 0x00ff, fullMask= 0x00ff, yMask= 0xff00.
7. Выполнение конструктора Y
xMask= 0x00ff, fullMask= 0x00ff, yMask= 0xffff
Описание слайда:
2. Вызов конструктора класса Y 2. Вызов конструктора класса Y xMask=0, fullMask=0, yMask=0. 3. Вызов конструктора X xMask=0, fullMask=0, yMask=0. 4. Инициализация полей X xMask= 0x00ff, fullMask=0, yMask=0. 5. Выполнение конструктора X xMask= 0x00ff, fullMask= 0x00ff, yMask=0. 6. Инициализация полей Y xMask= 0x00ff, fullMask= 0x00ff, yMask= 0xff00. 7. Выполнение конструктора Y xMask= 0x00ff, fullMask= 0x00ff, yMask= 0xffff

Слайд 8





Переопределение методов и скрытие полей
Переопределение методов и скрытие полей
Методы в Java как и в С++ можно переопределять. Расширенный класс может изменить права доступа к методам, унаследованным из суперкласса, но лишь в том случае, если он расширяет их. 
Метод, объявленный в суперклассе как protected, может быть повторно заявлен как protected (вполне обычная ситуация) или public, но не как private. 
Ограничивать доступ к методам по сравнению с суперклассом бессмысленно, поскольку такое ограничение очень легко обойти: достаточно преобразовать ссылку в супертип с большими правами доступа и использовать ее для вызова метода.
Описание слайда:
Переопределение методов и скрытие полей Переопределение методов и скрытие полей Методы в Java как и в С++ можно переопределять. Расширенный класс может изменить права доступа к методам, унаследованным из суперкласса, но лишь в том случае, если он расширяет их. Метод, объявленный в суперклассе как protected, может быть повторно заявлен как protected (вполне обычная ситуация) или public, но не как private. Ограничивать доступ к методам по сравнению с суперклассом бессмысленно, поскольку такое ограничение очень легко обойти: достаточно преобразовать ссылку в супертип с большими правами доступа и использовать ее для вызова метода.

Слайд 9





При вызове метода для некоторого объекта его реализация выбирается в зависимости от фактического типа объекта. Рассмотрим следующий пример:
При вызове метода для некоторого объекта его реализация выбирается в зависимости от фактического типа объекта. Рассмотрим следующий пример:
  class SuperShow { 
    public String str = “SuperStr”; 
    public void show() { 
       System.out.println(“Super.show: ” + str); 
     }
  }
  
class ExtendShow extends SuperShow { 
   public String str = “ExtendStr”;
   public void show() { 
        System.out.println(“Extend.show: ” + str); } 
 
  public static void main(String[] args) { 
   ExtendShow ext = new ExtendShow(); 
   SuperShow sup = ext; 
   sup.show(); // вызывается show из класса ExtendShow
   ext.show(); // вызывается show из класса ExtendShow
   System.out.println(“sup.str = ” + sup.str);//печатается SuperStr
   System.out.println(“ext.str = ” + ext.str); // печатается ExtendStr 
   }
}
Описание слайда:
При вызове метода для некоторого объекта его реализация выбирается в зависимости от фактического типа объекта. Рассмотрим следующий пример: При вызове метода для некоторого объекта его реализация выбирается в зависимости от фактического типа объекта. Рассмотрим следующий пример: class SuperShow { public String str = “SuperStr”; public void show() { System.out.println(“Super.show: ” + str); } } class ExtendShow extends SuperShow { public String str = “ExtendStr”; public void show() { System.out.println(“Extend.show: ” + str); } public static void main(String[] args) { ExtendShow ext = new ExtendShow(); SuperShow sup = ext; sup.show(); // вызывается show из класса ExtendShow ext.show(); // вызывается show из класса ExtendShow System.out.println(“sup.str = ” + sup.str);//печатается SuperStr System.out.println(“ext.str = ” + ext.str); // печатается ExtendStr } }

Слайд 10





Если существующий метод получает параметр типа SuperShow и обращается к str через ссылку на объект-параметр, он всегда будет получать SuperShow.str, даже если методу на самом деле был передан объект типа ExtendShow. 
Если существующий метод получает параметр типа SuperShow и обращается к str через ссылку на объект-параметр, он всегда будет получать SuperShow.str, даже если методу на самом деле был передан объект типа ExtendShow.
Описание слайда:
Если существующий метод получает параметр типа SuperShow и обращается к str через ссылку на объект-параметр, он всегда будет получать SuperShow.str, даже если методу на самом деле был передан объект типа ExtendShow. Если существующий метод получает параметр типа SuperShow и обращается к str через ссылку на объект-параметр, он всегда будет получать SuperShow.str, даже если методу на самом деле был передан объект типа ExtendShow.

Слайд 11





Ключевое слово super
Ключевое слово super
Ключевое слово super может использоваться во всех нестатических методах класса. При доступе к полям или вызове методов ключевое слово super представляет собой ссылку на текущий объект как экземпляр суперкласса.
В вызове вида super.method() всегда используется реализация method из суперкласса, а не его переопределенная реализация, которая находится где-то ниже в иерархии классов. 
Рассмотрим пример:
Описание слайда:
Ключевое слово super Ключевое слово super Ключевое слово super может использоваться во всех нестатических методах класса. При доступе к полям или вызове методов ключевое слово super представляет собой ссылку на текущий объект как экземпляр суперкласса. В вызове вида super.method() всегда используется реализация method из суперкласса, а не его переопределенная реализация, которая находится где-то ниже в иерархии классов. Рассмотрим пример:

Слайд 12





class That { 
class That { 
  /** вернуть имя класса */ 
   protected String nm() { return “That”; }
 }

class More extends That { 
   protected String nm() { return “More”; } 
   protected void printNM() {
        That sref =(That)this;
        System.out.println(“this.nm() = ” + this.nm()); 
       //Вызывается nm() из More
       System.out.println(“sref.nm() = ” + sref.nm()); 
       //Вызывается nm() из More
      System.out.println(“super.nm() = ”+super.nm()); 
     //Вызывается nm() из That 
   }
 }
Описание слайда:
class That { class That { /** вернуть имя класса */ protected String nm() { return “That”; } } class More extends That { protected String nm() { return “More”; } protected void printNM() { That sref =(That)this; System.out.println(“this.nm() = ” + this.nm()); //Вызывается nm() из More System.out.println(“sref.nm() = ” + sref.nm()); //Вызывается nm() из More System.out.println(“super.nm() = ”+super.nm()); //Вызывается nm() из That } }

Слайд 13





Объявление методов и классов с ключевым словом final
Объявление методов и классов с ключевым словом final
Если метод объявлен с атрибутом final, это означает, что ни один расширенный класс не сможет переопределить данный метод с целью изменить его поведение. 
Другими словами, данная версия метода является окончательной. Пример:
 class A{
   final void f(){……};
}
class B extends A{
  void f(){…………..}; //error 
}
Описание слайда:
Объявление методов и классов с ключевым словом final Объявление методов и классов с ключевым словом final Если метод объявлен с атрибутом final, это означает, что ни один расширенный класс не сможет переопределить данный метод с целью изменить его поведение. Другими словами, данная версия метода является окончательной. Пример: class A{ final void f(){……}; } class B extends A{ void f(){…………..}; //error }

Слайд 14





Для класса тоже можно применять final:
Для класса тоже можно применять final:
final class NoExtending {...}
Класс, помеченный с атрибутом final, не может иметь наследников, а все его методы также неявно являются final
Описание слайда:
Для класса тоже можно применять final: Для класса тоже можно применять final: final class NoExtending {...} Класс, помеченный с атрибутом final, не может иметь наследников, а все его методы также неявно являются final

Слайд 15





Класс Object
Класс Object
Все классы являются явными или неявными расширениями класса Object и, таким образом, наследуют его методы. Рассмотрим методы класса Object:
  1.public boolean equals(Object obj)
Сравнивает объект-получатель с объектом, на который указывает ссылка obj; возвращает true, если объекты равны между собой, и false в противном случае. Если нужно выяснить, указывают ли две ссылки на один и тот же объект, можно сравнить их с помощью операторов == и !=, а метод equals предназначен для сравнения значений. 
  Реализация метода equals, принятая в Object по умолчанию, предполагает, что объект равен лишь самому себе.
  При этом super.equals(this) – вернет true.
Описание слайда:
Класс Object Класс Object Все классы являются явными или неявными расширениями класса Object и, таким образом, наследуют его методы. Рассмотрим методы класса Object: 1.public boolean equals(Object obj) Сравнивает объект-получатель с объектом, на который указывает ссылка obj; возвращает true, если объекты равны между собой, и false в противном случае. Если нужно выяснить, указывают ли две ссылки на один и тот же объект, можно сравнить их с помощью операторов == и !=, а метод equals предназначен для сравнения значений. Реализация метода equals, принятая в Object по умолчанию, предполагает, что объект равен лишь самому себе. При этом super.equals(this) – вернет true.

Слайд 16





2. public int hashCode()
2. public int hashCode()
Возвращает хеш-код для данного объекта. Каждому объекту может быть присвоен некоторый хеш-код, используемый при работе с хеш-таблицами. 
По умолчанию возвращается значение, которое является уникальным для каждого объекта. Оно используется при сохранении объектов в таблицах Hashtable.
3. protected Object clone() throws 
                                                       CloneNotSupportedException
Возвращает дубликат объекта. Дубликатом является новый объект- копия объекта, для которого вызывался метод clone.
4. public final Class getClass()
Возвращает объект типа Class, который соответствует классу данного объекта.
Описание слайда:
2. public int hashCode() 2. public int hashCode() Возвращает хеш-код для данного объекта. Каждому объекту может быть присвоен некоторый хеш-код, используемый при работе с хеш-таблицами. По умолчанию возвращается значение, которое является уникальным для каждого объекта. Оно используется при сохранении объектов в таблицах Hashtable. 3. protected Object clone() throws CloneNotSupportedException Возвращает дубликат объекта. Дубликатом является новый объект- копия объекта, для которого вызывался метод clone. 4. public final Class getClass() Возвращает объект типа Class, который соответствует классу данного объекта.

Слайд 17





5. protected void finalize() throws Throwable
5. protected void finalize() throws Throwable
Завершающие операции с объектом, осуществляемые во время сборки мусора. 
Методы hashCode и equals должны переопределяться, если необходима другая концепция равенства объектов, отличающуюся от принятой в классе Object. 
По умолчанию считается, что два различных объекта не равны между собой, а их хеш-коды не должны совпадать.
Описание слайда:
5. protected void finalize() throws Throwable 5. protected void finalize() throws Throwable Завершающие операции с объектом, осуществляемые во время сборки мусора. Методы hashCode и equals должны переопределяться, если необходима другая концепция равенства объектов, отличающуюся от принятой в классе Object. По умолчанию считается, что два различных объекта не равны между собой, а их хеш-коды не должны совпадать.

Слайд 18





Абстрактные классы и методы
Абстрактные классы и методы
Абстрактный класс необходим, когда некоторое поведение характерно для большинства или всех объектов данного класса, но некоторые аспекты имеют смысл лишь для ограниченного круга объектов, не составляющих суперкласса.
 
В Java такие классы объявляются с ключевым словом abstract, и каждый метод, не реализованный в классе, также объявляется abstract.
Описание слайда:
Абстрактные классы и методы Абстрактные классы и методы Абстрактный класс необходим, когда некоторое поведение характерно для большинства или всех объектов данного класса, но некоторые аспекты имеют смысл лишь для ограниченного круга объектов, не составляющих суперкласса. В Java такие классы объявляются с ключевым словом abstract, и каждый метод, не реализованный в классе, также объявляется abstract.

Слайд 19





Рассмотрим пример:
Рассмотрим пример:
 abstract class Benchmark { 
   abstract void benchmark(); 
   public long repeat(int count) { 
     long start = System.currentTimeMillis(); 
     for (int i = 0; i < count; i++) {
                        benchmark(); }
     return (System.currentTimeMillis() — start); }}

class MethodBenchmark extends Benchmark { 
   public void benchmark() { ….} //Метод должен быть переопределен обязательно, т.к. в Benchmark он абстрактный.
   public static void main(String[] args) { 
     int count = Integer.parseInt(args[0]); 
     long time = new MethodBenchmark().repeat(count);
     System.out.println(count + “ methods in ” + time 
                                                                           + “milliseconds”); 
 }}
Описание слайда:
Рассмотрим пример: Рассмотрим пример: abstract class Benchmark { abstract void benchmark(); public long repeat(int count) { long start = System.currentTimeMillis(); for (int i = 0; i < count; i++) { benchmark(); } return (System.currentTimeMillis() — start); }} class MethodBenchmark extends Benchmark { public void benchmark() { ….} //Метод должен быть переопределен обязательно, т.к. в Benchmark он абстрактный. public static void main(String[] args) { int count = Integer.parseInt(args[0]); long time = new MethodBenchmark().repeat(count); System.out.println(count + “ methods in ” + time + “milliseconds”); }}

Слайд 20





Дублирование объектов 
Дублирование объектов 
Метод Object.сlone помогает производить дублирование объектов. 
При дублировании возвращается новый объект, исходное состояние которого копирует состояние объекта, для которого был вызван метод clone. 
Все последующие изменения, вносимые в объект-дубль, не изменяют состояния исходного объекта.  
Самая простая возможность создать дублируемый класс — объявить о реализации в нем интерфейса Cloneable: 
class MyClass extends AnotherClass        implements Cloneable {...}
Описание слайда:
Дублирование объектов Дублирование объектов Метод Object.сlone помогает производить дублирование объектов. При дублировании возвращается новый объект, исходное состояние которого копирует состояние объекта, для которого был вызван метод clone. Все последующие изменения, вносимые в объект-дубль, не изменяют состояния исходного объекта. Самая простая возможность создать дублируемый класс — объявить о реализации в нем интерфейса Cloneable: class MyClass extends AnotherClass implements Cloneable {...}

Слайд 21





Метод clone в интерфейсе Cloneable имеет атрибут public, следовательно, метод MyClass.clone, унаследованный от Object, также будет public. 
Метод clone в интерфейсе Cloneable имеет атрибут public, следовательно, метод MyClass.clone, унаследованный от Object, также будет public. 
Рассмотрим пример:
public class IntegerStack implements Cloneable {        private int[] buffer;
   private int top;        
   public IntegerStack(int maxContents) {
       buffer = new int[maxContents];
       top = -1;  }        
   public void push(int val) { 
    buffer[++top] = val; }  }
Описание слайда:
Метод clone в интерфейсе Cloneable имеет атрибут public, следовательно, метод MyClass.clone, унаследованный от Object, также будет public. Метод clone в интерфейсе Cloneable имеет атрибут public, следовательно, метод MyClass.clone, унаследованный от Object, также будет public. Рассмотрим пример: public class IntegerStack implements Cloneable { private int[] buffer; private int top; public IntegerStack(int maxContents) { buffer = new int[maxContents]; top = -1; } public void push(int val) { buffer[++top] = val; } }

Слайд 22





Если копировать объект класса IntegerStack прямо, например:
Если копировать объект класса IntegerStack прямо, например:
 IntegerStack first = new IntegerStack(2);
 first.push(2);
 first.push(9);
 IntegerStack second =
                                 (IntegerStack)first.clone();
 то изменяя second мы меняем first.
Правильное копирование – это переопределение метода clone в классе IntegerStack. 
Т.е. в классе IntegerStack определяем метод clone:
Описание слайда:
Если копировать объект класса IntegerStack прямо, например: Если копировать объект класса IntegerStack прямо, например: IntegerStack first = new IntegerStack(2); first.push(2); first.push(9); IntegerStack second = (IntegerStack)first.clone(); то изменяя second мы меняем first. Правильное копирование – это переопределение метода clone в классе IntegerStack. Т.е. в классе IntegerStack определяем метод clone:

Слайд 23





public Object clone() {
public Object clone() {
 try {
  IntegerStack nObj =(IntegerStack)super.clone();
  nObj.buffer = (int[])buffer.clone();
   return nObj; } 
 catch (CloneNotSupportedExeption e) { 
// Не может произойти - метод clone() 
//поддерживается классом IntegerStack, так и 
                                                            массивами 
  throw new InternalError(e.toString()); 
  }   
}
Описание слайда:
public Object clone() { public Object clone() { try { IntegerStack nObj =(IntegerStack)super.clone(); nObj.buffer = (int[])buffer.clone(); return nObj; } catch (CloneNotSupportedExeption e) { // Не может произойти - метод clone() //поддерживается классом IntegerStack, так и массивами throw new InternalError(e.toString()); } }

Слайд 24





Можно потребовать, чтобы метод clone поддерживался во всех наследниках данного класса, — для этого следует переопределить метод clone так, чтобы в его сигнатуру не входило объявление о возбуждении исключения CloneNotSupportedException. 
Можно потребовать, чтобы метод clone поддерживался во всех наследниках данного класса, — для этого следует переопределить метод clone так, чтобы в его сигнатуру не входило объявление о возбуждении исключения CloneNotSupportedException. 
В результате подклассы, в которых реализуется метод clone, не смогут возбуждать исключение CloneNotSupported Exception, поскольку методы подкласса не могут вводить новые исключения. 
Аналогично, если метод clone будет всегда возбуждать исключение СloneNotSupportedException, то в этом случае  это эквивалентно тому, что класс не поддерживает клонирование.
Описание слайда:
Можно потребовать, чтобы метод clone поддерживался во всех наследниках данного класса, — для этого следует переопределить метод clone так, чтобы в его сигнатуру не входило объявление о возбуждении исключения CloneNotSupportedException. Можно потребовать, чтобы метод clone поддерживался во всех наследниках данного класса, — для этого следует переопределить метод clone так, чтобы в его сигнатуру не входило объявление о возбуждении исключения CloneNotSupportedException. В результате подклассы, в которых реализуется метод clone, не смогут возбуждать исключение CloneNotSupported Exception, поскольку методы подкласса не могут вводить новые исключения. Аналогично, если метод clone будет всегда возбуждать исключение СloneNotSupportedException, то в этом случае это эквивалентно тому, что класс не поддерживает клонирование.



Похожие презентации
Mypresentation.ru
Загрузить презентацию