public > protected > default > private
以前感覺自己也是知其然不知其是以然,就傻傻的背别人說的,但是不知道其中真正意義,看了視訊才知道。(不敢說别人是不是這樣,反正本菜鳥就是這樣)
文字看不懂的建議看 視訊課程:Java4Android——課時25-27(包和通路權限)
平常總是百度看public、private、default、protected差别,但是看别人文字總是沒有深刻了解其中的含義。個人覺得看了Java4Android的視訊教程,才深刻了解了這幾個權限的差别。
1、4個權限是跟包相關的(是以必須先了解包package org.marsdroid)-建議看視訊,文字描述實在太難
2、【default】String name;當沒有任何權限描述是,預設是default,兩個類在同一個包,可以随意調用。不在同一個包下,跨包不可以通路,那就不行了。
比如下面:(Person類在包com.marsdroid之外就無法被調用,隻有跟Person在同一包下的類才可以使用)
package com.marsdroid;
class Person{
}
3、【public】不管在哪個包,随意調用
4、【private】僅僅在本類下面調用,就算該類被别的類繼承extends了,也無法使用private權限的變量和函數
5、【protected】主要跟繼承有關系。
(1)和default差別:
首先擁有和default一樣的功能(同一包路徑下com.xxx.xxx,不用extends也能用protected修飾的方法),但是該權限隻能修飾成員變量和成員函數。允許跨包繼承使用,(default不行,隻能在本包下繼承使用)。
(2)和public差別:
public String name;中的name随便用,不用繼承也可以使用。
protected String name;中的name,隻有繼承了該變量所在類後,才可以使用。
比如:
public class Person{
public String name;
protected int age;
}
1、在其他類中直接Person p = new Person();就可以用變量name,但是不能用age,
2、想用age的情況,必須是Person的子類,class Student extends Person{} Student才能用,允許跨包使用。
個人覺得Java4Android講師,是非常棒的,不僅僅隻是講解枯燥的概念。(用一個不懂的概念,去幫你解釋另一個概念,純屬扯淡)
老師用例子和執行個體講解,真是棒級了,這種授課方式讓人恍然大悟。極力推薦免費視訊課程《Java4Android》
2016.12.12再總結一下protected權限修飾符
概述:
學習模闆方法模式Template Method Pattern,讓我真正明白了protected和final的作用。
抽象類:
public abstract class SuberAbstract {
public abstract void publicRun();
protected abstract void protectedRun();
final public void run(){
this.publicRun();
this.protectedRun();
}
}
繼承抽象類的子類(模闆):
public class Man extends SuberAbstract {
@Override
public void publicRun() {
System.out.println("Man_publicRun");
}
@Override
protected void protectedRun() {
System.out.println("Man_protectedRun");
}
}
final
在寫子類Man的時候,明白了final的意思(平時大家也知道是不能修改了,我一般覺得是一個值不能變而已),在這裡就是模闆Man也不能重寫run()方法了,不能改變他了,根本沒有代碼其實。如果沒有final,我們還是可以更改這個方法的,有代碼提示敲出來這個方法。
客戶要用我們的模闆**Man的時候,隻讓他用那個final修飾的模闆方法**run(被final修飾後不能更改的即使模闆方法),其他的方法用protected修飾了就不能用了。(但是我們也知道protected是有default的屬性的,但是客戶類是沒有和我們的抽象類SuperAbstract類和模闆Man在一個包路徑裡面的,如果Company和SuperAbstract或Man任意一個在同一包的話,還是想辦法可以用protected方法的(注意想辦法意思:跟哪個在一起,就用哪個做引用才可以,跟SupAbstract在一起,new Man的時候要向上轉型;跟Man在一個包,new Man就不要轉型了。不過這種情況不常見。)),一般我們的客戶類不可能和SuperAbstract抽象類在一個包路徑裡面,是以我們的客戶類不能用protected修飾的方法。
public class Company {
public static void main(String[] args) {
SuberAbstract sa = new Man();
sa.run();
sa.publicRun();
~~sa.protectedRun();//此處其實是報錯的,為了友善示範寫出來~~
}
}
protected
個人感覺如果沒有Template Method Pattern,雖然感覺按照概念吧,我也懂protected,知道在一個包,大家可以用,不在一個包,繼承了後還是可以用可以複寫。但是對不能複寫的情況,不太清楚,現在真正了解了protected修飾的方法,不能用的地方的情況(Company和SuperAbstract、Man都不在同一個包,這時候,我們在Company裡面new Man的時候,我們是不可以用protected修飾的方法的。)