Pokročilé programování na platformě JAVA, letní semestr 2016
Transkript
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
Pokročilé programování na platformě JAVA, letní semestr 2012
Java program, spustí se pod existující JVM
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í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...
Katalog CZ - Bosch Security Systems
Potřebujete-li více materiálů a informací, navštivte naše internetové stránky
www.boschsecuritysystems.cz
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ý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...
Grafická uživatelská rozhraní
grafické prostředí
nikdy nedošlo ke komerčnímu
prodeji
na univerzitách, ve výzk.
centru Palo Alto