Наследование от абстрактного класса




Основы языка

 

Программа Hello World

 

package heroes;

 

public class HelloDragonWorld {

public static void main(String []args){

System.out.println(“ Hello World!”);

}

}

 

Пакет

Пакет – это совокупность классов и подпакетов, объединенных общим именем.

 

package mydragons;

public class Dragon{//реализация }

//использование import mydragons.Dragon;

Dragon red = new Dragon(Dragon.RED);

Dragon black = new mydragons.Dragon(Dragon.BLACK);

 

Класс

1. Класс – это базовая сущность ООП, обладающая определенными свойствами.

2. Любая программа на языке Java представляет собой класс.

 

package animals.slowanimals;

 

public class Reptile { public void eat(Bird b){

b.wasEaten = true;

}

}

 

Поле

Поле – это именованное свойство класса или объекта.

Поле может относиться как к каждому объекту, так и к классу в целом.

 

package animals.slowanimals;

 

public class Reptile { private int length;

}

 

Объект

• Объект – это переменная, типом которой является соответствующий класс.

• Объект также называют экземпляром класса.

 

package animals.slowanimals;

//класс:

public class Reptile { private int length;

}

//объект:

Reptile gecko = new Reptile();

 

Метод

Метод – это программная функция, относящаяся к определенному объекту или классу. Области, откуда метод может быть доступен, определяются модификаторами метода.

 

package animals.slowanimals; public class Reptile { private int length; public void eat(Bird b){ length++;

}

}

Наследование

Класс может заимствовать методы другого класса. Язык Java поддерживает операцию наследования:

 

// наследование производится с помощью

// ключевого слова extends

public class Dragon extends Reptile {

//внутреннее поле класса private String magic = “fire”; public String getMagic(){

//возврат результата

return fire;

}

}

Область видимости переменной

Каждая переменная может быть использована только в ее области видимости.

 

int i = 10;

System.out.println(i); //область видимости ограничится ближайшими фигурными скобками.

 

for (int j = 0; j < 100; j++){

System.out.println(j); // j видна внутри

//блока for

}

System.out.println(i); //i видна после блока

//for

System.out.println(j); //j: переменная вне //области видимости - ошибка

 

 

 

Модификаторы

 

1. Модификаторы доступа являются реализацией принципа инкапсуляции в языке Java.

2. Изменяя модификаторы, можно контролировать область видимости

• Полей

• Методов

• Классов

 

Модификаторы полей

• Отсутствие модификатора – поле доступно только из текущего пакета.

• static – поле принадлежит структуре класса. Одно значение присуще всем экземплярам.

• final – поле не может быть изменено (Константа).

• private – поле не может быть использовано нигде кроме данного класса или его экземпляра.

• protected – поле не может быть использовано нигде кроме данного класса и всех его наследников.

 

Модификаторы методов

• Отсутствие модификатора – доступен только из данного пакета.

• public – метод доступен из любого пакета (публичный API).

• final – не может быть переопределен в наследнике.

• static – метод принадлежит классу.

• abstract – метод не имеет реализации.

• private – метод не может быть использован ниоткуда кроме данного класса (его объекта).

• protected – метод не может быть использован ниоткуда кроме данного класса (его объекта) и всех его наследников (их объектов).

Модификаторы классов

• Отсутствие модификатора – доступен в текущем пакете.

• public – класс доступен из любого пакета (публичный API).

• final – не может расширяться методом наследования от него.

• abstract – класс является абстрактным, нельзя создать объект этого класса.

• static – допустимо только для вложенных классов.

Конструктор

• Конструктор – это метод, создающий экземпляр класса.

• Не имеет заданного возвращаемого значения.

• Имеет то же имя, что и класс.

• В классе всегда присутствует конструктор по умолчанию, если явно конструктор не задан.

public class Dragon{

private String color = gold; public Dragon(String newColor){ color = newColor;

}

}

Вызов метода

1. Вызов метода – это обращение к члену класса по его имени.

2. Результат вызова метода – выполненные операторы и возвращаемое значение (если указано).

public class Dragon{

private String name = “Kesha”; public String sayName (){ return “I am”+name;

}

}

Dragon dragon = new Dragon(); //конструктор

System.out.println(dragon.sayName()); //метод

 

 

 

 

Повторное использование имен

Переопределение

Методы предка и наследника могут быть одноименными.

class Reptile{

public void move(){/*ползти*/ }

}

class Dragon extends Reptile{ public void move(){/*лететь*/}

}

Dragon d = new Dragon();

d.move(); //обращение к методу экземпляра Dragon

Reptile r = new Reptile();

r.move(); //обращение к методу экземпляра Reptile

 

Сокрытие

Статические методы принадлежат классу.

 

class Reptile{

public static void move(){}

}

class Dragon extends Reptile{ public static void move(){}

}

Dragon d = new Dragon();

Reptile r = new Reptile();

d.move(); //обращение к методу Dragon

r.move(); //обращение к методу Reptile //Рекомендуется использовать вызовы класса:

Reptile.move(); Dragon.move();

 

Reptile r1 = new Dragon(); //обращение к методу Reptile

 

Перегрузка

Методы выполняют схожую функцию над разными типами данных.

 

class HungryDragon {

public void eat(int foodWeight){…} public void eat(String foodWeight){ //разбор строки на значимое целое число eat(Integer.parseInt(foodWeight));

}

}

HungryDragon hd = new HungryDragon(); hd.eat(10); hd.eat(“ 10 ”);

 

Затенение

