Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podobne dokumenty
Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Dokumentacja do API Javy.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

1 Atrybuty i metody klasowe

Programowanie obiektowe

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Wykład 4: Klasy i Metody

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

JAVA W SUPER EXPRESOWEJ PIGUŁCE

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Aplikacje w środowisku Java

Wykład 7: Pakiety i Interfejsy

Programowanie obiektowe

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie w środowiskach graficznych. Wykład 3 Język C#

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Aplikacje w środowisku Java

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Definiowanie własnych klas

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Interfejsy i klasy wewnętrzne

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie w Javie wykład 8 Interfejsy

Programowanie obiektowe

KOTLIN. Język programowania dla Androida

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Programowanie obiektowe

Wykład 8: Obsługa Wyjątków

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Projektowanie aplikacji internetowych laboratorium

PHP 5 język obiektowy

Metody Metody, parametry, zwracanie wartości

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Wstęp do ruby dla programistów javy

Rozdział 4 KLASY, OBIEKTY, METODY

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Tworzenie aplikacji w języku Java

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Programowanie obiektowe

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Podstawy języka Java. przygotował:

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Polimorfizm. dr Jarosław Skaruz

Remote Method Invocation 17 listopada 2010

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Programowanie Komputerów

Wywoływanie metod zdalnych

Wykład 6: Dziedziczenie

Podejście obiektowe do budowy systemów rozproszonych

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Kurs WWW. Paweł Rajba.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Języki i metody programowania Java. Wykład 2 (część 2)

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Java: interfejsy i klasy wewnętrzne

Java Język programowania

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Platformy Programistyczne Podstawy języka Java

Multimedia JAVA. Historia

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Dawid Gierszewski Adam Hanasko

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

PROGRAMOWANIE DYNAMICZNE

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Programowanie w Internecie. Java

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Wykład 2: Podstawy Języka

Programowanie obiektowe

Programowanie obiektowe

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Wywoływanie metod zdalnych

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Transkrypt:

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki

Refleksja Typy anonimowe Wyrażenia lambda Extension methods *LINQ Nullable type, null-coalesce, null-conditional

