Знаймо

Додати знання

приховати рекламу

Цей текст може містити помилки.

Java


Java logo.png

План:


Введення

Не слід плутати з JavaScript.

Java - об'єктно-орієнтована мова програмування, розроблений компанією Sun Microsystems (в подальшому, придбаної компанією Oracle). Програми Java зазвичай компілюються в спеціальний байт-код, тому вони можуть працювати на будь- віртуальної Java-машині (JVM) незалежно від комп'ютерної архітектури. Дата офіційного випуску - 23 травня 1995.


1. Вимова, застосування назви

Правильна форма вимови [11] - запозичена англомовна / Dʒɑ ː və / ("Джава" з наголосом на першому складі) [12] [13] [14]. Традиційно-національна "ява", відповідна традиційному вимову назви острова Ява не визнана правовласниками торгової марки Java правильною. Компанія Sun (нині Oracle) дотримується англомовного вимови у всіх країнах світу [15]. Іноді в побуті використовують також жаргонне слово "Жаба" (наприклад, зображення жаби є на календариках групи російських користувачів Java (Java Users Group) [16].

Java - так називають не тільки сама мова, а й платформу для створення та виконання програм на основі цієї мови.

Спочатку мова називалася Oak ("дуб") і розроблявся Джеймсом Гослінгом для програмування побутових електронних пристроїв. Згодом він був перейменований в Java і став використовуватися для написання клієнтських додатків і серверного програмного забезпечення. Названий на честь марки кави Java, коханого деякими програмістами, тому на офіційній емблемі мови зображена чашка з паруючим кави. Існує й інша версія походження назви Java, а саме, Java це сленгове позначення кави (по імені однойменного острова, де проводиться популярний сорт кави) з алюзією на каву-машину, як приклад побутового пристрою, для програмування якого спочатку мова створювався.


2. Основні особливості мови

Програми на Java транслюються в байт-код, що виконується віртуальною машиною Java (JVM) - програмою, обробній байтовий код і передавальної інструкції обладнанню як Лари.

Гідність подібного способу виконання програм - в повній незалежності байт-коду від операційної системи і обладнання, що дозволяє виконувати Java-додатки на будь-якому пристрої, для якого існує відповідна віртуальна машина. Іншою важливою особливістю технології Java є гнучка система безпеки завдяки тому, що виконання програми повністю контролюється віртуальною машиною. Будь-які операції, які перевищують встановлені повноваження програми (наприклад, спроба несанкціонованого доступу до даних або з'єднання з іншим комп'ютером) викликають негайне переривання.

Часто до недоліків концепції віртуальної машини відносять те, що виконання байт-коду віртуальною машиною може знижувати продуктивність програм і алгоритмів, реалізованих на мові Java. Останнім часом було внесено ряд удосконалень, які кілька збільшили швидкість виконання програм на Java:

  • застосування технології трансляції байт-коду в машинний код безпосередньо під час роботи програми ( JIT -технологія) з можливістю збереження версій класу в машинному коді,
  • широке використання платформенно-орієнтованого коду (native-код) в стандартних бібліотеках,
  • апаратні засоби, що забезпечують прискорену обробку байт-коду (наприклад, технологія Jazelle, підтримувана деякими процесорами фірми ARM).

За даними сайту shootout.alioth.debian.org, для семи різних завдань час виконання на Java складає в середньому в півтора-два рази більше, ніж для C / C + +, в деяких випадках Java швидше, а в окремих випадках в 7 разів повільніше. [17] З іншого боку, для більшості з них споживання пам'яті Java-машиною було в 10-30 разів більше, ніж програмою на C / C + +. Також примітно дослідження, проведене компанією Google, згідно з яким зазначається істотно нижча продуктивність і більше споживання пам'яті в тестових прикладах на Java в порівнянні з аналогічними програмами на C + + [18] [19] [20].

Ідеї, закладені в концепцію і різні реалізації середовища віртуальної машини Java, надихнули безліч ентузіастів на розширення переліку мов, які могли б бути використані для створення програм, виконуваних на віртуальній машині. [21] Ці ідеї знайшли також вираз у специфікації загальномовної інфраструктури CLI, закладеної в основу платформи . NET компанією Microsoft.


3. Історія версій

3.1. Java 1.0

Розробка Java почалася в 1990 році, перша офіційна версія - Java 1.0, - була випущена тільки в 1996 році.

3.2. Java 1.2

До 1998 була розроблена оновлена ​​специфікація JDK 1.2, що вийшла під найменуванням Java 2. Мова практично не змінився - було додано одне ключове слово strictfp. Платформа одержала такі доповнення:

  • Бібліотека Swing для створення графічного інтерфейсу користувача.
  • Колекції (JSR 166).
  • Підтримка файлів Policy і цифрових сертифікатів користувача.
  • Бібліотека Accessibility.
  • Java 2D.
  • Підтримка технології drag-and-drop.
  • Повна підтримка Unicode, включаючи підтримку введення японською, китайською та корейською мовами.
  • Підтримка відтворення аудіофайлів декількох популярних форматів.
  • Повна підтримка технології CORBA.
  • JIT-компілятор, покращена продуктивність.
  • Удосконалення інструментальних засобів JDK, в тому числі підтримка профілювання Java-програм

3.3. Java 5.0

Специфікація Java 5.0 була випущена у вересні 2004 року. C цією версією змінена офіційна індексація, замість Java 1.5 правильніше називати Java 5.0. Внутрішня ж індексація Sun залишилася колишньою - 1.x. Мінорні зміни тепер включаються без зміни індексації, для цього використовується слово "Update" або літера "u", наприклад Java Development Kit 5.0 Update 22. Передбачається, що в оновлення можуть входити як виправлення помилок так і невеликі додати до API, JVM.

У даній версії розробники внесли в мову цілий ряд принципових додатків:

  • Перечіслімий типи ( англ. enum ). Раніше були відсутні в Java типи оформлені за аналогією з C + +, але при цьому мають ряд додаткових можливостей.
    • Перечіслімий тип є повноцінним класом Java, тобто може мати конструктор, поля, методи, у тому числі приховані і абстрактні.
    • Перерахування може реалізовувати інтерфейси.
    • Для перерахувань є вбудовані методи, що дають можливість одержання значень типу по імені, символьних значень, що відповідають іменам, перетворення між номером і значенням, перевірки типу на те, що він є Перечіслімий.
  • Анотації - можливість додавання в текст програми метаданих, які не впливають на виконання коду, але допускають використання для отримання різних відомостей про код і його виконанні. Одночасно випущений інструментарій для використання анотованого коду. Одне із застосувань анотацій - спрощення створення тестових модулів для Java-коду.
  • Засоби узагальненого програмування ( англ. generics ) - Механізм, аналогічний Eiffel (пізніше також з'явилися і в C #, принципово відрізняються від шаблонів C + +), що дає можливість створювати класи та методи з полями і параметрами довільного об'єктного типу. З використанням даного механізму реалізовані нові версії колекцій стандартної бібліотеки Java.
  • Методи з невизначеним числом параметрів.
  • Autoboxing / Unboxing - автоматичне перетворення між скалярними типами Java та відповідними типами-врапперов (наприклад, між int - Integer). Наявність такої можливості скорочує код, оскільки виключає необхідність виконання явних перетворень типів в очевидних випадках.
  • Дозволено імпорт статичних полів і методів.
  • У мову введено цикл по колекції об'єктів (ітератор, англ. foreach ).
  • Було введено використання Javadoc -коментарів, які використовуються для автоматичного оформлення документації з коментарів у вихідному коді.

3.4. Java 6

Реліз версії відбувся 11 грудня 2006 року. Змінено офіційна індексація - замість очікуваної 6.0 версія значиться як 6. Мінорні зміни як і в Java 5.0 вносяться в звичайні оновлення версії, наприклад Java SE Development Kit 6 Update 27.


3.5. Java 7

Реліз версії відбувся 28 липня 2011 [22]. У фінальну версію Java SE 7 не були включені всі раніше заплановані зміни. Згідно з планом розвитку (план "Б") [23], включення нововведень буде розбито на дві частини: Java SE 7 (без Лямбда, проекту Jigsaw, і частини поліпшень Coin) і Java SE 8 (все інше), намічений на кінець 2012 року.

У новій версії, що отримала назву Java SE 7 (Java Platform, Standard Edition 7), крім виправлення великої кількості помилок були представлено кілька нововведень. Так, наприклад, в якості еталонної реалізації Java SE 7 використаний не пропрієтарний пакет JDK, а його відкрита реалізація OpenJDK, а сам реліз нової версії платформи готувався за тісної співпраці інженерів Oracle з учасниками світової екосистеми Java, комітетом JCP (Java Community Process) і співтовариством OpenJDK. Всі поставляються Oracle бінарні файли еталонної реалізації Java SE 7 зібрані на основі кодової бази OpenJDK, сама еталонна реалізація повністю відкрита під ліцензією GPLv2 з винятками GNU Classpath, вирішуючими динамічне зв'язування з пропрієтарними продуктами. До інших нововведень належить інтеграція набору невеликих мовних поліпшень Java, що розвиваються в рамках проекту Coin, додана підтримка мов програмування з динамічною типізацією, таких як Ruby, Python і JavaScript, підтримка завантаження класів по URL, оновлений XML -стек, що включає JAXP 1.4, JAXB 2.2a і JAX-WS 2.2 та інші [24].

За 5 днів до виходу релізу Java SE 7 було виявлено кілька серйозних помилок в гарячій оптимізації циклів, яка включена за замовчуванням і призводить віртуальну машину Java до краху. Фахівці Oracle знайдені помилки за такий короткий термін виправити не могли, але пообіцяли, що вони будуть виправлені в другому оновленні (Java 7 Update 2) і частково у першому [25].


Список нововведень:

  • Підтримка динамічно-типізованих мов (InvokeDynamic) - розширення JVM (семантики байт-коду), мови Java для підтримки динамічно-типізованих мов.
  • Сувора перевірка class-файлів - class-файли версії 51 (SE 7) або більш пізньої версії мають бути перевірені typechecking верифікатором; JVM не повинна переключатися на старий верифікатор.
  • Зміна синтаксису мови Java (Project Coin) - часткові зміни в мові Java, призначені для спрощення загальних завдань програмування:
    • Використання класу String в блоці switch.
    • Закриття використовуваних ресурсів у блоці try (try-with-resources) - працює при використанні інтерфейсу AutoCloseable.
    • Об'єднана обробка виключень в блоці catch (multi-catch exceptions) - перерахування оброблюваних винятків в catch (... | ... | ...).
    • Повторне викидання винятків (rethrowing exceptions) - передача виниклого виключення "вгору" по стеку викликів.
    • Підкреслення в числових літералах для кращого сприйняття великих чисел.
    • Зміна виводу типу в Java generic при створенні об'єкта.
    • Використання двійкових чисел (binary literals) - префікс "0b" вкаже, що використовується двійкове число.
    • Спрощення виклику методів varargs - зменшення попереджень при виклику методу зі змінним числом вхідних змінних.
  • Модифікація завантажувача класів (class-loader) - уникнути тупикових ситуацій в неієрархічні топології завантаження класів.
  • Закриття ресурсів, відкритих URLClassLoader.
  • Оновлення колекцій (JSR 166y).
  • Підтримка Unicode 6.0.
  • Відділення мови користувача і мови інтерфейсу - оновлення обробки мов для відділення локалі від мови інтерфейсу користувача.
  • Нові інтерфейси I / O для платформи Java (nio.2).
  • Використання JDBC 4.1 і Rowset 1.1.
  • (Не закінчено) ...

4. Класифікація платформ Java

Усередині Java існують кілька основних сімейств технологій:

  • Java SE - Java Standard Edition, основне видання Java, містить компілятори, API, Java Runtime Environment; підходить для створення користувацьких додатків, в першу чергу - для настільних систем.
  • Java EE - Java Enterprise Edition, являє собою набір специфікацій для створення програмного забезпечення рівня підприємства.
  • Java ME - Java Micro Edition, створена для використання в пристроях, обмежених з обчислювальної потужності, наприклад в мобільних телефонах, КПК, вбудованих системах;
  • JavaFX - технологія, що є наступним кроком в еволюції Java як Rich Client Platform; призначена для створення графічних інтерфейсів корпоративних програм і бізнесу.
  • Java Card - технологія надає безпечне середовище для додатків, що працюють на смарт-картах та інших пристроях з дуже обмеженим обсягом пам'яті і можливостями обробки.

5. Java і Microsoft

Компанією Microsoft була розроблена власна реалізація JVM (MSJVM [26]), яку було включено до складу різних операційних систем, починаючи з Windows 98 (також входила в Internet Explorer від версії 3 і вище, що дозволяло використовувати MSJVM в ОС Windows 95 і Windows NT 4 після установки IE3 + на дані ОС).

MSJVM мала cущественние відмінності від Sun Java, багато в чому ламають основоположну концепцію переносимості програм між різними платформами:

Тісна інтеграція Java з DCOM і Win32 ламала багатоплатформенна суть мови. Згодом це стало приводом для судових позовів з боку Sun Microsystems до Microsoft. Суд став на бік компанії Sun Microsystems. В кінцевому рахунку між двома компаніями була досягнута домовленість про можливість продовження терміну офіційної підтримки користувачів нестандартної Microsoft JVM до кінця 2007 року, але не більше. [26]

У 2005 році компанією Microsoft для платформи . NET був представлений Java-подібна мова J #, що не відповідає офіційній специфікації мови Java і виключений згодом зі стандартного інструментарію розробника Microsoft Visual Studio, починаючи з Visual Studio 2008 [27].


6. Застосування платформи Java

Наступні успішні проекти реалізовані з залученням Java ( J2EE) технологій: RuneScape, Amazon [28] [29], eBay [30] [31], Yandex (неоднозначна інформація щодо Java) [32] [33], LinkedIn [34], Yahoo! [35].

Наступні компанії в основному фокусуються на Java ( J2EE) технологіях: SAP, IBM, Oracle. Зокрема, СУБД Oracle включає JVM як свою складову частину, що забезпечує можливість безпосереднього програмування СУБД на мові Java, включаючи, наприклад, збережені процедури. [36]


6.1. Продуктивність

Програми, написані на Java, мають репутацію більш повільних і займають більше оперативної пам'яті, ніж написані на мові Сі . Тим не менш, швидкість виконання програм, написаних на мові Java, була істотно поліпшена з випуском в 1997-1998 роках так званого JIT-компілятора у версії 1.1 на додаток до інших особливостей мови для підтримки кращого аналізу коду (такі як внутрішні класи, клас StringBuffer , спрощені логічні обчислення і т. д.). Крім того була проведена оптимізація віртуальної машини Java - з 2000 року для цього використовується віртуальна машина HotSpot. В даний час [ уточнити ], код Java 2.0 приблизно лише в 2 рази повільніше коду, написаного на мові програмування С [джерело не вказано 80 днів]

Деякі платформи пропонують апаратну підтримку виконання для Java [джерело не вказано 80 днів]. Приміром, мікроконтролери виконують код Java на апаратному забезпеченні замість програмної JVM, а також засновані на ARM процесори, які підтримують виконання байткода Java через опцію Jazelle.


7. Основні можливості

  • автоматичне керування пам'яттю;
  • розширені можливості обробки виняткових ситуацій;
  • багатий набір засобів фільтрації вводу / виводу;
  • набір стандартних колекцій, таких як масив, список, стек і т. п.;
  • наявність простих засобів створення мережевих додатків (у тому числі з використанням протоколу RMI);
  • наявність класів, що дозволяють виконувати HTTP -запити і обробляти відповіді;
  • вбудовані в мову засоби створення багатопотокових додатків;
  • уніфікований доступ до баз даних :
  • на рівні окремих SQL -запитів - на основі JDBC, SQLJ;
  • на рівні концепції об'єктів, що мають здатність до зберігання в базі даних - на основі Java Data Objects (англ.) і Java Persistence API (англ.);
  • підтримка шаблонів (починаючи з версії 1.5);
  • паралельне виконання програм.

8. Простір імен

Ідея просторів імен втілена в Java-пакетах.

9. Приклад програми

Програма, що виводить " Hello, world! ":

 public  class  HelloWorld  {  public  static  void  main  (  String  [  ]  args  )  {  System  .  out  .  println  (  "Hello, world!"  )  ;  }  } 

Приклад використання generics :

 import  java.util .*  ;  public  class  Sample  {  public  static  void  main  (  String  [  ]  args  )  {  / / Створення об'єкта по шаблону.  List  <  String  >  strings  =  new  LinkedList  <  String  >  (  )  ;  strings.  add  (  "Hello"  )  ;  strings.  add  (  "World"  )  ;  strings.  add  (  "!"  )  ;  for  (  String  s  :  strings  )  {  System  .  out  .  print  (  s  )  ;  System  .  out  .  print  (  ""  )  ;  }  }  } 

Приклад використання reflection :

 import  java.lang.reflect.Field  ;  import  java.lang.reflect.Method  ;  class  TestClass  {  private  int  value  ;  public  int  getValue  (  )  {  return  value  ;  }  public  void  setValue  (  int  value  )  {  this  .  value  =  value  ;  }  }  public  class  Main  {  public  static  void  main  (  String  [  ]  args  )  {  TestClass testClass  =  new  TestClass  (  )  ;  for  (  Field  field  :  testClass.  getClass  (  )  .  getDeclaredFields  (  )  )  {  System  .  out  .  printf  (  "Name:% s, type:% s  \ N  "  , Field.  getName  (  )  , Field.  getType  (  )  .  getCanonicalName  (  )  )  ;  }  for  (  Method  method  :  testClass.  getClass  (  )  .  getDeclaredMethods  (  )  )  {  System  .  out  .  printf  (  "Name:% s, return type:% s  \ N  "  , Method.  getName  (  )  , Method.  getReturnType  (  )  .  getCanonicalName  (  )  )  ;  }  }  } 

Приклад використання анотацій:

 import  java.lang.annotation.ElementType  ;  import  java.lang.annotation.Retention  ;  import  java.lang.annotation.RetentionPolicy  ;  import  java.lang.annotation.Target  ;  @ Retention  (  RetentionPolicy.  RUNTIME  )  @ Target  (  ElementType.  TYPE  )  public  @  interface  Annotation  {  public  boolean  value  (  )  default  false  ;  }  @  Annotation  (  value  =  true  )  public  class  TestClass  {  }  public  class  Main  {  public  static  void  main  (  String  [  ]  args  )  {  TestClass testClass  =  new  TestClass  (  )  ;  Annotation  annotation  =  testClass.  getClass  (  )  .  getAnnotation  (  Annotation  .  class  )  ;  if  (  annotation  ! =  null  )  {  System  .  out  .  printf  (  "Value:% s  \ N  "  , Annotation.  value  (  )  )  ;  }  }  } 

10. Основні ідеї

10.1. Примітивні типи

У мові Java тільки 8 примітивних (скалярних, простих) типів : boolean, byte, char, short, int, long, float, double. Існує також допоміжний дев'ятий примітивний тип - void, проте змінні і поля такого типу не можуть бути оголошені в коді, а сам тип використовується тільки для опису відповідного йому класу, для використання при рефлексії.

Довжини і діапазони значень примітивних типів визначаються стандартом, а не реалізацією і наведені в таблиці. Тип char зробили багатобайтових для зручності локалізації (один з ідеологічних принципів Java): коли складався стандарт, вже існував Unicode -16, але не Unicode-32. Оскільки в результаті не залишилося однобайтове типу, додали новий тип byte, причому в Java, на відміну від інших мов, він не є беззнакові. Типи float і double можуть мати спеціальні значення + \ Infty , - \ Infty і "не число" ( NaN). Для типу double вони позначаються Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN; для типу float - так само, але з приставкою Float замість Double. Мінімальні позитивні значення, що приймаються типами float і double, теж стандартизовані.

Тип Довжина (у байтах) Діапазон або набір значень
boolean 1 в масивах, 4 в змінних [37] true, false
byte 1 -128 .. 127
char 2 0 .. 16 лютого -1, або 0 .. 65535
short 2 -2 15.. 15 лютого -1, або -32768 .. 32767
int 4 -2 31.. 31 лютого -1, або -2147483648 .. 2147483647
long 8 -2 63.. 2 63 -1, або приблизно -9.2 10 18.. 9.2 18 жовтня
float 4 - (2-2 -23) 2 127.. (2-2 -23) 2 127, або приблизно -3.4 10 38.. 3.4 10 38, а також - \ Infty , \ Infty , NaN
double 8 - (2-2 -52) лютого 1023.. (2-2 -52) 2 1023, або приблизно -1.8 10308.. 1.8 10 308, а також - \ Infty , \ Infty , NaN

Така жорстка стандартизація була необхідна, щоб зробити мову переносних незалежним, що є одним з ідеологічних вимог до Java. Проте одна невелика проблема з платформної незалежністю все ж залишилася. Деякі процесори використовують для проміжного зберігання результатів 10-байтові регістри або іншими способами покращують точність обчислень. Для того, щоб зробити Java максимально сумісної між різними системами, в ранніх версіях будь-які способи підвищення точності обчислень були заборонені. Однак це призводило до зниження швидкодії. З'ясувалося, що погіршення точності заради платформної незалежності мало кому треба, тим більше якщо за це доводиться платити уповільненням роботи програм. Після численних протестів цю заборону скасували, але додали ключове слово strictfp, що забороняє підвищення точності.


10.1.1. Перетворення при математичних операціях

У мові Java діють наступні правила:

  1. Якщо один операнд має тип double, інший теж перетвориться до типу double.
  2. Інакше, якщо один операнд має тип float, інший теж перетвориться до типу float.
  3. Інакше, якщо один операнд має тип long, інший теж перетвориться до типу long.
  4. Інакше обидва операнда перетворюються до типу int.

Даний спосіб неявного перетворення вбудованих типів повністю збігається з перетворенням типів в C + +. [38]


10.2. Об'єктні змінні, об'єкти, посилання і покажчики

У мові Java є тільки динамічно створювані об'єкти. Причому змінні об'єктного типу і об'єкти в Java - абсолютно різні сутності. Змінні об'єктного типу є посиланнями, тобто неявними покажчиками на динамічно створювані об'єкти. Це підкреслюється синтаксисом опису змінних. Так, в Java не можна писати:

 double  a  [  10  ]  [  20  ]  ;  Foo b  (  30  )  ; 

а потрібно:

 double  [  ]  [  ]  a  =  new  double  [  10  ]  [  20  ]  ;  Foo b  =  new  Foo  (  30  )  ; 

При привласнення, передачі в підпрограми і порівняннях об'єктні змінні поводяться як вказівники, тобто присвоюються, копіюються і порівнюються адреси об'єктів. А при доступі за допомогою об'єктної змінної до полів даних або методам об'єкта не потрібно ніяких спеціальних операцій разименовиванія - цей доступ здійснюється так, як якщо б об'єктна змінна була самим об'єктом.

Об'єктними є змінні будь-якого типу, крім примітивного. Явних покажчиків в Java немає. На відміну від покажчиків C, C + + та інших мов програмування, посилання в Java у високому ступені безпечні завдяки жорстким обмеженням на їх використання, зокрема:

  • Не можна перетворювати об'єкт типу int або будь-якого іншого примітивного типу в покажчик або посилання і навпаки.
  • Над посиланнями заборонено виконувати операції + +, -, +, - або будь-які інші арифметичні операції.
  • Перетворення типів між посиланнями жорстко регламентовано. За винятком посилань на масиви, дозволено перетворювати посилання тільки між спадкоємною типом і його спадкоємцем, причому перетворення успадкованого типу в наследующий має бути явно задано і під час виконання проводиться перевірка його свідомості. Перетворення посилань на масиви дозволені лише тоді, коли дозволені перетворення їх базових типів, а також немає конфліктів розмірності.
  • У Java немає операцій взяття адреси (&) або взяття об'єкта за адресою (*). Зірочка в Java означає множення, і тільки. Амперсанд (&) означає всього лише "побітове і" (подвійний амперсанд - "логічне і").

Завдяки таким спеціально введеним обмеженням в Java неможливо пряме маніпулювання пам'яттю на рівні фізичних адрес (хоча посилання, не вказують ні на що, є: значення такого посилання позначається null).

Якщо потрібен покажчик на примітивний тип, використовуються класи-обгортки примітивних типів: Boolean, Byte, Character, Short, Integer, Long, Float, Double.


10.2.1. Дублювання посилань і клонування

Через те, що об'єктні змінні є посилальними, при присвоєнні не відбувається копіювання об'єкта. Так, якщо написати

 Foo foo, bar  ;  ... Bar  =  foo  ; 

то відбудеться копіювання адреси з змінної foo в змінну bar. Тобто foo і bar будуть вказувати на одну й ту саму область пам'яті, тобто на один і той самий об'єкт; спроба змінити поля об'єкта, на який посилається мінлива foo, буде змінювати об'єкт, з яким пов'язана мінлива bar, і навпаки. Якщо ж необхідно отримати саме ще одну копію вихідного об'єкта, користуються або методом (функцією-членом, в термінології C + +) clone(), що створює копію об'єкта, або (рідше) копіюють конструктором (конструктори в Java не можуть бути віртуальними, тому примірник класу-нащадка буде неправильно скопійований конструктором класу-предка; метод клонування викликає потрібний конструктор і тим самим дозволяє обійти це обмеження).

Метод clone() вимагає, щоб клас реалізовував інтерфейс Cloneable (про інтерфейси див. нижче). Якщо клас реалізує інтерфейс Cloneable, за замовчуванням clone() копіює всі поля (дрібна копія). Якщо потрібно не копіювати, а клонувати поля (а також їх поля і так далі), треба перевизначати метод clone(). Визначення і використання методу clone() часто є нетривіальним завданням. [39]


10.2.2. Прибирання сміття

У мові Java неможливо явне видалення об'єкта з пам'яті - замість цього реалізована збірка сміття. Традиційним [джерело не вказано 769 днів] прийомом, що дає збирачеві сміття "натяк" на звільнення пам'яті, є присвоювання змінній порожнього значення null. Це, однак, не означає, що об'єкт, замінений значенням null, буде неодмінно і негайно видалений. Даний прийом всього лише усуває посилання на об'єкт, тобто відв'язує покажчик від об'єкта в пам'яті. При цьому слід враховувати, що об'єкт не буде видалений складальником сміття, поки на нього вказує хоча б одне посилання з використовуваних змінних або об'єктів. Існують також методи для ініціації примусової збірки сміття, але не гарантується, що вони будуть викликані виконуючою середовищем, і їх не рекомендується використовувати для звичайної роботи.


10.3. Класи і функції

Java не є процедурним мовою: будь-яка функція може існувати тільки усередині класу. Це підкреслює термінологія мови Java, де немає понять "функція" або "функція-член" ( англ. member function ), А тільки метод. В методи перетворилися і стандартні функції. Наприклад, в Java немає функції sin(), а є метод Math.sin() класу Math (містить, крім sin(), методи cos(), exp(), sqrt(), abs() і багато інших). Конструктори в Java не вважаються методами. Деструкторів в Java не існує, а метод finalize () ні в якому разі не можна вважати аналогом деструктора.


10.3.1. Статичні методи і поля

У Java (як і в C + +) використовуються статичні методи ( англ. static method - В теорії програмування їх також називають методами класу), які задаються за допомогою ключового слова static. Статичні поля (змінні класу) мають таке ж значення, що і в C + +: кожне таке поле є власністю класу, тому для доступу до статичних полів не потрібно створювати екземпляри відповідного класу.

Наприклад, математичні функції, реалізовані в класі Math, є якраз статичні методи даного класу. Тому можна писати

 double  x  =  Math  .  sin  (  1  )  ; 

замість

 Math  m  =  new  Math  (  )  ;  double  x  =  m.  sin  (  1  )  ; 

Оскільки статичні методи існують незалежно від об'єктів (екземплярів класу), вони не мають доступу до звичайних (нестатичні) полів і методів даного класу. Зокрема, при реалізації статичного методу неприпустимо використовувати ідентифікатор this.


10.3.2. Завершеність (final)

Ключове слово final (фінальний) означає різні речі при описі змінної, методи чи класу. Фінальне поле класу ініціалізується при описі, або в конструкторі класу (а статичне поле - в статичному блоці ініціалізації) і далі його значення не може бути змінено. Значення локальних змінних, а також параметрів методу, помічених ключовим словом final, не можуть бути змінені після присвоєння. Але при цьому, їх значення можуть використовуватися всередині анонімних класів. Якщо статичне поле класу, чи змінна проініціалізірованни константним виразом, вони розглядаються компілятором, як іменована константа; в такому разі їх значення може бути використано в операторах switch (для констант типу int), а також для умовної компіляції (для констант типу boolean) при використанні з оператором if.

Метод класу, відзначений словом final, не може бути перевизначений при спадкуванні. Фінальний клас не може мати спадкоємців взагалі.


10.3.3. Абстрактність

У Java методи, не оголошені явно як static, final або private, є віртуальними в термінології C + +: при виклику методу, по-різному визначеного в базовому і успадковує класах, завжди проводиться перевірка часу виконання.

Абстрактним методом (модифікатор abstract) в Java називається метод, для якого задані параметри і тип значення, але не тіло. Абстрактний метод визначається в класах-спадкоємців. У C + + те ж саме називається чисто віртуальної функцією. Для того щоб у класі можна було описувати абстрактні методи, сам клас теж повинен бути описаний як абстрактний. Об'єкти абстрактного класу створювати не можна.


10.3.4. Інтерфейси

Вищим ступенем абстрактності в Java є інтерфейс ( interface). Всі методи інтерфейсу абстрактні: описувач abstract навіть не потрібно. Інтерфейс в Java не вважається класом, хоча по суті є повністю абстрактним класом. Клас може успадковувати / розширювати ( extends) інший клас або реалізовувати ( implements) інтерфейс. Крім того, інтерфейс може успадковувати / розширювати інший інтерфейс.

У Java клас не може успадковувати більше одного класу, зате може реалізовувати скільки завгодно інтерфейсів. Множинне успадкування інтерфейсів не заборонено, то є один інтерфейс може успадковуватися від декількох.

Інтерфейси можна передавати методам як параметри, але не можна створювати об'єкти їх типів.


10.3.4.1. Маркерні інтерфейси

В Java є деякі інтерфейси, які не містять методів для реалізації, а спеціальним чином обробляються JVM. Це інтерфейси:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.rmi.Remote

10.3.5. Шаблони в Java (generics)

Починаючи з версії Java 5 в мові з'явився механізм узагальненого програмування - шаблони, зовні близькі до шаблонів C + +. За допомогою спеціального синтаксису в описі класів і методів можна вказати параметри-типи, які всередині описи можуть використовуватися в якості типів полів, параметрів і значень, що повертаються методів.

 / / Оголошення узагальненого класу  class  GenericClass  <  E  >  {  E getFirst  (  )  {  ...  }  void  add  (  E obj  )  {  ...  }  }  / / Використання узагальненого класу в коді  GenericClass  <  String  >  var  =  new  GenericClass  <  String  >  (  )  ;  var.  add  (  "Qwerty"  )  ;  String  p  =  var.  getFirst  (  )  ; 

Допускається узагальнене оголошення класів, інтерфейсів і методів. Крім того, синтаксис підтримує обмежені оголошення типів-параметрів: вказівка ​​в оголошенні конструкції виду вимагає, щоб тип-параметр T реалізовував інтерфейси A, B, C і так далі, а конструкція вимагає, щоб тип-параметр T був типом C або одним з його предків.

На відміну від шаблонів C #, шаблони Java не підтримуються середовищем виконання - компілятор просто створює байт-код, в якому ніяких шаблонів вже немає. Реалізація шаблонів в Java принципово відрізняється від реалізації подібних домовленостей у C + +: компілятор не породжує для кожного випадку використання шаблону окремий варіант класу або методу-шаблону, а просто створює одну реалізацію байт-коду, що містить необхідні перевірки і перетворення типів. Це призводить до ряду обмежень використання шаблонів у програмах на Java.


10.3.6. Перевірка приналежності до класу

У Java можна явно перевірити, до якого класу належить об'єкт. Вираз foo instanceof Foo істинно, якщо об'єкт foo належить класу Foo або його спадкоємцю, або реалізує інтерфейс Foo (або, в загальному вигляді, успадковує клас, який реалізує інтерфейс, який успадковує Foo).

Далі, функція getClass(), визначена для всіх об'єктів, видає об'єкт типу Class. Для кожного класу створюється не більше одного описує його об'єкта типу Class, тому ці об'єкти можна порівнювати. Так, наприклад, foo.getClass() == bar.getClass() це ​​слово, якщо об'єкти foo і bar належать в точності до одного класу (але це не означає що це два однакових об'єкта).

Крім того, об'єкт типу Class будь-якого типу можна отримати так: Integer.class, Object.class.

Проте пряме порівняння класів не завжди є оптимальним засобом перевірки на приналежність до класу. Найчастіше замість нього використовують функцію isAssignableFrom(). Ця функція визначена в об'єкта типу Class і приймає об'єкт типу Class як параметр. Таким чином, виклик Foo.class.isAssignableFrom(Bar.class) поверне true у випадку, якщо Foo є предком класу Bar. Так як всі об'єкти є нащадками типу Object, виклик Object.class.isAssignableFrom() завжди поверне true.

У парі зі згаданими функціями об'єкта типу Class використовуються також функції isInstance() (еквівалентно instanceof), а також cast() (перетворює параметр в об'єкт обраного класу).


11. Бібліотеки класів

  • JDK - містить набір базових класів для всього ПЗ на платформах Java SE і Java EE
  • CDK - для створення хімічної ПО
  • MARF - модульні бібліотека для розпізнавання аудіо
  • JDOM - реалізація XML DOM, що враховує особливості платформи Java.

12. Засоби розробки ПЗ

  • JDK - крім набору бібліотек для платформ Java SE і Java EE містить компілятор командного рядка javac і набір утиліт, які також працюють в режимі командного рядка.
  • NetBeans IDE - вільна інтегрована середовище розробки для всіх платформ Java - Java ME, Java SE і Java EE. Пропагується Sun Microsystems, розробником Java, як базовий засіб для розробки ПЗ на мові Java та іншими мовами ( C, C + +, PHP, Fortran та ін.)
  • Eclipse IDE - вільна інтегрована середовище розробки для Java SE, Java EE і Java ME [40]. Пропагується IBM, одним з найважливіших розробників корпоративного ПЗ, як базовий засіб для розробки ПЗ на мові Java та іншими мовами ( C, C + +, Ruby, Fortran та ін)
  • IntelliJ IDEA - середовище розробки для платформ Java SE, Java EE і Java ME. Розробник - компанія JetBrains. Розповсюджується в двох версіях: вільної безкоштовною (Community Edition) та комерційної пропрієтарної (Ultimate Edition).
  • JDeveloper - середовище розробки для платформ Java SE, Java EE і Java ME. Розробник - компанія Oracle.
  • BlueJ - Середовище розробки програмного забезпечення на мові Java, створена в основному для використання в навчанні, але також підходить для розробки невеликих програм.

Примітки

  1. Java SE 7 Is Here! - blogs.oracle.com/java/entry/java_se_7_is_here (Англ.) . Oracle Corporation. архіві - www.webcitation.org/6170hdnl6 з першоджерела 22 серпня 2011.
  2. Java Was Strongly Influenced by Objective-C - cs.gmu.edu / ~ sean / stuff / java-objc.html
  3. White Paper. About Microsoft's "Delegates" - java.sun.com / docs / white / delegates.html Офіційний сайт
  4. History of Java in Java Application Servers Report - www.fscript.org / prof / javapassport.pdf TechMetrix Research, 1999
  5. Ідея динамічної кодогенераціі взята з дисертації учня Вірта Мікаеля Франца (PC World Russia CD, September 2005 - www.ict.edu.ru/ft/004790/obe_fate.pdf)
  6. Лекція Н. Вірта в Нижегородському державному університеті ім. Н. І. Лобачевського - www.oberon2005.oberoncore.ru/r260905.html
  7. В Java 5.0 було додано декілька нових особливостей ( foreach, autoboxing, varargs і анотацій), після того, як вони були введені в аналогічний (і конкуруючий) мова C #; см.: http://www.barrycornelius.com/papers/java5/ - www.barrycornelius.com/papers/java5/ http://www.levenez.com/lang/ - www.levenez.com / lang /
  8. Gosling, McGilton. The Java Language Environment - java.sun.com/docs/white/langenv/Intro.doc1.html # 943. Офіційний сайт (травень 1996). Фотогалерея - www.webcitation.org/6170iD8ff з першоджерела 22 серпня 2011.
  9. J. Gosling, B. Joy, G. Steele, G. Brachda. The Java Language Specification, 2nd Edition - java.sun.com / docs / books / jls / second_edition / html / intro.doc.html # 237601. Офіційний сайт. Фотогалерея - www.webcitation.org/6170inw46 з першоджерела 22 серпня 2011.
  10. The AZ of Programming Languages: Modula-3 - az of programming languages ​​- Computerworld - www.computerworld.com.au / index.php / id; 1422447371; pp; 3; fp; 4194304; fpid, 1
  11. Java - slovari.yandex.ru/dict/internet/article/300.htm? text = java & stpar1 = 1.1.2. Яндекс.Словари.
  12. java - www.merriam-webster.com/dictionary/java (Англ.) . Merriam-Webster Online Dictionary. Merriam-Webster. - Англійська норма вимови слова "Java", з додатком аудіофайлів. архіві - www.webcitation.org/6170jFEqS з першоджерела 22 серпня 2011.
  13. java - lingvo.abbyyonline.com / ru / en-ru / java? SelectedWordForm = Java. Комп'ютерний словник ABBYY Lingvo. ABBYY Ligvo. - Переклад назви платформи разом із зазначенням вимови. архіві - www.webcitation.org/6170kEe6g з першоджерела 22 серпня 2011.
  14. java - www.webbmediagroup.com / Russian_TechTerms.pdf. Глосарій технічної термінології для журналістики та комунікацій. WebMedia Group (4 лютого 2009). Фотогалерея - www.webcitation.org/6170lLNZ7 з першоджерела 22 серпня 2011.
  15. Виступ "батька" Java Джеймса Гослінга на міжнародній конференец Sun Tech Days - www.youtube.com/watch?v=Homi34ivi34. Youtube.
  16. Календарики на 2009 рік - www.jug.ru/servlets/index?page=calendar2009. Java Users Group. архіві - www.webcitation.org/6170lnzz1 з першоджерела 22 серпня 2011.
  17. Java 6-server speed C + + GNU g + + speed | Computer Language Benchmarks Game - shootout.alioth.debian.org/u32q/benchmark.php? test = all & lang = java
  18. Metz, Cade Google pits C + + against Java, Scala, and Go - www.theregister.co.uk/2011/06/03/google_paper_on_cplusplus_java_scala_go/ (Англ.) . The Register (3 June 2011). Фотогалерея - www.webcitation.org/6170nFPxZ з першоджерела 22 серпня 2011.
  19. Loop Recognition in C + + / Java / Go / Scala ( PDF, 0.3 МБ)
  20. У Google провели порівняння продуктивності C + +, Java, Go і Scala - www.opennet.ru/opennews/art.shtml?num=30784
  21. Robert Tolksdorf. Programming languages ​​for the Java Virtual Machine JVM - www.is-research.de/info/vmlanguages/ (Англ.) . is-research GmbH. - Онлайн-каталог альтернативних мов і мовних розширень для JVM. архіві - www.webcitation.org/6170nqDc9 з першоджерела 22 серпня 2011.
  22. план розробки для JDK7 - openjdk.java.net/projects/jdk7 /
  23. План Б - mreinhold.org / blog / plan-b
  24. Компанія Oracle анонсувала вихід Java SE 7 - citforum.ru/news/26682 /
  25. Index corruption and crashes in Apache Lucene Core / Apache Solr with Java 7 - (Англ.)
  26. 1 2 Microsoft Java Virtual Machine Support - www.microsoft.com / About / Legal / EN / US / Interoperability / Java / Default.aspx (Англ.) . Microsoft (12 вересня 2003). - Офіційна заява Microsoft про програму підтримки MSJVM. архіві - www.webcitation.org/6170oubDn з першоджерела 22 серпня 2011.
  27. Visual J # - msdn.microsoft.com/ru-ru/library/7xsxf8e2 (VS.90). aspx. Microsoft (листопад 2007). - Офіційна інформація Microsoft про виключення J # з комплекту Visual Studio 2008. Фотогалерея - www.webcitation.org/6170pJXt3 з першоджерела 22 серпня 2011.
  28. Todd Hoff. Amazon Architecture - highscalability.com / amazon-architecture (Англ.) (18 вересня 2007). - Обговорення архітектури Amazon з використанням Java-технологій.
  29. Amazon Elastic Compute Cloud (Amazon EC2) - aws.amazon.com/ec2 / (Англ.) . Amazon Web Services LLC. - Опис технології і можливостей Amazon EC2 як веб-сервісу. архіві - www.webcitation.org/6170rMoFx з першоджерела 22 серпня 2011.
  30. Todd Hoff. eBay Architecture - highscalability.com / ebay-architecture (Англ.) (27 травня 2008). - Обговорення архітектури eBay на платформі Java. архіві - www.webcitation.org/6170rzVA7 з першоджерела 22 серпня 2011.
  31. Randy Shoup, Dan Pritchett. The eBay Architecture - www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf (Англ.) . SD Forum 2006. ??? (29 листопада 2006). - Презентація з історії розвитку архітектури eBay. архіві - www.webcitation.org/6170saktV з першоджерела 22 серпня 2011.
  32. Allen Stern. Exclusive Interview With Yandex CTO Ilya Segalovich - www.centernetworks.com / interview with--yandex-cto-ilya-segalovich (Англ.) . CenterNetworks (14 січня 2008). - Інтерв'ю з технічним директором Яндекса Іллею Сегаловіч. архіві - www.webcitation.org/6170t5us1 з першоджерела 22 серпня 2011.
  33. Анатолій Орлов. Архітектура Яндекс.Поіска - www.jug.ru/servlets/images/meeting_2008_05_24/yandex-search-v4.ppt (PowerPoint). Матеріали зустрічі JUG в Єкатеринбурзі. ??? (24 травня 2008). Фотогалерея - www.webcitation.org/6170u8vS8 з першоджерела 22 серпня 2011.
  34. Brian Guan. The LinkedIn Blog. Blog Archive. Grails at LinkedIn - blog.linkedin.com/2008/06/11/grails-at-linkedin / (Англ.) . LinkedIn.com (11 червня 2008). - Історія створення системи LinkedIn на основі Java-технології Grails. архіві - www.webcitation.org/6170ueU7e з першоджерела 22 серпня 2011.
  35. Hadoop and Distributed Computing at Yahoo! - developer.yahoo.com / hadoop / (Англ.) . Yahoo!. - Стартова сторінка Java-технології розподіленого обслуговування Hadoop на порталі розробників Yahoo!. архіві - www.webcitation.org/6170vguJb з першоджерела 22 серпня 2011.
  36. OracleJVM and Java Stored Procedures - www.oracle.com / technology / tech / java / jsp / index.html (Англ.) . Oracle Inc .. - Розділ порталу Oracle, присвячений технологіям Java в складі сервера СУБД Oracle. архіві - www.webcitation.org/6170wCzk5 з першоджерела 22 серпня 2011.
  37. JVM не має підтримки для змінних типу boolean, тому вони представляються у вигляді значень типу int. Однак масиви boolean [] підтримуються. VM Spec The Structure of the Java Virtual Machine - java.sun.com / docs / books / jvms / second_edition / html / Overview.doc.html # 22909
  38. Бьярн Страуструп. Мова програмування С + + = The C + + Programming Language - М.-СПб.: Біном, Невський діалект, 2008. - 1104 с. - 5000 екз . - ISBN 5-7989-0226-2; ISBN 5-7940-0064-3; ISBN 0-201-70073-5.
  39. Object (Java 2 Platform SE v1.4.2) - java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html # clone () (Англ.) . Sun Microsystems. - Посилання на документацію до методу Object.clone (). Фотогалерея - www.webcitation.org/6170x2NN3 з першоджерела 22 серпня 2011.
  40. Pulsar - Eclipse Mobile Tools Platform - www.eclipse.org/pulsar/ (Англ.) . Eclipse. - Проект eclipse для мобільних розробників. архіві - www.webcitation.org/6170xVuSz з першоджерела 22 серпня 2011.

Література


Цей текст може містити помилки.

Схожі роботи | скачати

Схожі роботи:
Java OpenGL
Java Database Connectivity
Java Runtime Environment
Java Virtual Machine
Open Java Interface
Java Development Kit
Java Platform, Micro Edition
© Усі права захищені
написати до нас
Рейтинг@Mail.ru