Основы языка
Программа 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();
Примеры