1. 程式人生 > 其它 >Java零基礎進階篇之面向物件-訪問控制權限

Java零基礎進階篇之面向物件-訪問控制權限

技術標籤:Java學習資料純乾貨Java學習視訊教程java程式語言設計模式多型

本篇文章講解的知識點主要圍繞面向物件中的訪問控制權限,廢話不多說,只分享Java相關的乾貨!

java 訪問級別修飾符主要包括:private protected public,可以限定其他類對該類、屬性和方法的使用許可權,

注意以上對類的修飾只有:public default內部類除外

1private

【示例程式碼】

public class PrivateTest01 {


public static void main(String[] args) { A a = new A();
//不能訪問,private 宣告的變數或方法,只能在同一個類中使用
System.out.println(a.id);
}
}

class A {

private int id;


}

2protected

【程式碼例項】,在同一個包下,建立類 ProtectedTest01A,並建立 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();
}
}

3default

如果 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	");
}
}
*/

以上就是訪問控制權限相關的知識點了,配套視訊教程