天天看點

public、private、default、protected總結2016.12.12再總結一下protected權限修飾符

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修飾的方法的。)

基本概念還是要弄清楚