Java Language
Synlighet (kontrollera åtkomst till medlemmar i en klass)
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 .