Pokročilé programování na platformě JAVA, letní semestr 2016

Transkript

Pokročilé programování na platformě JAVA, letní semestr 2016
Java
Přehled
Java, letní semestr 2016
29.2.2016
Java
●
objektově orientovaný
–
vše (téměř) je objekt
●
●
interpretovaný
–
–
●
výjimka – primitivní typy
zdrojový kód (.java) – překlad do tzv. bytecode
bytecode (.class) – interpretován v tzv. virtual machine
nezávislý na architektuře
–
programy běží ve virtual machine
Java, letní semestr 2016
29.2.2016
Historie
●
●
JDK 1.0 – 1996
JDK 1.1 – 1997
–
●
Java 2 platform – 2000
–
●
JDK 1.2, 1.3 – změny pouze v knihovnách
JDK 1.4 – 2002
–
●
Vnitřní třídy
Assert
JDK 5.0 – 2004
–
změny v jazyce
●
●
●
●
●
JDK 6 – 2006
JDK 7 – 2011
–
●
generické typy (~ šablony)
anotace
...
„malé“ změny v jazyce
JDK 8 – 2014
„velké“ změny v jazyce
Java, letní–semestr 2016
29.2.2016
Java platform
●
●
●
JSE – standard edition
JEE – enterprise edition
JME – micro edition
JEE
Java, letní semestr 2016
29.2.2016
JSE
JME
Java
Card
API
"Výkon"
●
původně (~ JDK 1.1, 1998)
–
●
Java programy 6x pomalejší než C
nyní:
–
Just-In-Time (JIT) compilation
●
●
●
●
●
v rámci spuštění se program přeloží
provádí se nativní kód
pomalý start, pak rychlé
výkon ~ srovnatelný s normálními aplikacemi
velká "spotřeba" paměti
Java, letní semestr 2016
29.2.2016
Implementace Javy
●
Oracle
–
–
●
OpenJDK
–
–
–
–
●
http://openjdk.java.net/
open-source
podporováno Oracle
oficiální implementace vychází z OpenJDK
IcedTea
–
–
–
●
"oficiální" implementace
Windows, Solaris, Linux
http://icedtea.classpath.org/
založeno na OpenJDK
zcela „free“
IBM
–
IBM JDK
Java, letní semestr 2016
29.2.2016
Implementace Javy
●
Jikes RVM
–
–
–
–
Research Virtual Machine
open-source
pro testování různých rozšíření
napsáno v Javě
●
"self-hosting"
–
●
boot-image writer
–
●
Java program, spustí se pod existující JVM
boot-image loader
–
–
nepotřebuje k běhu jinou JVM
program v C++
nepodporuje celé Java API
Java, letní semestr 2016
29.2.2016
Další... (spíše už „historické“)
●
Blackdown (do 1.5)
–
–
●
open-source implementace JVM pro Linux
založená na kódu Sun JVM
Jikes
–
Jikes překladač
●
●
●
●
●
●
●
GNU classpath – implementace základních Java
knihoven
Guavac – překladač
Kaffe – virtual machine
Apache Harmony
–
●
open-source
rychlý
striktní kompatibila s Javou (do 1.5)
...
open source Java SE
Java, letní semestr 2016
29.2.2016
Android
zdroj: http://developer.android.com/
Java, letní semestr 2016
29.2.2016
Bck2brwsr
●
●
●
http://wiki.apidesign.org/wiki/Bck2Brwsr
Java běžící v prohlížeči
Cíle projektu
–
–
–
„Create small Java capable to boot fast and run in
100% of modern browsers including those that have
no special support for Java.
Demonstrate that Java has benefits over JavaScript
when creating larger HTML5 applications“
...
Java, letní semestr 2016
29.2.2016
Popularita
Java, letní semestr 2016
29.2.2016
zdroj: http://www.tiobe.com/tiobe_index
Popularita
Java, letní semestr 2016
29.2.2016
zdroj: http://www.tiobe.com/tiobe_index
JAVA
Historie a budoucnost
Java, letní semestr 2016
29.2.2016
Změny v jazyce od Java 5
●
●
●
●
●
●
●
static import
auto-boxing a auto-unboxing
nový for cyklus
generické typy
výčtový typ enum
metody s proměnným počtem parametrů (printf)
anotace (metadata)
Java, letní semestr 2016
29.2.2016
Java 7, 8
●
●
Java 6 – změny pouze v knihovnách
Java 7 – 2011
–
●
„mírné“ změny v jazyce
Java 8 – 2014
–
–
„větší“ změny v jazyce
„Java 8 will be revolution, not evolution“
Mark Reinhold, konference JavaOne, říjen 2011
–
ale
●
●
září 2012 – zrušení plánů na modularizaci
modularizace odsunuta do verze 9
Java, letní semestr 2016
29.2.2016
Java 7
●
změny
–
–
–
–
–
–
změny v syntaxi
podpora dynamických jazyků (nová instrukce v
bytekódu)
změny v NIO
Nimbus (Swing LaF)
nová verze JDBC
...
Java, letní semestr 2016
29.2.2016
Java 7 – změny v syntaxi
●
zápis konstant
–
binární konstanty
●
–
oddělení řádu v konstantách pomocí podtržítek
●
●
0b010101
1_000_000
String v switch příkazu
String
...
switch
case
case
...
}
month;
(month) {
"January":
"February":
Java, letní semestr 2016
29.2.2016
Java 7 – změny v syntaxi
●
operátor <>
–
–
–
zjednodušená vytváření generických typů
typ u new se automaticky odvodí
př.
List<String> list = new ArrayList<>();
List<List<String>> list = new ArrayList<>();
List<List<List<String>>> list =
new ArrayList<>();
Map<String, Collection<String>> map =
new LinkedHashMap<>();
●
otázka
Proč není new bez <> ? Tj. např.
List<String> list = new ArrayList();
Java, letní semestr 2016
29.2.2016
Java 7 – změny v syntaxi
●
interface AutoClosable a rozšířený try
–
př:
class Foo implements AutoClosable {
...
public void close() { … }
}
try ( Foo f1 = new Foo(); Foo f2 = new Foo() ) {
...
} catch (…) {
...
} finaly {
...
}
–
při ukončení try (normálně nebo výjimkou) se vždy
zavolá close() na objekty z deklarace v try
●
volá se v opačném pořadí než deklarováno
Java, letní semestr 2016
29.2.2016
Java 7 – změny v syntaxi
●
rozšíření catch na více výjimek
–
●
př:
try {
...
} catch (Exception1 | Exception2 ex) {
...
}
lepší typová kontrola výjimek při re-throw
Java, letní semestr 2016
29.2.2016
Je tento kód správně
private void foo(int i) throws Ex1, Ex2 {
try {
if (i < 0) {
throw new Ex1();
} else {
throw new Ex2();
}
} catch (Exception ex) {
throw ex;
}
}
●
●
v Java 7 ano
v Java 6 ne
–
kompilátor vypíše chybu zde
Java, letní semestr 2016
29.2.2016
Java 8
●
type annotations
–
–
●
●
●
●
●
lze anotovat použití typů
opakování stejné anotace
deafult a static metody v interfacech
lambda výrazy
odvození typu u generických typů
rozšíření std knihovny
profily
–
„podmnožina“ std knihovny
●
javac -profile ...
Java, letní semestr 2016
29.2.2016
Java 9
●
Moduly
●
Problémy aktuální Javy
–
–
–
●
problémy s CLASSPATH
nelze deklarovat explicitně závislosti
nelze skrýt veřejné typy
Cíle modulů
–
spolehlivá konfigurace
–
silné zapouzdření
Java, letní semestr 2016
29.2.2016
Moduly (Java 9)
●
Modul
–
pojmenovaná a „sebe-popisujicí“ kolekce balíčků
(packages) s typy (třídy,...) a daty
–
deklaruje
●
●
závislosti (vyžadované moduly)
poskytované balíčky
module-info.class
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
Java, letní semestr 2016
29.2.2016
Moduly (Java 9)
●
modulární JAR
–
●
JMOD
–
●
JAR s module-info.java
nový formát pro distribuování modulů
module path
–
vyhledávání modulů
Java, letní semestr 2016
29.2.2016
Moduly (Java 9)
●
JSE platforma – rozdělena na moduly
module java.base {
exports java.io;
exports java.lang;
exports java.lang.annotation;
exports java.lang.invoke;
exports java.lang.module;
exports java.lang.ref;
exports java.lang.reflect;
exports java.math;
exports java.net;
...
}
Java, letní semestr 2016
29.2.2016
Moduly (Java 9)
●
Nepojmenovaný modul
–
–
vidí všechny ostatní moduly
poskytuje vše veřejné
–
zpětná kompatibilita s CLASSPATH
Java, letní semestr 2016
29.2.2016
Java
Různé...
Java, letní semestr 2015
18.2.2015
Typový systém
●
silně typovaný jazyk
–
–
●
●
třídy (class)
primitivní typy (int, boolean, char,...)
"vše" je v nějaké třídě
neexistují globální proměnné, funkce,...
–
obdoba jsou static metody a atributy
Java, letní semestr 2015
18.2.2015
Test
public class InitTest {
static int i = 1;
{ i+=2; };
static { i++; };
public static void main(String argv[]) {
System.out.println(i);
System.out.println(new InitTest().i);
};
};
Program vypíše:
a) 2 4
b) 1 3
c) 3 5
d) 4 4
e) nelze přeložit
Java, letní semestr 2015
18.2.2015
Řešení testu
●
správně je a) 2 4
●
{ ...... } v definici třídy
–
–
–
●
inicializátor
provádí se při vytváření nové instance
používá se pro inicializaci anonymních vnitřních tříd
static { ....... }
–
–
–
statický inicializátor
provádí se při "natažení" třídy do VM
může pracovat pouze se static prvky třídy
Java, letní semestr 2015
18.2.2015
Test 2
public class InitTest {
static int i = 1;
{ i+=2; };
public InitTest() {
System.out.println(i++);
}
static { i++; };
public static void main(String argv[]) {
System.out.println(i);
System.out.println(new InitTest().i);
};
};
Výsledek:
a) 1 3 5
b) 2 3 5
c) 2 4 5
Java, letní semestr 2015
18.2.2015
Řešení testu 2
●
správně je C) 2 4 5
●
inicializátor se provádí před konstruktorem
●
nejdříve se inicializuje předek
–
inicializátory a konstruktor
Java, letní semestr 2015
18.2.2015
Výjimky a inicializátory
●
inicializátory mohou "vyhazovat" pouze výjimky, které
jsou definovány v konstruktorech
–
●
musí být definován alespoň jeden konstruktor
inicializátory anonymních tříd mohou vyhazovat
jakékoliv výjimky
–
–
třída se vytváří pouze jednou
není problém výjimku odchytit / deklarovat
Java, letní semestr 2015
18.2.2015
Statické inicializátory
●
musí skončit normálně
–
●
●
jinak nelze přeložit
prováděny v pořadí podle výskytu ve zdrojovém
souboru
nemohou obsahovat return
–
nelze přeložit
Java, letní semestr 2015
18.2.2015
Vlákna
●
Java Language Specification
–
definuje "memory model"
●
●
●
určuje možná chování programu (ve vztahu k vláknům)
pro daný program a průběh výpočtu určí, zda průběh
výpočtu je legální
volatile atributy tříd
–
vždy v konzistentním stavu
●
vlákna můžou mít zkopírované ne-volatile atributy do
svojí paměti
–
●
●
důvod = rychlost
změny ne-volatile atributů nemusejí být ihned vidět z
jiných vláken
přiřazení (i čtení) do primitivních typů <= 32 bitů –
atomické
–
tj. long a double nejsou
●
ale pokud jsou volatile, tak ano
přiřazení (čtení) referencí - atomické
Java,●letní semestr 2015
18.2.2015
Viditelnost ve třídách
●
lze změnit viditelnost elementů v potomcích?
–
např.
class A { public void foo() {} }
class B extends A { private void foo() {} }
●
●
viditelnost lze „zmírnit“ ale nelze „zpřísnit“
proč
–
pokud by bylo
class A { public void foo() {} }
class B extends A { private void foo() {} }
–
pak by šlo následující
A a = new B();
a.foo();
Java, letní semestr 2015
18.2.2015
Java
JavaFX
Java, letní semestr 2015
18.2.2015
Přehled
●
Java GUI
–
Java 1.0 (1996) – AWT
●
–
Java 1.2 (2000) – Swing
●
–
použití nativních GUI komponent
kompletní GUI v Javě
JavaFX (2007)
●
●
●
nová technologie
běžící nad Java VM
ale vlastní jazyk
–
●
●
–
zamýšleno jako konkurence pro Flash
neujalo se
JavaFX 2.0 (2011)
●
–
–
deklarativní
zůstalo pouze API (jazyk zahozen)
od JDK 7 update 6 součást std JDK (JavaFX 2.2)
JDK 8 – JavaFX 8
žádný další vývoj Swingu
● 2015
Java, letní semestr
18.2.2015
Hello World
public class HelloWorld extends Application {
@Override
public void start(Stage stage) {
Label message = new Label("Hello, JavaFX!");
message.setFont(new Font(100));
stage.setScene(new Scene(message));
stage.setTitle("Hello");
stage.show();
}
žádný J prefix
// žádný main()
}
Java, letní semestr 2015
18.2.2015
Hello World
●
ve starších verzích bylo potřeba main() přidat
explicitně
public class MyApp extends Application {
public static void main(String[] args) {
launch(args);
}
...
}
Java, letní semestr 2015
18.2.2015
Události
●
●
podobně jako ve Swingu/AWT
ALE typicky se poslouchá na změny vlastností
–
tj. neposlouchá se přímo na komponentě
●
existují výjimky, např. tlačítko
Slider slider = new Slider(10, 100, 100);
Label message = new Label("Hello, JavaFX!");
slider.valueProperty().addListener(property ->
message.setFont(new Font(slider.getValue())));
Java, letní semestr 2015
18.2.2015
Vlastnosti komponent (properties)
●
●
interface Property<T>
–
–
void addListener(InvalidationListener listener)
void addListener(ChangeListener<? super T> listener)
–
–
–
void bind(ObservableValue<? extends T> observable)
void bindBidirectional(Property<T> other)
…
implementace
–
–
–
–
–
class ObjectProperty<T>
class IntegerProperty
class BooleanProperty
class StringProperty
...
Java, letní semestr 2015
18.2.2015
Vlastnosti – příklad implementace
private StringProperty text =
new SimpleStringProperty("");
public final StringProperty textProperty() {
return text;
}
public final void setText(String newValue){
text.set(newValue);
}
public final String getText() {
return text.get();
}
Java, letní semestr 2015
18.2.2015
Vlastnosti – listenery
●
InvalidationListener
–
–
volá se pokud současná hodnota vlastnosti přestala
platit
umožňuje „líné“ vyhodnocení
void invalidated(Observable observable)
●
ChangeListener
–
–
–
volá se při změně hodnoty vlastnosti
je potřeba spočítat i novou hodnotu
tj. neumožňuje „líné“ vyhodnocení
void changed(ObservableValue<? extends T>
observable, T oldValue, T newValue)
Java, letní semestr 2015
18.2.2015
Vlastnosti – propojování
●
●
„binding“
automatické aktualizování vlastnosti při změně jiné
vlastnosti
–
interně implementováno pomocí listenerů
text1.textProperty().bind(text2.textProperty());
text1.textProperty().bindBidirectional(
text2.textProperty());
●
třída Bindings
–
statické metody pro snadné vytváření propojení
Java, letní semestr 2015
18.2.2015
Layout
●
vytvoření rozložení (layout) komponent
–
JavaFX Scene Builder
●
–
„ručně“
●
–
●
„naklikání“ GUI
vytváření instancí komponent
definice v FXML
podobné jako ve Swingu
–
panely (panes) místo layout managerů
Java, letní semestr 2015
18.2.2015
Layout
●
●
●
●
●
●
BorderPane (jako BorderLayout)
HBox
VBox
GridPane (jako GridBagLayout)
TilePane (jako GridLayout)
…
VBox pane = new VBox();
pane.getChildren().addAll(button1, button2,);
pane.setPadding(new Insets(10));
Java, letní semestr 2015
18.2.2015
FXML
<?import
<?import
<?import
<?import
<?import
java.net.*?>
javafx.geometry.*?>
javafx.scene.control.*?>
javafx.scene.layout.*?>
javafx.scene.text.*?>
<GridPane
fx:controller="fxmlexample.FXMLExampleController"
xmlns:fx="http://javafx.com/fxml" alignment="center"
hgap="10" vgap="10">
<padding><Insets top="25" right="25" bottom="10"
left="25"/></padding>
<Text text="Welcome"
GridPane.columnIndex="0" GridPane.rowIndex="0"
GridPane.columnSpan="2"/>
<Label text="User Name:"
GridPane.columnIndex="0" GridPane.rowIndex="1"/>
...
Java, letní semestr 2015
18.2.2015
FXML
●
použití
public void start(Stage stage) {
try {
Parent root = FXMLLoader.load(getClass().
getResource("file.fxml"));
stage.setScene(new Scene(root));
stage.show();
} catch (IOException ex) {
ex.printStackTrace();
System.exit(0);
}
}
Java, letní semestr 2015
18.2.2015
FXML
●
přidání listenerů/propojení
a)
<TextField id="username" …
TextField username =
(TextField) root.lookup("#username");
b)
<GridPane xmlns:fx="http://javafx.com/fxml" hgap="10"
vgap="10" fx:controller="LoginDialogController">
<Button fx:id="okButton" text="Ok" />
public class LoginDialogController implements
Initializable {
@FXML private TextField username;
@FXML private Button okButton;
public void initialize(URL url, ResourceBundle rb){
okButton.disableProperty().bind(...
Java, letní semestr 2015
18.2.2015
CSS
●
vzhled UI lze nastavit pomocí CSS
Scene scene = new Scene(pane);
scene.getStylesheets().add("scene.css");
●
používají se JavaFX specifické atributy
#pane {
-fx-padding: 0.5em;
-fx-hgap: 0.5em;
-fx-vgap: 0.5em;
-fx-background-image: url("bg.jpg")
}
Java, letní semestr 2015
18.2.2015
Animace apod.
●
ScaleTransition
ScaleTransition st =
new ScaleTransition(Duration.millis(3000));
st.setByX(1.5);
st.setByY(1.5);
st.setNode(button);
st.setCycleCount(Animation.INDEFINITE);
st.setAutoReverse(true);
st.play();
●
●
●
●
FadeTransition
RotateTransition
DropShadow
...
Java, letní semestr 2015
18.2.2015
Různé komponenty
●
JavaFX obsahuje
–
–
–
WebKit (HTML renderovací jádro)
přehrávač medií
...
Java, letní semestr 2015
18.2.2015
Verze prezentace
AJ02.cz.2016.01
Java, letní semestr
2015
18.2.2015 Tato prezentace podléhá licenci Creative Commons Uveďte autora-Neužívejte komerčně 4.0 Mezinárodní License. 55

Podobné dokumenty

Proprietární licence

Proprietární licence hodně, ale to není naším cílem. My se zaměříme na typicky nabízené licence výrobců, kteří se rozhodli distribuovat proprietární aplikace. Hned na začátku je potřeba říct, že licenční programy propr...

Více

prezentace

prezentace decay: 2 // zvětší interval pokud nenastane změna // v příchozích datech

Více

10. Přílohy

10. Přílohy příkazy package a import

Více

Vítejte! - NetBeans.org

Vítejte! - NetBeans.org vyzvat uživatele k hádání zašifrovaného slova labelem Your guess (type 'end' + ENTER to quit, ENTER for next word): používat pro čtení ze standardního výstupu BufferedReader v systému IN new Buffer...

Více

Katalog CZ - Bosch Security Systems

Katalog CZ - Bosch Security Systems Potřebujete-li více materiálů a informací, navštivte naše internetové stránky www.boschsecuritysystems.cz

Více

Poznámky k vydání Debian GNU/Linuxu 5.0 (Lenny), SPARC

Poznámky k vydání Debian GNU/Linuxu 5.0 (Lenny), SPARC deb-src http://mirrors.kernel.org/debian lenny-proposed-updates main contrib

Více

Vývoj programovacích jazyků

Vývoj programovacích jazyků { public static void main (String args[]) { System.out.println(" vstup dvou celych cisel:"); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { IntWithNsd x = new IntWi...

Více

Grafická uživatelská rozhraní

Grafická uživatelská rozhraní grafické prostředí nikdy nedošlo ke komerčnímu prodeji na univerzitách, ve výzk. centru Palo Alto

Více