Wprowadzenie do języka Kotlin

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Który operator w Kotlinie umożliwia bezpieczne wywołanie metody na obiekcie, który może być null?

  • ===
  • ?. (correct)
  • ?:
  • ==

Operator ?: w Kotlinie, nazywany operatorem Elvisa, służy do:

  • Wyboru wartości domyślnej, gdy obiekt po lewej stronie jest nullem. (correct)
  • Porównywania równości strukturalnej dwóch obiektów.
  • Bezpiecznego dostępu do elementu kolekcji z potencjalnym indeksem poza zakresem.
  • Porównywania równości referencyjnej dwóch obiektów.

Czym różni się równość strukturalna od równości referencyjnej w Kotlinie?

  • Równość strukturalna używa `equals()`, a referencyjna sprawdza, czy obiekty zajmują to samo miejsce w pamięci. (correct)
  • Równość strukturalna to `===`, a referencyjna to `==`.
  • Równość strukturalna porównuje referencje, a referencyjna wartości.
  • Równość strukturalna dotyczy tylko typów prostych, a referencyjna obiektów.

Które stwierdzenie najlepiej opisuje interfejsy kolekcji w Kotlinie?

<p>Interfejsy zmienne rozszerzają interfejsy tylko do odczytu o operacje dodawania, usuwania i aktualizowania elementów. (D)</p> Signup and view all the answers

Co oznacza, że kolekcje tylko do odczytu są kowariantne w Kotlinie?

<p>Można przypisać kolekcję typu <code>List&lt;Rectangle&gt;</code> do zmiennej typu <code>List&lt;Shape&gt;</code> jeśli <code>Rectangle</code> dziedziczy po <code>Shape</code>. (D)</p> Signup and view all the answers

Do czego służy adnotacja @HtmlTagMarker?

<p>Do oznaczania klas reprezentujących elementy DSL i określania receivera dla lambd. (B)</p> Signup and view all the answers

Które z poniższych zdań najlepiej opisuje zachowanie funkcji lazy()?

<p>Funkcja <code>lazy()</code> wykonuje lambdę tylko raz i zapamiętuje jej wynik. (C)</p> Signup and view all the answers

W kontekście funkcji Delegates.observable(), kiedy jest wywoływana funkcja obsługująca modyfikację?

<p>Po każdej modyfikacji właściwości. (D)</p> Signup and view all the answers

Jaki jest cel metody renderAttributes?

<p>Konwertowanie mapy atrybutów elementu na tekstową reprezentację. (B)</p> Signup and view all the answers

W jaki sposób dodawane są nowe elementy potomne do obiektu Tag?

<p>Poprzez metodę <code>addChild</code> w klasie <code>Tag</code>. (C)</p> Signup and view all the answers

Jaką wartość zwraca metoda toString klasy Tag?

<p>Pełną reprezentację HTML elementu wraz z jego potomkami jako <code>String</code>. (B)</p> Signup and view all the answers

Która część kodu definiuje strukturę HTML strony (np. html, head, body itp.)?

<p>Funkcje rozszerzające klasy <code>Tag</code>, takie jak <code>html</code>, <code>head</code>, <code>body</code> (B)</p> Signup and view all the answers

Jaki jest efekt działania builder.append("$indent\n") w metodzie render?

<p>Dodaje wcięcie i znak nowej linii. (A)</p> Signup and view all the answers

W kodzie a(href = "https://kotlinlang.org") {+"link"}, jaka jest funkcja a?

<p>Funkcja tworząca element hiperłącza. (D)</p> Signup and view all the answers

Jak w kodzie HTML DSL dodawany jest tekst do elementu Tag?

<p>Używając operatora <code>+</code> wewnątrz bloku lambda. (C)</p> Signup and view all the answers

W jakiej kolejności wykonają się bloki inicjalizacyjne i przypisania właściwości w klasie Customer3?

