Java: Miért kell, hogy írja leadott instanceof () in egyenlő ()? Ez az utalás vagy kevesebb kódot?

szavazat
0

Java kezdő itt, van egy alapvető kérdés, hogy a fél válaszol a korábbi válaszok más szálak vagy a dokumentációban, de még mindig nem teljesen értem a mechanizmust, és azt akarom, hogy biztos legyek benne, magában foglalja az alapjait (kód alján, kérdéseket középső).

Alapvetően én felülírva az egyenlő () metódus, hogy ellenőrizze, ha a két MyDate objektum azonos időpontban. Én egy instanceof ellenőrzést, ha az o objektum egy MyDate objektumot, majd begépelt leadott egy temp tárgy kifejezetten a MyDate objektumot o, akkor össze dátumokat. Miért begépelt leadott temp változót MyDate osztálya o, ha már van a MyDate osztály?

  1. Használnak temp változót könnyebb hivatkozás kívánt objektumot futtatni az egyenlőségjel () összehasonlítás? Mivel használja egyenlő (), mint összehasonlítva MyDate.equals(MyOtherDate), a kódot, ha nem jelöl változó, hogy tartsa a referencia, akkor kap a különböző hibák (temp nem lehet megoldani, mint egy változó, típus hibás stb alapvetően a fordító nem tudja, hol a megjelenés, ha nem ír egy csomó több kódot).

2a. Néhány más szálak mondott valamit a hatása, hogy miközben instanceof ellenőrzi, hogy egy példány van egy osztály, akkor ellenőrzi a bázis osztály, de nem ellenőrzi alosztálya. Ugye a typecasting mert te kifejezetten mondja a fordító, hogy ellenőrizze, hogy a tárgy (típus casting egy általános tárgy egy adott objektum). Megjegyzés: Ez lehet egy verzió és íz adott típusú kérdés, láttam különböző választ hasonló kérdésekre.

2b. Casting megváltoztatja a referencia, nem maga a tárgy. Tehát, ha a tárgyak az azonos osztályba tartozó, de különböző alosztályok, ugye nem a futás helyett fordításkor. És nem kapok ClassCastException?

public boolean equals(Object o) {
            if (o instanceof MyDate) {
                MyDate temp = (MyDate) o;
                if ((temp.day == day) && (temp.month == month) && (temp.year == year)) {
                    return true;
                }
            } 
            return false;
        }
A kérdést 14/01/2020 00:01
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

A Java fordító nem érti a típusú osztály a tárgy „o”, mint MyDate. Ez történik, mert már kapott egy paraméter típusú objektum így fogják olvasni, mint egy tárgy. Annak érdekében, hogy hozzáférjen a módszerek és tulajdonságait a paraméter ismert típusú MyDate, meg kell mondani a fordító, hogy ez egy objektum típusú MyDate. Ez az út a fordító fogja megérteni, hogy mit csinálsz. Most vessünk egy pillantást egy másik nézet elől.

Minden típusú Java kiterjeszti a típus Object, amely azt jelenti, hogy minden alkalommal, amikor írsz egy osztály, akkor hallgatólagosan meghosszabbításáról Objectnyilvános / védett tulajdonságok és viselkedések. Ezért van az „kényszerítő” módszer equals, amely tartozik a Objecttípus. Rendben, ha csinálsz egy összehasonlítást két tárgy között akkor először ellenőrizze, hogy mindketten ugyanabban a típusú, mint te a példát: if (o instanceof MyDate) { ... }annak biztosítása, hogy oa típusa MyDate. De ezen a ponton, mivel ha nem öntött „o”, hogy „MyDate” írja akkor nem lesz képes hozzáférni MyDate sajátos tulajdonságait és módszereket. Tehát gondolom, hogy egy darabig, ha van egy osztály A, amely kiterjeszti az osztályomban Bén lesz elérhető a B nyilvános módszerek és tulajdonságok belsejében, de nem tudom ugyanezt a B, mert B nem lehet látni, mi történik lent a fa. Tudsz követni?

Hope tudnék válaszolni kétségek.

Válaszolt 14/01/2020 00:16
a forrás felhasználó

szavazat
2

Java két rokon, de-külön fogalom: a típus egy kifejezést , és a futási típusú egy értéket .

Ezek a fogalmak kompatibilisek bizonyos mértékig; Ha a kifejezés olyan típusú MyDate, majd amikor értékeli ezt a kifejezést, akkor sem kap egy hivatkozás egy tárgy, amelynek runtime-típus vagy MyDate, vagy egy alosztálya MyDate, vagy kapsz egy null referencia, vagy kapsz egy kivétel vagy végtelen hurok vagy miegymás. De a fogalmak külön, és akkor is, ha a futási-típusok finom, néha meg kell adni a fordítóprogram néhány extra információt a típusokat.

> Miért begépelt leadott temp változót MyDate osztálya o, ha már van a MyDate osztály?

A változó oa típusa Object, nem soha típusú MyDate. Ez történik, hogy tartalmaz egy hivatkozást egy tárgy, amelynek futásidejű-típusú MyDate(vagy egy alosztálya MyDate), de ez nem befolyásolja a típusát o. Így írunk (MyDate)o, hogy hozzon létre egy kifejezés ugyanazt az értéket (és így az azonos futási típus), valamint a kívánt típust.

Ha a fordító volt okosabb, akkor talán kezelni o, mint amelyek típus MyDatebelsejében if-statement, így azt nem kell a leadott; de a jelenlegi Java Specification Language nem teszi lehetővé. (És ha mégis, hogy volna valami furcsa következményei, amikor a statikus módszer feladás.)

Válaszolt 14/01/2020 00:21
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more