Java零基礎進階篇之面向物件-訪問控制權限
阿新 • • 發佈:2020-12-26
技術標籤:Java學習資料純乾貨Java學習視訊教程java程式語言設計模式多型類
本篇文章講解的知識點主要圍繞面向物件中的訪問控制權限,廢話不多說,只分享Java相關的乾貨!
java 訪問級別修飾符主要包括:private protected 和 public,可以限定其他類對該類、屬性和方法的使用許可權,
注意以上對類的修飾只有:public 和 default,內部類除外
1、private
【示例程式碼】
public class PrivateTest01 { public static void main(String[] args) { A a = new A(); //不能訪問,private 宣告的變數或方法,只能在同一個類中使用 System.out.println(a.id); } } class A { private int id; }
2、protected
【程式碼例項】,在同一個包下,建立類 ProtectedTest01、A,並建立 B 繼承 A
public class ProtectedTest01 { public static void main(String[] args) { A a = new A(); a.method1(); A b = new B(); b.method1(); B b1 = new B(); b1.method3(); } } class A { //採用protected 宣告的變數或方法只有子類或同一個包下的類可以呼叫 protected int id = 100; public void method1() { System.out.println(id); } protected void method2() { System.out.println("A.method2()"); } } class B extends A { public void method1() { //因為和A 在同一個包下 System.out.println(id); } public void method3() { //可以正確呼叫method2(); } }
【程式碼示例】,在 test1 下建立類 C1,在 test2 下建立 ProtectedTest02 和 C2 類
package test2; import test1.C1; public class ProtectedTest02 { public static void main(String[] args) { new C2().method2(); } } class C2 extends C1 { public void method2() { //可以呼叫,主要原因C2 是 C1 的子類 //所以可以訪問protected 宣告的變數 System.out.println(id); method1(); } } class C3 { public void method3() { //不能在其他類中訪問protected 宣告的方法或變數 //new C1().method1(); } }
3、default
如果 class 不採用 public 修飾,那麼此時的 class,只能被該包下的類訪問,其他包下無法訪問
import test3.D;
public class DefaultTest01 {
public static void main(String[] args) { D d = new D();
d.method1();
//不能訪問,只有在一個類中或在同一個包下可以訪問
//在子類中也不能訪問d.method2();
}
}
內部類
在一個類的內部定義的類,稱為內部類
內部類主要分類:
-
例項內部類
-
區域性內部類
-
靜態內部類
1、例項內部類
-
建立例項內部類,外部類的例項必須已經建立
-
例項內部類會持有外部類的引用
-
例項內部不能定義 static 成員,只能定義例項成員
public class InnerClassTest01 {
private int a;
private int b;
InnerClassTest01(int a, int b) { this.a = a;
this.b = b;
}
//內部類可以使用private 和protected 修飾
private class Inner1 { int i1 = 0;
int i2 = 1;
int i3 = a; int i4 = b;
//例項內部類不能採用static 宣告
//static int i5 = 20;
}
public static void main(String[] args) {
InnerClassTest01.Inner1 inner1 = new InnerClassTest01(100, 200).new Inner1();
System.out.println(inner1.i1); System.out.println(inner1.i2); System.out.println(inner1.i3); System.out.println(inner1.i4);
}
}
2、靜態內部類
-
靜態內部類不會持有外部的類的引用,建立時可以不用建立外部類
-
靜態內部類可以訪問外部的靜態變數,如果訪問外部類的成員變數必須通過外部類的例項訪問
【示例程式碼】
public class InnerClassTest02 {
static int a = 200;
int b = 300;
static class Inner2 {
//在靜態內部類中可以定義例項變數int i1 = 10;
int i2 = 20;
//可以定義靜態變數static int i3 = 100;
//可以直接使用外部類的靜態變數static int i4 = a;
//不能直接引用外部類的例項變數
//int i5 = b;
//採用外部類的引用可以取得成員變數的值int i5 = new InnerClassTest02().b;
}
public static void main(String[] args) {
InnerClassTest02.Inner2 inner = new InnerClassTest02.Inner2(); System.out.println(inner.i1);
}
}
3、區域性內部類
區域性內部類是在方法中定義的,它只能在當前方法中使用。和區域性變數的作用一樣區域性內部類和例項內部類一致,不能包含靜態成員
public class InnerClassTest03 {
private int a = 100;
//區域性變數,在內部類中使用必須採用final 修飾
public void method1(final int temp) { class Inner3 {
int i1 = 10;
//可以訪問外部類的成員變數int i2 = a;
int i3 = temp;
}
//使用內部類
Inner3 inner3 = new Inner3();
System.out.println(inner3.i1); System.out.println(inner3.i3);
}
public static void main(String[] args) {
InnerClassTest03 innerClassTest03 = new InnerClassTest03(); innerClassTest03.method1(300);
}
}
4、匿名內部類
是一種特殊的內部類,該類沒有名字
-
沒有使用匿名類
public class InnerClassTest04 {
public static void main(String[] args) {
MyInterface myInterface = new MyInterfaceImpl(); myInterface.add();
}
}
interface MyInterface {
public void add();
}
class MyInterfaceImpl implements MyInterface {
public void add() {
System.out.println("-------add ");
}
}
-
使用匿名類
public class InnerClassTest05 {
public static void main(String[] args) {
/*
MyInterface myInterface = new MyInterface() { public void add() {
System.out.println("-------add ");
}
};
myInterface.add();
*/
/*
MyInterface myInterface = new MyInterfaceImpl(); InnerClassTest05 innerClassTest05 = new InnerClassTest05(); innerClassTest05.method1(myInterface);
*/
InnerClassTest05 innerClassTest05 = new InnerClassTest05(); innerClassTest05.method1(new MyInterface() {
public void add() {
System.out.println("-------add ");
}
});
}
private void method1(MyInterface myInterface) { myInterface.add();
}
}
interface MyInterface {
public void add();
}
/*
class MyInterfaceImpl implements MyInterface {
public void add() {
System.out.println("-------add ");
}
}
*/
以上就是訪問控制權限相關的知識點了,配套視訊教程