Gibt es in Kotlin auch eine Superklasse wie in Java?

  • Antworten:18
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 671

20.01.2019, 23:22:42 via Website

Hallo
Ich habe mit den Gundlagen von Kotlin angefangen. Java kann ich einigermaßen.

So zu meiner Frage gibt es in Kotlin auch eine Superklasse wie in Java?
Bei den Beispielen die ich bis jetzt angesehen habe wurde bei einer abgeleiteten Klasse und überschriebenen Methode nie die superklasse aufgerufen. Gibt es die in Kotlin nicht? Oder wie geht das?

Ich bedanke mich schon mal im voraus. Jörg

— geändert am 21.01.2019, 11:25:09 durch Moderator

Diskutiere mit!
  • Forum-Beiträge: 671

20.01.2019, 23:49:11 via Website

Sorry für die Frage habe ein einfaches Projekt in As erstellt ,und sehe nun wie es geht , ist wie bei Java auch.
Konnte eigentlich auch nicht sein. Werde mir wohl doch ein Buch Kaufen.
Das Tutorial was ich als erstes ausgewählt habe war wohl nicht so gut.
Danke Trost dem für die Hilfe. Werde bei dem Thema bestimmt noch auf einige Fragen mehr Stoßen.
Sorry das ich so Schell einen Thread aufgemacht habe ohne richtig Nachgedacht zu haben.

Lg Jörg.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.264

21.01.2019, 10:48:17 via Website

Auch wenn es etwas spät kommt: Der Super-Aufruf funktioniert genau so wie in Java.
Was anders ist, ist allerdings der Zugriff auf "this" der outer-class aus einer inner-class heraus.
In Kotlin ist es "this@outer-class"

 bottom_nav_view.apply {
        setNavigationItemSelectedListener(this@MainActivity)
 }
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 671

21.01.2019, 12:35:49 via Website

Hallo @Rafael

was macht eigentlich das "use" in Kotlin könntest du das mir bitte erkären.
Zb hier
GZIPInputStream(content.inputStream()).bufferedReader(UTF_8).use { it.readText() }
das das am ende ein Lambda ist ist mir schon Klar nur wo ist da der Pfeil -> ?

— geändert am 21.01.2019, 12:38:36

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.264

21.01.2019, 13:01:36 via Website

Wenn es nur einen Parameter im Lambda gibt, dann kann man den auch weglassen, weil er implizit ist.
Wenn du es mit einem Umbruch schreibst, zeigt dir Android Studio an, wie es in diesem konkreten Kontext heißt.

Hier z.B. ist es "this". Bei .let{} ist es aber z.B. "it"
image

Wenn man den Parameter in dem Fall umbenennen möchte, kann man ihn aber explizit hinschreiben:
Beispiel:

 activity?.let { myVarName ->
        flow.showSettings(myVarName) 
 }

myVarName ist dann die Activity und zwar ohne Fragezeichen, weil sie in dem Kontext nicht null sein kann und auf non-null ge-smart-casted wurde.

— geändert am 21.01.2019, 13:02:57

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 671

21.01.2019, 13:05:12 via Website

ja das ist Ok nur was macht das use

it kenne ich auch, aber use nicht. Was macht diese Methode

— geändert am 21.01.2019, 13:07:44

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.264

21.01.2019, 13:10:12 via Website

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.html

"Executes the given block function on this resource and then closes it down correctly whether an exception is thrown or not."

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 671

21.01.2019, 13:27:11 via Website

also heißt das das der komplette Ausdruck vor dem Lambda als Parameter für das Lambda benutzt wird.

Ist also zum abschließen einer Blockfunktion (das aneinander hängen mit dem Punkt Operator). Beendet somit den Block auch wenn es eine Exception gibt.

Verstehe das so das das Lambda weiß was sein Parameter ist.

So macht die Code Zeile für mich auch sinn. Gut der sinn war eigentlich auch vorher klar nur wolte ich es richtig verstanden haben und das use kannte ich noch nicht.

Danke

— geändert am 21.01.2019, 13:36:35

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.264

21.01.2019, 13:38:18 via Website

also heißt das das der komplette Ausdruck vor dem Lambda als Parameter für das Lambda benutzt wird.

Es ist eher der Rückgabewert der letzten Anweisung davor.
bufferedReader(UTF-8) liefert einen BufferedReader und der ist im Lambda dann das "it".

Das use ersetzt halt den finally { buf.close() } Block.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 671

21.01.2019, 13:38:56 via Website

Ok jetzt sollte ich es verstanden haben.
Danke

@ Rafael
Welches Buch zu Kotlin würdest du empfehlen? am liebsten in Deutsch.
Für den Anfang

— geändert am 21.01.2019, 13:41:36

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.264

21.01.2019, 14:00:29 via Website

Ich habe zum Glück eine Schulung gehabt und mir danach den Rest in der Praxis immer weiter angeeignet.
Ein Buch dazu habe ich nie gelesen, daher kann ich da leider auch nichts empfehlen.
Vermutlich würde ich mir ein gutes Online Tutorial suchen und das durcharbeiten, danach einfach losprogrammieren und Fragen on-the-fly klären.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 671

22.01.2019, 12:11:26 via Website

Hallo
Erstmal Danke für die bisherige Hilfe. Besonders an @Rafael :)

Beim Lernen stellt sich mir die Frage wie ihr das jetzt mit der Datei und Klassen-Stuckatur macht.
Im Vergleich zu Java wo jede Klasse in einer eigenen Datei sein muss.