Java jest językiem dynamicznym Umożliwia wykorzystanie klas, których nazwy nie były znane podczas tworzenia i kompilacji programu String nazwaklasy = "test.osoba"; Object ob1 = null; try { Class c = Class.forName(nazwaKlasy); ob1 = c.newinstance(); catch (InstantiationException e) { System.out.println(e); catch (IllegalAccessException e) { System.out.println(e); catch (ClassNotFoundException e) { System.out.println(e);

Umożliwia odczyt informacji o klasach i obiektach (konstruktory, metody, pola) w trakcie pracy programu Przydatna dla dynamicznie ładowanych klas Nawet jeśli nie znamy nazw składowych możemy: Stworzyć instancję klasy Pobierać i ustawiać wartości pól obiektów Wywoływać metody Tworzyć i modyfikować tablice

Zwykłe programy nie potrzebują refleksji Programy, które przetwarzają programy potrzebują refleksji Typowe przyklady: Debugger Dynamicznie generowane GUI (np. Weka) IDE (np. Netbeans) Program dynamiczne ładujący pluginy

public static void main(string[] args) { try { Class cl = Class.forName("java.lang.String"); Constructor cnst[] = cl.getconstructors(); Field fld[] = cl.getdeclaredfields(); Method mtd[] = cl.getmethods(); System.out.println("Konstruktory klasy String:"); for (int i = 0; i < cnst.length; i++) { System.out.println(cnst[i].getName()); System.out.println("Pola:"); for (int i = 0; i < fld.length; i++) { System.out.println(fld[i].getName()); System.out.println("Metody:"); for (int i = 0; i < mtd.length; i++) { System.out.println(mtd[i].getName()); catch (ClassNotFoundException e) { e.printstacktrace();

static void Main(string[] args){ try { Type cl = Type.GetType("System.String"); ConstructorInfo[] cnst = cl.getconstructors(); FieldInfo[] fld = cl.getfields(); MethodInfo[] mtd = cl.getmethods(); Console.WriteLine("Konstruktory klasy String:"); for (int i = 0; i < cnst.length; i++) { Console.WriteLine(cnst[i].Name); Console.WriteLine("Pola:"); for (int i = 0; i < fld.length; i++) { Console.WriteLine(fld[i].Name); Console.WriteLine("Metody:"); for (int i = 0; i < mtd.length; i++) { Console.WriteLine(mtd[i].Name); catch (NullReferenceException e) { Console.WriteLine(e.StackTrace);

Dostępne jest praktycznie wszystko: Modyfikatory dostępu Parametry metod Pola Czy typ generyczny, zagnieżdżony, abstrakcyjny Paczka/Namespace Anotacje/Atrybuty

Typy anonimowe to klasy bez nazw Tworząc klasę anonimową od razu tworzy się jej wystąpienie Typy anonimowe nadają się do prostych pojedynczych zbiorników na dane, których potrzebujemy na chwilę

Object produkt = new Object(){ String nazwa = "Gizmo"; double cena = 239.99; String opis = "Rewelacyjny produkt"; ; double rzeczywista = 23; double urojona = 2.3; Object x = new Object (){ double r = rzeczywista; double u = urojona; ; Klient k = baza.pobierzklienta(23); Klient kontakt = new Klient(){ private Klient init(){ imie = k.imie; email = k.email; return this;.init();

var produkt = new { Nazwa = "Gizmo", Cena = 239.99, Opis = "Rewelacyjny produkt" ; var Rzeczywista = 23; var Urojona = 2.3; var x = new { Rzeczywista, Urojona ; Klient k = Baza.PobierzKlienta(23); var kontakt = new { k.imie, k.email ;

Ponieważ C# jest silnie typowanym językiem, należy podawać typ każdej zmiennej (tak jak w Javie) Można jednak pominąć nazwę typu, jeśli przypisana wartość jednoznacznie wyznacza typ Należy skorzystać ze słowa kluczowego var string pytanie = "A imię jego"; Int32 odpowiedz = 44; var pytanie = "A imię jego"; var odpowiedz = 44;

Od C++11 istnieje podobne słowo: auto Od C++14 słowo kluczowe auto może być umieszczone również jako nazwa zwracanego przez funkcję typu auto suma = 2 + 2; auto foo() { return 5;

Od Javy 10 mamy do dyspozycji słowo var Zasady podobne jak w C# tylko zmienne lokalne natychmiastowe przypisanie Można łączyć z typami anonimowymi Dla starszych wersji Javy podobną funkcjonalność oferuje bibliotek Lombok var pytanie = "A imię jego"; var odpowiedz = 44;

Jest... Poniższy kod nie skompiluje się var pytanie = "A imię jego"; pytanie = 44; Ponadto typ musi być określony przy deklaracji var pozniejtozrobie; //błąd var amozenull = null; //nie działa var warunkowo; //to też nie if (warunek) warunkowo = 500; else warunkowo = 600; var warunkowo = warunek? 500 : 600; //ale to już tak!!!

Sposób na tworzenie anonimowych metod Wyrażenia lambda nadają się do operacji na chwilę Przykłady Java: x -> x + 1 (x, y) -> x * y () -> new Piwo() (x, y) -> { int result = x + y; return result; Przykłady C#: x => x + 1 (x, y) => x * y () => new Piwo() (x, y) => { var result = x + y; return result;

// Słowa, słowa, słowa List<String> words = new ArrayList<String>(); words.add("mój"); words.add("drogi"); words.add("leonato"); words.add("zgniłą"); // Słowa, słowa, słowa var words = new List<string> { "Mój", "Drogi", "Leonato", "zgniłą" ; // Sortujemy Collections.sort(words, (a, b) -> new Integer(a.length).compareTo(b.length)); // Wyniki for (String word : words.filter(w -> w.startswith("d")){ // Sortujemy words.sort((a, b) => a.length.compareto(b.length)); // Wyniki foreach (string word in words.where(w => w.startswith("d")){ System.out.println(word + " "); Console.Write(word + " ");

Poprzedni slajd pokazywał ciąg metod wykorzystujących wyrażenia lambda W C# są to głównie metody LINQ (o tym za chwilę) a w Javie są to tzw. strumienie Inspiracja językami funkcyjnymi Bardzo uzależnia Arrays.asList("a1", "a2", "b1", "c2", "c1").stream().filter(s -> s.startswith("c")).map(string::touppercase).sorted().foreach(system.out::println);

Do standardu języka C++ również wprowadzono wyrażenia lambda, choć z trochę inną składnią [] (string& name) { cout << "Hello " << name; C++ pozwala również na przechwytywanie zmiennych widocznych z aktualnego zakresu string name; cin >> name; [&] () { cout << "Hello " << name;

Jeśli wyrażenie lambda wywołuje tylko istniejącą już metodę, można skorzystać z method reference Arrays.sort(publications, ); (a, b) -> Person.compareByAge(a, b) Arrays.sort(publications, Person::compareByAge);

W jakich jeszcze sytuacjach mogą być przydatne? Filtrowanie kolekcji Wyszukiwanie w kolekcjach Agregacja danych (sumy, średnie, itp.) Obsługa zdarzeń Przekazywanie prostych metod jako parametry

Od wersji 3.0 języka C# można roszerzać dowolną klasę (nawet zaimportowaną i zamkniętą) o metody Mechanizm ten polega na wywoływaniu metod statycznych za pomocą składni charakterystycznej dla metod niestatycznych W ten sposób można w wygodny sposób korzystać ze statycznych metod dla bardzo popularnych klas, których nie można zmieniać (np. String) Metody powstające dzięki temu mechanizmowi noszą nazwę Extension Methods

public static class IntEX { public static bool IsEven(this Int32 inttocheck) { return inttocheck % 2 == 0; public class HelloWorld { public static void Main(string[] args) { Console.WriteLine(2.IsEven()); Sic! Extension methods można wykorzystać do rozszerzenia interfejsu! Kto nie marzył o napisaniu implementacji choć jednej metody w interfejsie...

Klasa zawierająca extension methods musi być statyczna Pierwszym parametrem extension method jest zmienna rozszerzanego typu poprzedzona słowem kluczowym this Klasa zawierająca extension methods musi być zaimportowana (klauzula using) w klasie w której extension methods mają być wykorzystywane Metody rozszerzonej klasy mają pierwszeństwo nad extension methods

Od Javy 8 interfejsy mogą mieć metody domyślne Wprowadzone aby nie psuć wielu klas implementujących interfejsy zmienione po wprowadzeniu wyrażeń lambda Podczas kompilacji sprawdzane są konflikty przy dziedziczeniu wielu metod domyślnych o tej samej sygnaturze i wymuszane jest ich przesłonięcie Interfejsy wciąż nie mogą mieć pól ani konstruktorów, więc nie zrównały się z klasami abstrakcyjnymi

interface Person { default void sayhello() { System.out.println("Hello there!"); class Sam implements Person { class Main { public static void main(string [] args) { Sam sam = new Sam(); sam.sayhello();

LINQ to język zapytań będący rozszerzeniem języka C# Zapytania LINQ można wykonywać na: kolekcjach dziedziczących z IEnumerable plikach XML bazach danych Zapytania LINQ są równoważne ciągom wyrażeń lambda, z których większość to extension methods Do korzystania z LINQ oraz związanych z nim wyrażeń należy w kodzie dodać using System.Linq

public void Linq1() { int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 ; var lownums = from n in numbers where n < 5 select n; public void Linq2() { string[] words = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese" ; var wordgroups = from w in words group w by w[0] into g select new { FirstLetter = g.key, Words = g ; foreach (var g in wordgroups) { Console.WriteLine("Words that start with the letter '{0':", g.firstletter); foreach (var w in g.words) Console.WriteLine(w);

public void Linq1() { int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 ; var lownums = numbers.where(n => n < 5); public void Linq2() { string[] words = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese" ; var wordgroups = words.groupby(w => w[0]).select(r => new { FirstLetter = g.key, Words = g ); foreach (var g in wordgroups) { Console.WriteLine("Words that start with the letter '{0':", g.firstletter); foreach (var w in g.words) Console.WriteLine(w);

Język C# umożliwia sporą kontrolę nad tym co może a co nie może przyjmować wartości null Można stworzyć nullowalne typy proste: int? i = null; Można przypisać wartość domyślną zamiast null int y = x?? -1; Można odczytywać wartości tylko gdy nie są null var szwagier = this?.ojciec?.corka?.maz?.imie; var adam = ludzie?[0]; C# 8.0 wprowadza nullable reference types