主要講述一下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來修飾。
總結如下:

