Java: statische vs innerlijke klasse

Wat is het verschil tussen statische en niet-statische geneste klasse?


Antwoord 1, autoriteit 100%

Een innerlijke klasse, per definitie, kan niet statisch zijn , dus ik ga je vraag herschikken als “Wat is het verschil tussen statische en niet-statische geneste klassen?”

Een niet-statische geneste klasse heeft volledige toegang tot de leden van de klasse waarin deze is genest. Een statische geneste klasse heeft geen verwijzing naar een geneste instantie, dus een statische geneste klasse kan geen niet-statische methoden aanroepen of toegang krijgen tot niet-statische velden van een instantie van de klasse waarin deze is genest.


Antwoord 2, autoriteit 24%

Laten we eens kijken in de bron van wijsheid voor dergelijke vragen: Joshua Bloch’s Effective Java:

Technisch gezien bestaat er niet zoiets als een statische innerlijke klasse. Volgens Effectieve Javais de juiste terminologie een statische geneste klasse. Een niet-statische geneste klasse is inderdaad een innerlijke klasse, samen met anonieme klassen en lokale klassen.

En nu om te citeren:

Elke instantie van een niet-statische genesteklasse is impliciet geassocieerd
met een omsluitende instantievan zijn bevattende klasse… Het is mogelijk
om methoden aan te roepen op de omsluitende instantie.

Een statische geneste klasse heeft geen toegang tot de omsluitende instantie. Het neemt ook minder ruimte in beslag.


Antwoord 3, autoriteit 12%

Er zijn twee verschillen tussen statische innerlijke en niet-statische innerlijke klassen.

  1. In het geval van het declareren van lidvelden en methoden, niet-statisch
    innerlijke klasse kan geen statische velden en methoden hebben.
    Maar in het geval van een statische innerlijke klasse, kan het statische en niet-statische velden hebben
    en methode.

  2. De instantie van niet-statische innerlijke klasse wordt gemaakt met de referentie
    van het object van de buitenste klasse, waarin het heeft gedefinieerd, dit betekent dat het heeft
    bijgevoegde instantie. Maar het voorbeeld van statische innerlijke klasse is
    gemaakt zonder de verwijzing naar de buitenste klasse, wat betekent dat dit het geval is
    geen omsluitende instantie hebben.

Zie dit voorbeeld

class A
{
    class B
    {
        // static int x; not allowed here
    }
    static class C
    {
        static int x; // allowed here
    }
}
class Test
{
    public static void main(String… str)
    {
        A a = new A();
        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 
        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}

Antwoord 4, autoriteit 3%

  1. Statische innerlijke klasse heeft geen toegang tot niet-statische leden van omsluitende klasse. Het heeft directe toegang tot statische leden (instantieveld en methoden) van omsluitende klasse, hetzelfde als de procedurele stijl om waarde te krijgen zonder een object te maken.

  2. Statische innerlijke klasse kan zowel statische als niet-statische leden declareren. De statische methoden hebben toegang tot statische leden van de hoofdklasse. Het heeft echter geen toegang tot niet-statische leden van de innerlijke klasse. Om toegang te krijgen tot leden van een niet-statische innerlijke klasse, moet het een object van een niet-statische innerlijke klasse maken.

  3. Niet-statische innerlijke klasse kan geen statische veld- en statische methoden declareren. Het moet worden gedeclareerd in statische typen of typen op het hoogste niveau. U krijgt deze foutmelding als u dit doet en zegt “statische velden worden alleen gedeclareerd in statische of typen op het hoogste niveau”.

  4. Niet-statische innerlijke klasse heeft toegang tot zowel statische als niet-statische leden van omsluitende klasse in procedurele stijl om waarde te verkrijgen, maar heeft geen toegang tot leden van statische innerlijke klasse.

  5. De omsluitende klasse heeft geen toegang tot leden van innerlijke klassen totdat het een object van innerlijke klassen heeft gemaakt. ALS de hoofdklasse toegang heeft tot leden van een niet-statische klasse, kan het een object van een niet-statische innerlijke klasse maken.

  6. Als de hoofdklasse toegang heeft tot leden van de statische binnenklasse, heeft deze twee gevallen:

    • Geval 1: Voor statische leden kan het de klassenaam van de statische innerlijke klasse gebruiken
    • Geval 2: Voor niet-statische leden kan het een instantie van een statische innerlijke klasse creëren.

Antwoord 5, autoriteit 2%

Bespreek genesteklassen…

Het verschil is dat een geneste klassedeclaratie die ook statisch is, kan worden geïnstantieerd buiten de omsluitende klasse.

Als je een geneste klassedeclaratie hebt die niet statischis, laat Java je deze niet instantiëren, behalve via de omsluitende klasse. Het object dat is gemaakt met de inner class is gekoppeld aan het object dat is gemaakt vanuit de outer class, zodat de inner class kan verwijzen naar de velden van de outer.

Maar als het statischis, bestaat de link niet, zijn de buitenste velden niet toegankelijk (behalve via een gewone verwijzing zoals elk ander object) en kun je daarom de geneste klasse zelf instantiëren.


Antwoord 6

statische innerlijke klasse: kan statisch & niet-statische leden, maar hebben alleen toegang tot statische leden van de bovenliggende klasse.

niet-statische binnenklasse: kan alleen niet-statische leden declareren, maar heeft toegang tot statische en niet-statische leden van de bovenliggende klasse.


Antwoord 7

Een innerlijke klasse kan niet statisch zijn, dus ik ga je vraag herschikken als “Wat is het verschil tussen statische en niet-statische geneste klassen?”.

zoals je hier al zei innerlijke klasse kan niet statisch zijn… ik vond de onderstaande code die statisch wordt gegeven….reden? of wat juist is….

Ja, er is niets in de semantiek van een statisch genest type dat u daarvan zou weerhouden. Dit fragment werkt prima.

   public class MultipleInner {
        static class Inner {
        }   
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Inner();
        }
    }
}

dit is een code die op deze website is geplaatst…

voor de vraag —> Kan een statische geneste klasse meerdere keren worden geïnstantieerd?

antwoord was—>

Natuurlijk kan het geneste type zijn eigen instantiecontrole uitvoeren (bijvoorbeeld privéconstructors, singletonpatroon, enz.), maar dat heeft niets te maken met het feit dat het een genest type is. En als het geneste type een statische opsomming is, kun je het natuurlijk helemaal niet instantiëren.

Maar in het algemeen, ja, een statisch genest type kan meerdere keren worden geïnstantieerd.

Merk op dat technisch gezien een statisch genest type geen “innerlijk” type is.


Antwoord 8

Een statische geneste klasse werkt net als elke andere klasse op het hoogste niveau samen met de instantieleden van zijn buitenste klasse (en andere klassen). In feite is een statisch geneste klasse gedragsmatig een klasse op het hoogste niveau die is genest in een andere klasse op het hoogste niveau voor het gemak van de verpakking.

Other episodes