Nun ist es in Kotlin nicht mehr zwingend notwendig jede Klasse in eine eigene Datei zuschreiben.
Man könnte den gesamten Code auch in nur eine Datei schreiben.
Wäre natürlich sehr unübersichtlich.
Ginge das in Android auch? Oder ist Notwendig das jede Activity in einer Datei ist?
Ratsam ist es bestimmt auf jeden fall schon wegen der übersicht.
Wie ist das mit Fragmenten könnten die auch in einer Datei sein?

Wie macht oder handhabt ihr das? Weiterhin alles in eigene Datei wie bei Java ?

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.264

22.01.2019, 15:24:03 via Website

Ja in Kotlin ist das nicht mehr so stringent vorgeschrieben.
Man hat schon selbst die Verantwortung da strukturiert zu arbeiten.
In Kotlin kann man ja sogar eine Variable IRGENDWO definieren und sie dann im ganzen Projekt nutzen.
In der Praxis würde ich trotzdem lieber einzelne Dateien für die Klassen anlegen und nur in bestimmten Fällen mehrere in einer Datei deklarieren.
z.B. ganz simple Data-Classes für das Datenmodell. Die sind ja in Kotlin meist Einzeiler.

BTW: In Java kann man auch mehrere Klassen in einer Datei parallel nebeneinander definieren. Ob das guter Stil ist? Doubt! :-)

— geändert am 22.01.2019, 15:25:33

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.027

22.01.2019, 16:34:32 via Website

Zwischenfrage :

In Kotlin kann man ja sogar eine Variable IRGENDWO definieren und sie dann im ganzen Projekt nutzen.

Aber das soll jetzt nicht heissen, wir haben das LifeCycle und GC Problem umgangen.
Oder ?? das bleibt doch gleich .... - also Singleton z.B.

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 671

22.01.2019, 18:53:00 via Website

Nein in Kotlin gibt es ja kein static dafür aber den Top-Level Bereich die dort definierten Variablen sind im ganzen Packet oder Modul sichtbar.
In Kotlin muss auch nicht alles in einer Klasse sein.

in Java kannst du ja auch eine static Klasse mit static Variablen erstellen und diese sind auch im gesamten Packet sichtbar. Auch wenn ich von einer Activity zu anderen gehe.

Um zb. Eine Statische Klassen Variable zu haben kann man eine „compainion objekt“ Fun (Klasse) erstellen der Variablen hinzufügen und somit bekommst du auch eine Statische Singelton Variable .
Wie in Java.

— geändert am 22.01.2019, 20:20:57

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 671

22.01.2019, 20:05:56 via Website

Ich muss leider zugeben das Kotlin doch Spaß macht.(cool)

Habe das bis jetzt immer weggeschoben und wollte da nicht Ran.:(
War wohl noch nicht bereit für Kotlin. :?

Der Anfang ist jetzt auf jeden fall gemacht und ich werde auch weiter machen.
Auch wenn ich immer dreimal um die Ecke denken muss. (lightbulb)
Das wird schon werden.

Danke für die bisherige Hilfe.:)

Ps. Was ich noch nicht heraus gefunden habe ist. Was bedeutet den in der IDE die grauen Striche ( Wellenlinien ) unter manschen Variablen?
Habe die im TopLevel Bereich. Soll es etzwa genau das bedeuten? Mir somit einen Hinweis darauf in der anderen Datei geben?

Ich meine nicht die Schwarzen geraden Striche was für mich ein Hinweis ist.

— geändert am 22.01.2019, 20:47:10

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.264

23.01.2019, 08:50:51 via Website

Ich muss leider zugeben das Kotlin doch Spaß macht.(cool)

Haha :-D Ja ne? Man kann viele Sachen einfach so simple lösen.
Allein das Filtern von Listen ist ein Traum.
Umgang mit Extras/Arguments für Activities und Fragments...I love it.
Wenn Interesse besteht, kann ich gerne mal ein paar Snippets posten, von Sachen, die mir ganz besonders elegant erscheinen.

Ps. Was ich noch nicht heraus gefunden habe ist. Was bedeutet den in der IDE die grauen Striche ( Wellenlinien ) unter manschen Variablen?

Setz den Cursor doch mal da rein und drück Alt-Enter.
Meist ist der Quick-Fix genau das was du suchst.
Die graue Linie bedeutet ein Hinweis, wie man es mit Kotlin Schreibweise besser machen kann. Meist sehe ich das, wenn ich einen getter aufrufe, statt die property Notation zu schreiben.

Also activity.getArguments() statt wie in Kotlin üblich activity.arguments

— geändert am 23.01.2019, 08:51:15

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 671

23.01.2019, 09:58:39 via Website

Rafael Ja gern kannst du da was Posten . Lernen gerne was dazu bin ja noch am Anfang mit Kotlin.

Da wäre wohl ein neuer aussagekräftiger Thread besser. Das Interessiert bestimmt auch andere User.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.264

23.01.2019, 10:16:34 via Website

Hier mal 2 Beispiele zur Übergabe von Werten an ein Fragment, was in Java immer in ein Mega Konstrukt ausartet, weil man da Bundle vorher instanzieren muss. Das geht in Kotlin alles inline

companion object {
        private const val EXTRA_ID = "EXTRA_ID"

        fun newInstance(id: Int) = ItemFragment().apply {
            arguments = Bundle().apply {
                putInt(EXTRA_ID, id)
            }
        }
    }

Das Auslesen kann man dann über ein lazy-property machen (wird beim ersten Zugriff ausgewertet)

private val itemId: Int by lazy {
        arguments?.getInt(EXTRA_ID) ?: throw IllegalArgumentException("$EXTRA_ID must not be null!")
    }

Das geile ist... das enthält schon die Prüfung auf arguments != null und stellt sicher, dass der Wert gesetzt ist, sonst gibt es eine Exception.

— geändert am 23.01.2019, 10:26:58

Hilfreich?
Diskutiere mit!
Empfohlene Artikel