1) Локальная переменная делает одноименную глобальную переменную невидимой в локальной области.

2) Так делать не рекомендуется.

 

public class Dragon {

static String type = “Just Dragon "; public static void main(String [] s){

String type = “Black Dragon";

//выведет “Black Dragon"

System.out.println(type);

}

}

 

Правила оформления

 

1) Основная цель хорошего оформления программы – она должна выглядеть понятной.

2) Среди требований можно отметить:

• Отступы.

• Мнемоничность имен.

• Разделение операторов.

• Использование фигурных скобок.

• И т.д.

3) Рекомендации от компании Sun Microsystems: https://java.sun.com/docs/codeconv/

 

Передача параметров

Метод класса может получать до 255 параметров. Фактический параметр считается локальной переменной метода.

 

class Dragon {

public void eat(Object obj){} public void fly(String direction){}

}

Dragon d = new Dragon();

d.eat(new Girl());

d.fly(Direction.WEST);

 

Поле this

Каждый объект имеет ссылку на самого себя, которая может использоваться для формирования ссылки на перегруженный конструктор и на поля объекта.

 

class Dragon {
private int weight;
public Dragon(int weight){

this. weight = weight;

}

}

 

Поле super

Каждый объект имеет ссылку на объект-предок, которая позволяет организовать восходящие вызовы конструкторов.

class Dragon extends Reptile{ int flyingSpeed;

public void attack(Object obj){ //обращениек предку за выполнением

//базовых действий super.attack(obj);

burn(obj); //метод класса Dragon

}

// Dragon умеет атаковать, как Reptile,

// а заодно сжигать жертву

public void burn(Object obj){ //сжечь объект

}

}

Порядок инициализации

Инициализация членов класса и выполнение статического инициализатора происходит в порядке их описания в классе.

 

class Dragon {

static int dragonCount = 10; static {

//ошибка - переменная dragonEnemy еще не проинициализирована

System.out.println(dragonEnemy);

//ОК - переменная dragonCount уже проинициализирована

System.out.println(dragonCount);

}

static String dragonEnemy = “Phoenix”; }

 

Константы

Константа - это именованное значение, неизменяемое средствами языка Java.

 

class Dragon {

final static int headCount = 1;

}

Dragon.headCount = 3;//ошибка – попытка присвоить значение константе. Дракон

– не Змей Горыныч! class Gorinich {

//MutableFloat – это класс-хранилище дробного числа и позволяющий изменять его

final static MutableFloat headCount = new MutableFloat(1); }

Gorinich.headVount.setValue(3);//ОК, т.к. значение указателя не меняется, меняется только содержимое

 

Абстрактный класс

Класс является абстрактным, если имеет модификатор abstract.

Класс должен быть помечен этим модификатором, если у него хоть один абстрактный метод (помечен словом abstract и не имеет реализации).

 

abstract class FlyingThing { protected String name; abstract public void fly(); public String getName(){ return name;

}

}

//ошибка,абстрактный класс не может иметь реализаций

FlyingThing aThing = new FlyingThing();

 

Наследование от абстрактного класса

Как правило, абстрактный класс служит для создания базы дерева наследования классов.

 

class Dragon extends FlyingSomething{ public fly(){

//реализуем полет куда-нибудь flySomewhere();

}

}

//ОК – создавать экземпляры можно

Dragon d = new Dragon();

//ОК – создание ссылки на абстрактный класс и инициализация конкретным классом

FlyingSomething fs = new Dragon();

 

Реализация интерфейса

Интерфейс – это сущность, предназначен для формирования структуры реализующего его класса или для наследования другим интерфейсом.

 

public interface Flying{

// класс, реализующий данный интерфейс, // должен предоставить

// реализацию для этого метода int speed();

}

 

Класс может реализовывать множество интерфейсов. Реализующий класс должен реализовать все методы интерфейса. Интерфейсы могу наследоваться друг от друга.

Реализация позволяет снабдить класс дополнительными свойствами.

 

public class Dragon implements Flying { protected int speed; public int speed(){ return speed;

} }

public class RedDragon extends Dragon{ public int speed(){ return 2*speed;

}

public long distance(){…} public long burn(Object obj){…} }

 

Введение в ООП

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

Инкапсуляция (сокрытие данных) - объединение в одной сущности данных и методов работы с ними.

• Состояние объекта определяется значениями его полей.

• Сокрытие данных осуществляется с помощью установки модификаторов, влияющих на видимость членов класса.

• В языке Java используется несколько уровней сокрытия.

 

Наследование

Наследование – возможность класса-наследника приобретать признаки класса-предка.

 

abstract class Animal { abstract void talk();

}

class Frog extends Animal { void jump() { //прыгать}

}

class Bird extends Animal { void fly() {//летать }

}

Класс не может приобретать свойства нескольких других классов через механизм наследования:

 

//ошибка, разрешено наследоваться только от одного класса. class FlyingFrog extends Frog, Bird{…}

 

Полиморфизм

Полиморфизм – способность наследников по-другому реализовывать возможности предков. Объект способен проявлять признаки своего предка.

 

Экземпляр класса может выступать как экземпляр любого класса-предка данного класса.

 

class Animal { void talk(){…};

}

class Dog extends Animal {

void talk() { System.out.println("Woof!"); }

}

class Cat extends Animal {

void talk() { System.out.println("Meow!"); } }

 

Экземпляр класса Dog или Cat одновременно является экземпляром класса Animal:

Animal myDog = new Dog();

Animal myCat = new Cat();

 

 

Примеры

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-08-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: