Warum Java die letzte Klasse A zulässt {abstrakte Klasse B {}}

In Java wird entschieden, dass eine Klasse mit einer abstrakten Methode immer eine abstrakte Klasse (oder Schnittstelle) ist. ** Eine Klasse mit einer abstrakten inneren Klasse kann jedoch eine konkrete Klasse sein.

Der folgende Code ist beispielsweise ausführbar.

java


final class A
{
    static abstract class B{String str="hoge";}
}

public class Main
{
    public static void main(String...args)
    {
        System.out.println(new A_B().str);
      //System.out.println(new A.B(){}.str); (Anonyme Klasse)Aber es ist gut
    }
} 

class A_B extends A.B{}

Wenn die konkrete Klasse keine abstrakte innere Klasse hat

Obwohl dies eine scheinbar widersprüchliche Annahme ist, betrachten Sie den Fall, in dem Sie die Diversität im Makro (als Ganzes) nicht erkennen möchten, aber die Diversität im Mikro (Details) erkennen möchten.

Solche Annahmen sind nützlich, wenn die Beziehung zwischen Mikro und Makro betrachtet wird, beispielsweise die statistische Dynamik.

Angenommen, Sie erstellen eine "Luft" -Klasse und eine "Molekül" -Klasse (Molekülklasse).

Man kann sagen, dass "Luft" ein "Molekül" hat, weil sich die Moleküle sammeln, um Luft zu erzeugen.

Verschiedene Moleküle wie Wasserstoffmoleküle, Wassermoleküle, Kohlendioxidmoleküle usw. können in Betracht gezogen werden. Deshalb, H2 extends Molecule, H2O extends Molecule, CO2 extends Molecule Während es so geerbt und verwendet wird, gibt es kein Molekül, das "bloßes Molekül" genannt wird, daher denke ich nicht, dass es verwendet wird, ohne es zu erben. "Molekül" ist also wahrscheinlich eine abstrakte Klasse.

Andererseits möchte ich es nicht zu einer abstrakten Klasse machen, weil es schwierig ist, untergeordnete Konzepte in "Luft" zu finden.

Wenn Sie hier eine Methode in ** Molecule definieren möchten, die nur von Air ** aufgerufen werden soll, was wäre wenn?

Normalerweise kann es gelöst werden, indem "Molekül" zur inneren Klasse von "Luft" gemacht wird. Wenn die konkrete Klasse "Air" nicht die abstrakte Klasse "Molecule" enthält, müssen Sie wahrscheinlich die folgenden mühsamen Dinge tun:

  1. Haben Sie die letzte öffentliche statische Klasse $ {private $ () {}} in Air
  2. Geben Sie der Something -Methode ein Air. $ Type-Argument

Realisieren mit.

Da der Typ "Air. $" "Public static" ist und nicht von "Air" aus gesehen werden kann, kann er als formaler Argumenttyp für andere Methoden als "Air" verwendet werden. Da sein Konstruktor jedoch "privat" ist, kann die Instanziierung nur über "Luft" erfolgen. Anders als "Luft" können Sie also kein tatsächliches Argument vom Typ "Luft" übergeben. $ ".

Dank dessen wird "wenn die Methode einen" Air "-Typ als formales Argument hat, diese Methode kann nur aus der" Air "-Klasse aufgerufen werden.

Ein Beispiel ist unten gezeigt.

python


public class Test2 {

	public static void main(String[] args) 
	{

        //new H2O.only_for_air(new Air.$());Ist ein Zugriffsberechtigungsfehler. Mit anderen Worten, nur aus der Luft_for_Ich kann keine Luft anrufen
		new Air().molecule_caller(new H2O());//Kann aus der Luft angerufen werden

	}

}



class Air
{
	final public static class ${private $(){}}//Finalisiert, weil es ein Problem wäre, selbst wenn es in der Kinderklasse von Air umgeschrieben würde
	
	void molecule_caller(Molecule m)
	{
		new H2O().only_for_air(new Air.$());
	}
	
	
}

abstract class Molecule
{
	void only_for_air(Air.$ $)
	{
		System.out.println("succeeded");
	}
}


class H2O extends Molecule{}

Nun, ich muss so eine mühsame Sache machen.

Also fragte ich mich, ob "eine konkrete Klasse mit einer abstrakten inneren Klasse" in Java möglich wäre.

Recommended Posts

Warum Java die letzte Klasse A zulässt {abstrakte Klasse B {}}
Java (abstrakte Klasse)
[Java] Abstrakte Klasse
Warum nennt Java eine Datei eine Klasse?
Über die abstrakte Klasse von Java
Java-Lernnotiz (abstrakte Klasse)
Warum eine abstrakte Klasse implementieren (Abstract)
Warum werden Klassenvariablen benötigt? [Java]
Was ist eine Klasse in der Java-Sprache (3 /?)
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist eine Klasse in der Java-Sprache (2 /?)
Java Basic Learning Content 6 (Vererbung / Abstrakte Klasse / Schnittstelle)
So konvertieren Sie einen Soliditätsvertrag in eine Java-Vertragsklasse
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Java-Klassenmethoden
Java-Scanner-Klasse
Java HashMap-Klasse
[Java] Verschachtelte Klasse
Anonyme Java-Klasse
Über die Java-Klasse
[Java] Objektklasse
Lokale Java-Klasse
Java Final Modifier
Schreiben einer Klasse, die in Java bestellt werden kann Ein kleines Standard-Memo
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Verwendung von Abstract Class und Interface in Java richtig