Liebe Zuschauer, heute werden wir verwandte Themen zu Zugriffsmodifikatoren in Java diskutieren. Dies ist auch eine häufige Frage in Interviews.
Einfach ausgedrückt werden Zugriffsmodifikatoren von Codeschreibern erstellt, um zu unterscheiden, wann auf den Code zugegriffen werden kann und wann nicht. Zugriffsbeschränkungen werden in Java in vier Kategorien unterteilt: freundlich (der sogenannte Standardtyp), öffentlich, privat und geschützt.
Heute werfen wir einen Blick auf die beiden Kategorien, die schwieriger zu unterscheiden sind, nämlich freundlich und geschützt.
Schauen wir uns zunächst „freundlich“ an. Wenn wir vor einem Mitglied keine Modifikatoren hinzufügen, ist die Zugriffsebene des Mitglieds die Standardebene. Zu diesem Zeitpunkt können andere Klassen im selben Paket wie die Klasse auf diese Mitglieder zugreifen, während Klassen in anderen Paketen nicht darauf zugreifen können Diese Mitglieder wie folgt:
package com.a1; /** * A属于 com.a1 这个包 * @author Will * */ public class A { //成员均为默认访问级别 int i; String str; void print(){ System.out.println("i:"+i+";str:"+str); } }
package com.a1; /** * testA1属于com.a1 * @author Will * */ public class testA1 { public static void main(String[] args) { //由于testA1与A属于同一个包下,所以可以访问友好型的成员 A a=new A(); System.out.println(a.i); System.out.println(a.str); a.print(); } }
package com.b1; import com.a1.A; /** * testA2属于com.b1 * * @author Will * */ public class testA2 { public static void main(String[] args) { // 由于testA2与A不属于同一个包下,所以不能访问友好型的成员 // 去掉注释符会报错 A a = new A(); //System.out.println(a.i); //System.out.println(a.str); //a.print(); } }
Natürlich können Leser auf eine Situation stoßen, das heißt, wenn das Paket nicht angegeben ist, können die Dateien in verschiedenen Ordnern Klassendateien aufrufen Der Grund dafür ist, dass, wenn kein Paket angegeben ist, alle Dateien standardmäßig zum Standardpaket gehören, sodass sie die freundlichen Mitglieder des anderen aufrufen können.
Als nächstes werfen wir einen Blick auf den geschützten Typ. Dieser Typ ist dem freundlichen Typ (dh dem Standardtyp) sehr ähnlich, der einzige Unterschied besteht in der Vererbung. Einfach ausgedrückt: Solange die Klassendatei nicht zum selben Paket gehört (einschließlich Vererbung), können andere Klassendateien nicht auf benutzerfreundliche Mitglieder zugreifen, aber wenn die Klasse erbt, spielt es keine Rolle, ob sie zum selben Paket gehört Aufgrund der Vererbung können Unterklassen auf geschützte Mitglieder der übergeordneten Klasse zugreifen.
package com.a1; /** * A属于 com.a1 这个包 * i,str为友好型 * j,str1为protected型 * @author Will * */ public class A { int i; String str; protected int j; protected String str1; public A(){ } void print(){ System.out.println("i:"+i+";str:"+str); } protected void print(int k){ System.out.println("j:"+j+";str1:"+str1); } }
package com.a1; /** * testA1属于com.a1 * @author Will * */ public class testA1 { public static void main(String[] args) { //由于testA1与A属于同一个包下,所以可以访问友好型的成员 //也可以访问protected类型成员 A a=new A(); System.out.println(a.i); System.out.println(a.str); System.out.println(a.j); System.out.println(a.str1); a.print(); a.print(1); } }
package com.b1; import org.junit.Test; import com.a1.A; public class ExtendsA extends A{ @Test public void test(){ ExtendsA extendsA=new ExtendsA(); //当不再同一个包且继承情况下,不可调用父类友好型成员 //去掉注释会报错 //System.out.println(extendsA.i); //System.out.println(extendsA.str); //extendsA.print(); //当不再同一个包且继承情况下,可调用父类protected型成员 System.out.println(extendsA.j); System.out.println(extendsA.str1); extendsA.print(1); } }