Also ich schreibe paintComponent(Graphics g)
Methode und ich am Anfang klar , dass ich es bin Gießen Graphics2D g2 = (Graphics2D) g;
. Ich schrieb diesen Code vor einer Weile und nur erkannte ich keine Ahnung, was das ist. Ich googeln ein wenig , aber Objekt Casting ist mir ein bisschen fremd.
Ein Objektverweis kann Typumwandlung in ein anderes Objekt Bezug. Dies wird als Objekt Gießen.
^^ Wort für Wort aus meinem Lehrbuch von Y. Daniel Liang
Ich verstehe nicht, warum das funktioniert. Graphics
und Graphics2D
sind zwei verschiedene Objekte wie könnten sie Instanzvariablen und Methoden von jeder-andere erben? Offensichtlich ist mir bewusst primitiv Casting dh Verbreiterung und Verengung. Das macht Sinn , da sie nur Wrapper - Klassen von Integer, Double, Byte etc sind ...
Mit Gießen geschieht kein Objekt Konvertierung oder Umwandlung jeglicher Art. Man stelle sich vor Sie die folgende Klassenstruktur haben:
class Mammal { }
class Human extends Mammal { }
class Dog extends Mammal { }
Nun , wenn Sie eine neue Instanz des Menschen mit schaffen , Human human = new Human();
dass auch ein Säugetiere, richtig? So könnte man eine Methode , wie schreiben:
public void doSoemthing(Mammal mammal) {
if (mammal instanceof Human) {
Human human = (Human) mammal;
human.doWork();
} else if (mammal instanceof Dog) {
Dog dog = (Dog) mammal;
dog.bark();
}
}
und Aufrufen der Methode, wie:
doSomething(new Human());
So Ihre Methode , jede Art von Säugetier als Eingabeparameter und in Ihrer Methode nehmen Sie , was es wirklich Art von Säugetier überprüfen ist. Also , wenn Sie einen Pass new Human()
als Eingang, wird das tatsächliche Art des Objekts Mensch. Der Grund , weil Sie einen Menschen auf ein Verfahren passieren können ein Säugetier erwarten ist , weil Vererbung. Also , was Ihre Methode wird wissen , ist , dass die Eingangsparameter auf jeden Fall ein Säugetier ist. Aber es kann jede Art von Säugetier sein. Wenn Sie wissen wollen , was tatsächlicher Typ ist das Objekts ist , dass Sie verwenden können , instanceof
zum Beispiel. Und in dieser Zeile:
Human human = (Human) mammal;
bedeutet nicht, dass Sie das Säugetier Eingabeparameter konvertieren. Es bedeutet nur, dass Sie von nun an den Eingabeparameter als Mensch verwenden möchten. Und Sie können das tun, denn mit dem isntanceof Sie überprüfen, ob es wirklich ein Mensch. Man könnte auch so etwas tun:
public void doExample2(Object input) {
if (input instanceof Integer) {
System.out.println("I am a number");
} else if (input instanceof Graphics) {
System.out.println("I am a Graphics");
}
}
Beachten Sie die Art des teh Eingabeparameter. Gegenstand ist die Basisklasse von allem.
So zu Ihrem Szenario immer wieder. Sie tun das Gießen, weil aus dem Kontext der Anwendung der Eingangsparameter werden immer ein Graphics2D sein, und das ist, warum Sie das Casting tun, und auch die Methoden von Graphics2D zu verwenden.