<p>Najpierw przypisanie <code>firstNameProp</code>, potem <code>init#1</code>, potem <code>lastNameProp</code>, na końcu <code>init#2</code>. (C)</p> Signup and view all the answers

Które stwierdzenie dotyczące konstruktorów w Kotlinie jest prawdziwe?

<p>Jeśli konstruktor podstawowy nie ma parametrów, delegacja w konstruktorze dodatkowym jest niejawna. (A)</p> Signup and view all the answers

Jak zainicjalizować właściwość klasy Contact o nazwie category, aby miała wartość "private"?

<p>Ustawić <code>val category: String = &quot;private&quot;</code>. (C)</p> Signup and view all the answers

Jak odwołać się do pola (backing field) właściwości w setterze w Kotlinie?

<p>Używając słowa kluczowego <code>field</code>. (D)</p> Signup and view all the answers

Który modyfikator widoczności sprawia, że deklaracja jest widoczna tylko w tym samym pliku?

<p><code>private</code> (D)</p> Signup and view all the answers

Składowa klasy z modyfikatorem protected jest widoczna:

<p>Wewnątrz tej klasy i w jej podklasach. (B)</p> Signup and view all the answers

Które słowo kluczowe jest używane, aby umożliwić dziedziczenie po klasie?

<p><code>open</code> (C)</p> Signup and view all the answers

Jak zadeklarować metodę, którą można nadpisać w klasach pochodnych?

<p>Używając słowa kluczowego <code>open</code>. (B)</p> Signup and view all the answers

Jak uniemożliwić nadpisanie metody w klasie potomnej?

<p>Używając słowa kluczowego <code>final</code> przy definicji metody klasy pochodnej. (D)</p> Signup and view all the answers

Która klasa niejawnie dziedziczy po Any?

<p>Każda klasa w Kotlinie. (C)</p> Signup and view all the answers

Która z poniższych opcji poprawnie opisuje relację między właściwością val a var w kontekście nadpisywania w klasach?

<p>Właściwość <code>val</code> może być nadpisana przez właściwość <code>var</code>, ale nie na odwrót. (D)</p> Signup and view all the answers

Które z wymienionych cech nie są dozwolone dla klas danych (data class)?

<p>Klasy danych mogą być otwarte (open). (C)</p> Signup and view all the answers

Jakie metody są automatycznie generowane dla klas danych w Kotlinie?

<p><code>toString()</code>, <code>equals()</code>, <code>copy()</code>, <code>hashCode()</code> i <code>componentN()</code> (D)</p> Signup and view all the answers

Jaka jest główna różnica między zagnieżdżoną (nested) a wewnętrzną (inner) klasą w Kotlinie?

<p>Klasa wewnętrzna ma dostęp do składowych klasy zewnętrznej, a zagnieżdżona nie. (B)</p> Signup and view all the answers

W jaki sposób wywoływane są funkcje rozszerzające w Kotlinie?

<p>Statycznie, w zależności od typu zmiennej, na której jest wywoływana funkcja. (D)</p> Signup and view all the answers

Jakie jest zastosowanie słowa kluczowego this w funkcji rozszerzającej?

<p><code>this</code> odnosi się do instancji klasy, na której funkcja rozszerzająca jest wywoływana. (A)</p> Signup and view all the answers

Które z poniższych stwierdzeń poprawnie opisuje domyślną implementację metody w interfejsie?

<p>Metoda z domyślną implementacją może być opcjonalnie nadpisana przez klasy implementujące interfejs. (A)</p> Signup and view all the answers

Jakie są ograniczenia obiektów singleton w Kotlinie?

<p>Obiekty singleton nie mogą mieć konstruktorów. (B)</p> Signup and view all the answers

Które z poniższych opisuje cel obiektów towarzyszących (companion object)?

<p>Obiekty towarzyszące są używane do przechowywania ogólnych właściwości i metod, które są powiązane z klasą, a nie z instancją. (A)</p> Signup and view all the answers

W jaki sposób odwołujemy się do obiektu towarzyszącego (companion object) niezależnie od tego, czy jest on nazwany czy nie?

<p>Używając nazwy klasy, w której obiekt towarzyszący jest zdefiniowany. (A)</p> Signup and view all the answers

Flashcards

?.

Operator bezpiecznego odwoływania się do właściwości, który zwraca null, jeśli obiekt jest null. Nie próbuje odwoływać się do właściwości, jeśli obiekt jest null.

?:

Operator Elvisa, który pozwala przypisać wartość domyślną, jeśli obiekt jest null. Zwraca wartość po prawej stronie operacji, jeśli obiekt po lewej jest null.

=== (i !==)

Porównanie referencji, które sprawdza, czy dwie zmienne wskazują na ten sam obiekt.

== (i !=)

Porównanie strukturalne sprawdzające, czy dwa obiekty mają te same wartości.

Signup and view all the flashcards

Interfejs zmienny (mutable)

Interfejs zmienny, który pozwala na modyfikację zawartości kolekcji.

Signup and view all the flashcards

Klasa Shape

Klasa bazowa dla kształtów, która określa liczbę wierzchołków.

Signup and view all the flashcards

Klasa Rectangle

Klasa dziedzicząca po Shape, która zawsze ma 4 wierzchołki.

Signup and view all the flashcards

Klasa Polygon

Klasa dziedzicząca po Shape, która może mieć zmienną liczbę wierzchołków.

Signup and view all the flashcards

Klasy danych

Klasy, które automatycznie generują metody toString, equals, hashCode oraz inne. Mają główny konstruktor przyjmujący co najmniej jeden parametr.

Signup and view all the flashcards

Funkcje rozszerzające

Metody, które dodają funkcjonalność do istniejących klas. Mogą być ogólne, a this odnosi się do obiektu, na którym są wywoływane.

Signup and view all the flashcards

Klasy zagnieżdżone

Klasy, które są zagnieżdżone w innych klasach. Nie mają dostępu do składowych klasy zawierającej.

Signup and view all the flashcards

Klasy wewnętrzne

Klasy, które są zagnieżdżone w innych klasach i mają dostęp do składowych klasy zawierającej.

Signup and view all the flashcards

Interfejsy

Interfejsy definiują metody i właściwości, które muszą być zaimplementowane przez klasy, które je realizują.

Signup and view all the flashcards

Singleton

Typ obiektu, który jest dostępny tylko w jednej instancji. Nie może mieć konstruktora.

Signup and view all the flashcards

Obiekt towarzyszący

Typ obiektu, który jest powiązany z klasą, ale nie jest jej instancją. Może zawierać funkcje pomocnicze.

Signup and view all the flashcards

Klasa z parametrami

Klasa w Kotlinie, która używa parametrów w nawiasach podczas definicji. Parametry te są inicjowane w momencie tworzenia obiektu.

Signup and view all the flashcards

Blok init

Blok kodu wykonywany przy tworzeniu obiektu klasy. Umożliwia inicjalizację pól. Może występować wiele razy.

Signup and view all the flashcards

Właściwości w klasie

Właściwości (properties) w klasie to pola z getterami i setterami. Umożliwiają zarządzanie dostępem do danych.

Signup and view all the flashcards

Właściwość tylko do odczytu

Właściwość w klasie bez funkcji settera. Dostępne są tylko funkcje do odczytu.

Signup and view all the flashcards

Właściwość zapisywalna

Właściwość w klasie, dla której możesz zmienić wartość.

Signup and view all the flashcards

Specyfikatory dostępu

Specyfikator dostępu określający, gdzie dana funkcja lub właściwość jest widoczna. Możliwe opcje: private, protected, internal, public.

Signup and view all the flashcards

Specyfikator dostępu private

Specyfikator dostępu, który ogranicza widoczność funkcji lub właściwości do tej samej klasy. Najwyższy poziom prywatności.

Signup and view all the flashcards

Specyfikator dostępu protected

Specyfikator dostępu, który ogranicza widoczność funkcji lub właściwości do klasy i jej podklas.

Signup and view all the flashcards

Specyfikator dostępu internal

Specyfikator dostępu, który ogranicza widoczność funkcji lub właściwości do tego samego modułu. Modul to projekt, plik lub zestaw plików.

Signup and view all the flashcards

Specyfikator dostępu public

Specyfikator dostępu, który nie ogranicza widoczności. Dostęp publiczny dla wszystkich.

Signup and view all the flashcards

Factory

Fabryka tworzy obiekty. Interfejs Factory określa metodę create(), która tworzy obiekt typu T.

Signup and view all the flashcards

Delegowanie interfejsów

Delegacja interfejsu to mechanizm, który pozwala jednemu obiektowi przekazać implementację zdefiniowaną w interfejsie do innego obiektu.

Signup and view all the flashcards

Delegacja właściwości

Właściwość z delegowaniem używa odseparowanej logiki do zarządzania dostępem do wartości właściwości.

Signup and view all the flashcards

Operator by w delegacji

Operator by jest używany w delegacji interfejsów, aby wskazać, jaki obiekt ma stanowić źródło implementacji dla danego interfejsu.

Signup and view all the flashcards

Nadpisywanie metod zdelegowanych

Klasa, która implementuje interfejs może nadpisać metody zdelegowane, ale nie może nadpisać właściwości.

Signup and view all the flashcards

Funkcja lazy()

Funkcja lazy() zwraca instancję Lazy, która jest leniwą właściwością. Wartość właściwości jest obliczana dopiero przy pierwszym dostępie.

Signup and view all the flashcards

Funkcja observable()

Funkcja observable() tworzy obserwującą właściwość, która wywołuje callback przy każdej modyfikacji wartości.

Signup and view all the flashcards

children.add(tag)

Metoda dodająca element HTML jako dziecko bieżącego elementu.

Signup and view all the flashcards

render(builder: StringBuilder, indent: String)

Metoda odpowiedzialna za dodanie elementu HTML i wszystkich jego potomków w postaci tekstowej do StringBuildera, z zadanym wcięciem.

Signup and view all the flashcards

renderAttributes(): String

Metoda konwertująca atrybuty elementu HTML do postaci tekstowej.

Signup and view all the flashcards

toString(): String

Metoda zwracająca tekstową reprezentację elementu HTML ze wszystkimi potomkami.

Signup and view all the flashcards

Klasa Tag

Klasa Tag reprezentuje element HTML. Posiada atrybut attributes przechowujący parę klucz-wartość dla atrybutów HTML.

Signup and view all the flashcards

Metoda set(value) w Tag

Metoda set(value) w klasie Tag ustawia atrybut href dla tego elementu HTML.

Signup and view all the flashcards

Klasa BodyTag

Klasa BodyTag dziedziczy po klasie TagWithText i służy do dodawania typowych elementów (potomków) do tagu body w HTML.

Signup and view all the flashcards

Operator unaryPlus()

Operator unaryPlus() w klasie TagWithText dodaje do listy potomków element TextElement ze zwykłym tekstem.

Signup and view all the flashcards

Adnotacja @DslMarker

Adnotacja @DslMarker oznacza, że klasa HtmlTagMarker służy do oznaczania klas DSL, gdzie wywołania metod zagnieżdżonych lambd są przekazywane do odbiorcy.

Signup and view all the flashcards

Study Notes

Wprowadzenie do języka Kotlin

  • Język programowania Kotlin jest wieloplatformowy, statycznie typowany i uniwersalny
  • Zaprojektowany do pełnego współdziałania z językiem Java
  • Działa na platformie JVM, kompiluje się do JavaScript lub kodu natywnego (LLVM)
  • Standardowy kompilator Kotlin generuje kod bajtowy Java 8, ale umożliwia wybór docelowej wersji Java (9–20) dla optymalizacji

Cele przedmiotu i wymagania wstępne

  • Poznanie języka Kotlin
  • Podstawy tworzenia interfejsu użytkownika
  • Zasady projektowania architektury aplikacji mobilnej
  • Znajomość programowania obiektowego
  • Język angielski na poziomie podstawowym
  • Znajomość zagadnień z zakresu struktur danych i sieci komputerowych
  • Zaliczenie pisemne (test z pytaniami zamkniętymi)

Efekty uczenia się

  • Wiedza: Student zna najważniejsze elementy języka Kotlin, architekturę aplikacji mobilnej i metody tworzenia interfejsu użytkownika.
  • Umiejętności: Student potrafi projektować i implementować aplikacje mobilne o dobrej architekturze, pozwalającej na łatwe utrzymanie i rozbudowę, wykorzystując różne metody tworzenia interfejsów użytkownika.
  • Kompetencje społeczne: Student rozumie dynamiczny rozwój technologii mobilnych oraz konieczność ciągłego aktualizowania wiedzy w tym obszarze.

Tematyka wykładów

  • Wprowadzenie do składni, system typów, wyrażeń, operatorów i funkcji języka Kotlin
  • Klasy i interfejsy w języku Kotlin (składnia, dziedziczenie, metody rozszerzające)
  • Metody tworzenia interfejsu użytkownika w systemie Android
  • Nawigacja w aplikacji (graf nawigacji, przechodzenie po grafie, przekazywanie parametrów)
  • Asynchroniczne programowanie w Kotlinie (współprogramy)
  • Architektura aplikacji (zarządzanie stanem, obsługa cyklu życia, wiązanie widoków i danych)
  • Przechowywanie danych
  • Zarządzanie działaniem zadań w tle
  • Wstrzykiwanie zależności w systemie Android
  • Tworzenie testów aplikacji mobilnych

Zalecana literatura

  • Efektywny Kotlin: najlepsze praktyki, Marcin Moskała, przekład: Tomasz Walczak, Gliwice, Helion, 2021
  • Kickstart Modern Android Development with Jetpack and Kotlin, Catalin Ghita, Packt Publishing, 2022
  • Inne materiały dostępne na stronach internetowych kotlinlang.org/ i developer.android.com

Język Kotlin

  • Kotlin to wieloplatformowy, statycznie typowany język programowania wysokiego poziomu, z wnioskowaniem typów
  • Ma możliwość pełnego współdziałania z Javą
  • Działa na JVM, kompiluje się do JavaScript lub kodu natywnego poprzez LLVM
  • Od Android Studio 3.0 (10/2017) jest alternatywą dla standardowego kompilatora Java

Historia

  • Kotlin został zaprezentowany przez firmę JetBrains w lipcu 2011 r.
  • W lutym 2012 r. projekt Kotlin został udostępniony jako open source na licencji Apache 2
  • Długotrwałą kompatybilność zapewniają wersje od Kotlina 1.0
  • Wsparcie przez Google dla Kotlina na Androidzie ogłoszono podczas Google I/O 2017
  • 2019 r. Kotlin stał się preferowanym językiem dla twórców aplikacji Androidowych
  • Wydane wersje: Kotlin 1.0, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9

Podstawowe typy danych

Kategoria Typy
Całkowite ze znakiem Byte, Short, Int, Long
Całkowite bez znaku UByte, UShort, UInt, ULong
Zmiennoprzecinkowe Float, Double
Logiczne Boolean
Znaki Char
Ciągi znaków String

Podstawowe typy danych (kontynuacja)

  • Any: korzeń hierarchii klas w Kotlinie (wszystkie klasy dziedziczą po Any, podobnie jak w Javie po Object)
  • Unit: typ o pojedynczej wartości - odpowiednik void z Javy.
  • Nothing: typ nie ma instanci; używany do reprezentowania wartości, która nigdy nie istnieje (funkcja zawsze zgłasza wyjątek)

Podstawy składni

  • Zmienna: var a: Int = 1 (typ podaje się po dwukropku, typowanie)
  • Stała: val d = 1 (immutable)
  • Konwersja typów: b=c.toInt()
  • Szablony łańcuchów: "e is $e" (wyrażenia muszą być w klamrach {} po znaku $)
  • Instrukcje sterujące: if, when (odpowiednik switch)
  • Tablice: val arr1 = arrayOf(1, 2, 3) , val arr2 = arrayOfNulls<String>(4), val arr3 = Array(5){i->(i*i).toString()}
  • Zakresy: for (number in 1..3), for (i in 4 downto 1), for (i in 0..8 step 2)

Funkcje

  • Funkcje z pojedynczym wyrażeniem (wypisanie wyrażenia jest powrotem z funkcji) fun sum2(x: Int, y: Int) = x + y
  • Parametry domyślne fun printMessageWithPrefix(message: String, prefix: String = "Info")
  • Lambda ({ text: String -> text.uppercase() }("hello"))
  • Wyrażenia lambda z parametrami i bez, przypisywanie lambd do zmiennych

Wyrażenia lambda

  • Sposób definiowania funkcji anonimowych w języku Kotlin
  • Możemy je używać do przekazywania funkcji jako parametrów do innych funkcji.
  • W Kotlinie lambdy są często używane w połączeniu z operacjami na kolekcjach (np. filtrowanie, mapowanie)

Klasy

  • Konstruktor główny: class Customer
  • Konstruktory dodatkowe (instrukcje init): class Customer2
  • Inicjalizacja właściwości: val firstNameProp: String = firstName.also(::println)
  • Właściwości z domyślnymi wartościami: var email: String = "[email protected]"
  • Inny typ konstruktorów (główny i dodatkowe) class Person(val name: String)

Klasy - widoczność

  • public: widoczne wszędzie
  • private: widoczne tylko w pliku zawierającym deklarację
  • internal: widoczne w całym module
  • protected: widoczne w klasie i jej podklasach

Klasy - dziedziczenie

  • open class Base: możliwość dziedziczenia
  • class Derived(p: Int) : Base(p): dziedziczenie z definicją bazowego konstruktora

Klasy danych

  • data class User(val name: String, val id: Int): automatyczne generowanie metod toString(), equals(), hashCode(), copy(), componentN()

Obiekty towarzyszące

  • companion object Factory (klasa towarzysząca)

Delegacja interfejsów

  • Umożliwia użycie składowych innego obiektu w klasie
  • class Derived(b: Base) : Base by b

Delegacja właściwości

  • Służy do implementacji właściwości w inny sposób niż za pomocą pól
  • Umożliwia użycie metody getValue() i setValue().

Null safety

  • Unikanie wartości null w zmiennych typu String?
  • Operator ?. (safe call)
  • Operator ?: (Elvis operator)

Operatory porównania

  • Równość strukturalna == (analogiczny do equals) i !=

Kolekcje

  • Typy kolekcji (zbiory, listy, mapy)
  • Operacje na kolekcjach
  • Interfejsy kolekcji

Listy

  • Tworzenie list
  • Przejrzywanie list
  • Porównywanie list
  • Modyfikacja list

Zbiory

  • Tworzenie zbiorów
  • Operacje na zbiorach

Mapy

  • Tworzenie map
  • Operacje na mapach (dodawanie, usuwanie, szukanie)

Operacje na kolekcjach (kontynuacja)

  • filtrowanie, transformacje, operacje agregujące
  • mapowanie, zip, asocjacje, spłaszczanie
  • sprawdzanie spełniania warunków (any(), none(), all())
  • podział (partition), grupowanie (groupBy)
  • wycinanie (slice, take, drop)
  • agregacja (minOrNull, maxOrNull, average, sum, count)

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

More Like This

Android Development Overview
8 questions
Android Kotlin Development Overview
45 questions
Android Uygulaması Projesi
15 questions

Android Uygulaması Projesi

DistinctiveCognition4899 avatar
DistinctiveCognition4899
Use Quizgecko on...
Browser
Browser