tifyty

pure Java, what else ?

Egyszerű öröklődés

Itt van egy egyszerű kis Java fájl, három osztály van benne, abból is az egyik csak a szokásos, és jól ismert public static main.

package com.liffity;

class A {
	String a = "Noah";
	public A(String n) {
		a = n;
	}
}

class B extends A {
	String b = "Nobh";

	public B(String n) {
		b = n;
	}
}

class test {
	public static void main(String a[]) {
		B b = new B("ark");
		System.out.println(b.b);
	}
}

Nosza fordítsuk le:

$ mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------
[INFO] Building inheritsample 1.0-SNAPSHOT
[INFO] ----------------------

       itt kitöröltem sorokat, nem lényegesek
	 
[INFO] ----------------------
[ERROR] COMPILATION ERROR :
[INFO] ----------------------
[ERROR] /.../inheritsample/src/main/java/com/liffity/Inheritance.java:[13,20] error: constructor A in class A cannot be applied to given types;
[INFO] 1 error
...

Mi itt a gond?

Csupán annyi, hogy amikor létre akarjuk hozni a B osztály egy példányát, akkor a JVM automatikusan meg szeretné majd hívni a kiterjesztett A osztály default konstruktorát. Ez nem lenne baj, ha lenne. De nincs, és ezt már a fordító észreveszi.

Ha a Java kód 7. és 8. sora közé beszúrjuk, hogy

7.5   public A(){}

akkor mindjárt

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.836s
[INFO] Finished at: Thu Jul 05 13:46:32 CEST 2012
[INFO] Final Memory: 10M/144M
[INFO] ------------------------------------------------------------------------

De miért akarja meghívni a default konstruktort? Csak azért, mert valamit meg kell hívni, különben nem lehet használni az A osztályt, illetve a B-t, ami az A-nak a kiterjesztése. Ahhoz, hogy a B létrejöjjön le kell, hogy fussanak a konstruktorok, nem csak a B-ben, hanem előtte a kiterjesztett osztályokban is. De persze nem kell, hogy az a default konstruktor legyen. Lehet az másik konstruktor is. Például

class B extends A {
    String b = "Nobh";
 
    public B(String n) {
        super(n);
        b = n;
    }
}

Ha úgy rendelkezünk, hogy azt a konstruktort hívjuk meg, amelyiknek van egy String argumentuma, akkor a default-ot már nem akarja meghívni a Java. Ami szerencse is, mert az ugye nincs. Persze lehetne olyan okos, hogy kitalálja, hogy melyik konstruktort akarjuk meghívni, hiszen csak egy van, de akkor még azt is ki kellene találnia, hogy annak mi legyen az argumentuma. Ott pedig még a Java fordító, és a mesterséges intelligencia nem tart, hogy helyettünk programozzon. Ami megint csak szerencse, mert ha ott tartana, akkor nem lenne munkánk.

4 responses to “Egyszerű öröklődés

  1. István Verhás (@verhasi) július 9, 2012 11:59 de.

    Ha a java nem is de a Groovy abba az irányba tart. A nemrég megjelent Groovy 2.0-ban már van static checking amitől egy kicsit java-sabb lesz hiszen fordítási időben szól ha gondja van, de ha egy if ben instance of -al ellenőrizzük egy Object-t, hogy melyik Class valójában akkor az if-en belül nem kell cast-olnunk azt ő kitalálja, hogy úgyis azt akarjuk.
    http://www.infoq.com/articles/new-groovy-20

  2. István Verhás (@verhasi) július 9, 2012 12:08 du.

    “…meg szeretné majd hívni a kiterjesztett A osztály default konstruktorát. Ez nem lenne baj, ha lenne. De nincs,…” és azért nincs mert csináltál neki egy nem default konstruktort, ha nem csináltál volna, akkor lenne. Tisztára mint a “lesz sör, diszkó, lámpa meg csaj. Ha eső lesz nem lesz, ha nem lesz lesz.”

  3. leningrad július 17, 2012 12:09 de.

    Ebbol a szempontbol tiszta C++ 🙂 Kiveve h ott mar a konstruktor inicializalo listaba bele kene tenni A(n)-t, mert a {-re mar meg kell konstrualodnia az ososztalynak. Erdekes h itt eleg a konstruktor belsejeben.

  4. István Benedek augusztus 4, 2012 10:08 du.

    ezt pont szeretem a javaban…

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: