Sök…


Syntax

  • public typnamn [= värde];
  • privat typ namn [= värde];
  • skyddat typnamn [= värde];
  • typnamn [= värde];
  • offentligt klassnamn {
  • klassnamn{

Anmärkningar

Från Java-handledning :

Åtkomstnivåmodifierare avgör om andra klasser kan använda ett visst fält eller åberopa en viss metod. Det finns två nivåer av åtkomstkontroll:

  • På den översta nivån - public eller paket-privat (ingen uttrycklig modifierare).
  • På medlemsnivå - public , private , protected eller paket-privat (ingen uttrycklig modifierare).

En klass kan förklaras med modifieraren public , i vilket fall den klassen är synlig för alla klasser överallt. Om en klass inte har någon modifierare (standard, även känd som paket-privat ), är den endast synlig i sitt eget paket.

På medlemsnivå kan du också använda den public modifieraren eller ingen modifierare ( paket-privat ) precis som på toppnivåklasser och med samma mening. För medlemmar finns det ytterligare två åtkomstmodifierare: private och protected . Den private modifieraren anger att medlemmen bara kan nås i sin egen klass. Den protected modifieraren anger att medlemmen endast kan nås inom sitt eget paket (som med paket-privat ) och dessutom av en underklass i sin klass i ett annat paket.

Följande tabell visar åtkomst till medlemmar som tillåts av varje modifierare.

Åtkomstnivåer:

modifier Klass Paket Underklass Värld
public Y Y Y Y
protected Y Y Y N
ingen modifierare Y Y N N
private Y N N N

Gränssnittsmedlemmar

public interface MyInterface {
    public void foo();
    int bar();

    public String TEXT = "Hello";
    int ANSWER = 42;

    public class X {
    }

    class Y {
    }
}

Gränssnittsmedlemmar har alltid allmän synlighet, även om det public sökordet utelämnas. Så både foo() , bar() , TEXT , ANSWER , X och Y har allmän synlighet. Åtkomst kan dock fortfarande begränsas av det innehållande gränssnittet - eftersom MyInterface har allmän synlighet kan dess medlemmar nås var som helst, men om MyInterface hade haft paketets synlighet, hade medlemmarna bara varit tillgängliga från samma paket.

Allmän synlighet

Synlig för klassen, paketet och underklassen.

Låt oss se ett exempel med klassen Test.

public class Test{
    public int number = 2;

    public Test(){

    }
}

Låt oss nu försöka skapa en instans av klassen. I det här exemplet kan vi få åtkomst till number eftersom det är public .

public class Other{
    
    public static void main(String[] args){
        Test t = new Test();
        System.out.println(t.number);
    }

}

Privat synlighet

private synlighet gör att en variabel endast kan nås av sin klass. De används ofta i samband med public brev och bosättare.

class SomeClass {
    private int variable;

    public int getVariable() {
        return variable;
    }

    public void setVariable(int variable) {
        this.variable = variable;
    }
}

public class SomeOtherClass {
    public static void main(String[] args) {
        SomeClass sc = new SomeClass();
        
        // These statement won't compile because SomeClass#variable is private:
        sc.variable = 7;
        System.out.println(sc.variable);

        // Instead, you should use the public getter and setter:
        sc.setVariable(7);
        System.out.println(sc.getVariable());
    }
}

Paketets synlighet

Utan modifierare är paketets synlighet standard. Från Java-dokumentationen indikerar "[paketets synlighet] om klasser i samma paket som klassen (oavsett parentage) har tillgång till medlemmen." I det här exemplet från javax.swing ,

package javax.swing;
public abstract class JComponent extends Container … {
    …
    static boolean DEBUG_GRAPHICS_LOADED;
    …
}

DebugGraphics finns i samma paket, så DEBUG_GRAPHICS_LOADED är tillgänglig.

package javax.swing;
public class DebugGraphics extends Graphics {
    …
    static {
        JComponent.DEBUG_GRAPHICS_LOADED = true;
    }
    …
}

Den här artikeln ger lite bakgrund om ämnet.

Skyddad synlighet

Skyddad synlighet orsakar innebär att detta medlem är synligt för sitt paket, tillsammans med någon av dess underklasser.

Som ett exempel:

package com.stackexchange.docs;
public class MyClass{
    protected int variable; //This is the variable that we are trying to access
    public MyClass(){
        variable = 2;
    };
}

Nu ska vi utöka denna klass och försöka få åtkomst till en av dess protected medlemmar.

package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
    public SubClass(){
        super();
        System.out.println(super.variable);
    }
}

Du kan också få åtkomst till en protected medlem utan att utöka den om du kommer åt den från samma paket.

Observera att den här modifieraren bara fungerar på medlemmar i en klass, inte på själva klassen.

Sammanfattning av klassmedlemstillgångsmodifierare

Access Modifier Synlighet Arv
Privat Endast klass Kan inte ärvas
Inget modifierare / paket I paket Finns om underklass i paket
Skyddade I paket Finns i underklass
offentlig över~~POS=TRUNC allt~~POS=HEADCOMP Finns i underklass

Det fanns en gång en private protected (båda nyckelorden på en gång) som kunde tillämpas på metoder eller variabler för att göra dem tillgängliga från en underklass utanför paketet, men göra dem privata för klasserna i det paketet. Detta togs dock bort i Java 1.0: s utgåva .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow