java中的訪問修飾符詳解


主要講述一下java中protected的修飾控制范圍。

  在敘述protected修飾符使用之前,先來說一下java,可以發現,開發java程序是一個時時刻刻都在編寫類、開發類、定義類的過程。類里面可以有main方法。(main方法不管存在那個類中,都要通過打點的方式調用某個類的成員)

  在當前類的定義中,main方法之外,可以直接通過成員的名字來使用本類中的成員變量,不管這個成員是什么訪問修飾符修飾的,也不用通過對象打點調用的方式進行,當前類的main方法中,可以通過對象打點的方式調用。所以說訪問控制修飾符在當前類的定義中相當於沒有起到任何作用。但是java程序的開發,不僅僅是開發一個類而已,更多的是類之間的相互耦合,換句話說就是一個已經定義好的類,需要作為另一個類的成員,或者是成為另一個類的局部變量(在方法中聲明的)、或者是成為基類被子類繼承等,也只有在這個時候訪問控制修飾符才會起到訪問控制的作用。

  訪問控制符中的private,和public是最好理解的。

  private:

   1.在當前類開發中,main方法之外可以直接借助名字使用,當前類的main方法中可以使用對象打點的方式直接使用成員。

   2.在當前類之外,使用對象(或是類名,針對靜態的)打點調用都是被限制的。這時候有同學問,那我開發的這個私有的成員難道不能使用了嗎?不是,可以通過在當前類中開發一個公有的方法,在公有方法中可以使用這個私有的成員,從而達到間接使用私有成員。

   3.在繼承中,私有成員禁止被繼承,也就是說在子類的開發中,拒絕直接使用私有成員的名字進行使用。

  public:

   1.在當前類開發中,main方法之外可以直接借助名字使用,當前類的main方法中可以使用對象打點的方式直接使用成員。

   2.在當前類之外,使用對象(或是類名,針對靜態的)打點調用是被允許的。

   3.在子類中,公有成員允許被繼承,也就是說在子類的開發中,可以直接使用公有成員的名字進行使用。

  protected:

      protected這個修飾符比較繁瑣,它涉及到是否是同一個包的問題。

   同一個包的情況:

   1.在當前類開發中,main方法之外可以直接借助名字使用,當前類的main方法中可以使用對象打點的方式直接使用成員。

   2.在當前類之外,同一個包中,使用對象(或是類名,針對靜態的)打點調用是被允許的。

   3.在子類中,同一個包中,受保護成員允許被繼承,也就是說在子類的開發中,可以直接使用受保護成員的名字進行使用。子類的main方法中可以使用子類或是父類對象打點調用。

   4.在當前類之外,子類之外,要使用子類的類中,同一個包中,可以使用子類或是父類對象打點調用。

   不同包的情況:

   1.在當前類之外,不同包中,使用對象(或是類名,針對靜態的)打點調用是被禁止的。

   2.在子類中,不同包中,受保護成員允許被繼承,也就是說在子類的開發中,可以直接使用受保護成員的名字進行使用。子類的main方法中只能通過子類對象打點調用。父類對象不行,這個時候相當於父類中的受保護成員跨包了。

   3.在當前類之外,子類之外,要使用子類的類中,與子類同一個包中,通過子類對象打點是調用不出父類中的受保護的成員的。父類對象更不行,這個時候相當於父類中的受保護成員跨包了。如果想要通過子類對象調用父類的受保護的成員,需要重新覆寫父類的這個成員。

   4.在當前類之外,子類之外,要使用子類的類中,與父類同一個包中,通過子類對象打點是可以調用父類中的受保護的成員的。父類對象也行,同個包中。

   5.在與父類和子類都不同包的第三個包中,要想通過子類對象調用父類的受保護成員,可以通過覆寫父類受保護成員,並將訪問限制符修改成public。

在實際的開發中也許很少用到protected來作訪問控制,但是java的這個修飾符設計很巧妙,思想很高。同包中可以看做是public,異包中可以看做private。講一個實際的列子。clone()方法。

如果自定義的類,需要提供clone這個方法,實現對象副本的制作。那么需要重新覆寫clone這個方法,clone這個方法在Object類中作為受保護成員被提供,且在Java中所有的類都是繼承自Object的。有如下關系:

Object類處在java.lang包,

我們自定義的類,大多不在java.lang包中

而我們很有可能在另外的第三個包中調用自定義類的clone方法。

所以有如下開發方法:

在自定義類中覆寫clone方法,並將方法改成public來修飾。

總結如下:

 


免責聲明!

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



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