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{}
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:
Something
-Methode ein Air. $
Type-ArgumentRealisieren 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