java類的訪問權限


1.解析

Java有四種訪問權限, 其中三種有訪問權限修飾符,分別為private,public和protected,還有一種不帶任何修飾符。

  1. private: Java語言中對訪問權限限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的類、屬性以及方法只能被該類的對象訪問,其子類不能訪問,更不能允許跨包訪問。
  2. default:即不加任何訪問修飾符,通常稱為“默認訪問模式“。該模式下,只允許在同一個包中進行訪問。
  3. protect: 介於public 和 private 之間的一種訪問修飾符,一般稱之為“保護形”。被其修飾的類、屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
  4. public: Java語言中訪問限制最寬的修飾符,一般稱之為“公共的”。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包(package)訪問。
下面用表格的形式來展示四種訪問權限之間的異同點,這樣會更加形象。表格如下所示:
 

同一個類

同一個包

不同包的子類

不同包的非子類

Private

     

Default

   

Protected

 

Public

2.Protected

假設在包accesscontrol下面有AccessControlDemo和 Base 兩個類,其中protected double price;是Base類的成員變量,因為兩個類在同一個包中,所以在AccessControlDemo類中可以直接訪問System.out.println(base.price);具體實例如下:

accesscontrol.AccessControlDemo

View Code
package accesscontrol;

public class AccessControlDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Base base=new Base("123-1",120.1);
        System.out.println(base.price);
        
    }
}

accesscontrol.Base

View Code
package accesscontrol;

public class Base {
    
    private String isbn;
    protected double price;
    
    //默認構造函數
    public Base() {

    }

    //構造函數,如果只定義帶參數的構造函數而不定義默認構造函數,那么Base的子類必須定義顯式構造函數
    //Implicit super constructor Base() is undefined for default constructor. Must define an explicit 

    public Base(String isbn, double price) {
        this.isbn = isbn;
        this.price = price;
    }
    

    public String getIsbn() {
        return isbn;
    }
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    
}

但是假如我們將AccessControlDemo這個類移到test這個包中,我們會發現eclipse中提示錯誤,編譯無法通過,因為在test包中對protected類型的成員變量不可見。

假如我們在test包中創建一個Base類的子類Bulk,也就是說Bulk是Base類不同包的子類。那么在Bulk類中能夠直接訪問protected double price;這個基層自Base類的成員變量,實例如下:

test.AccessControlDemo

View Code
package test;

public class AccessControlDemo {
    public static void main(String[] args) {
        Bulk bulk=new Bulk("123-1",120.1);
        bulk.print();
    }
}

test.Bulk

View Code
package test;

import accesscontrol.Base;

public class Bulk extends Base {
    
    public Bulk() {
        super();
    }

    public Bulk(String isbn, double price) {
        super(isbn, price);
    }

    public void print()
    {
        System.out.println(this.price);
    }
}

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM