從實踐認識修飾符
1 修飾符分類
說到修飾符,大家都知道有private deafult protect public,說到它們的區別,相信大家腦海會出現一張圖。
同一個類 | 同包非子類 | 子類 | 不同包非子類 | |
---|---|---|---|---|
private | 是 | 否 | 否 | 否 |
default | 是 | 是 | 否 | 否 |
protected | 是 | 是 | 是 | 否 |
public | 是 | 是 | 是 | 是 |
那麼怎麼從程式碼層面解釋呢,學東西不能停留在理論層面,畢竟只是一份實踐的工作。所以請看下面講解,畢竟實踐才是檢驗真理的唯一標準,說白了就是寫一些demo,驗證一下,工作中我們不瞭解某個方法或者某個類的時候,本人推薦寫一些demo,做一些test,本人覺得這是技巧之一。
2 程式碼展示
本例項訪問方法只有兩種
- 建立物件訪問,形成組合關係
- 繼承類,形成繼承關係
2.1 引入必要的maven
寫demo驗證自己想法時候,推薦使用test框架,不同每次都寫一個main方法,只要一個註解@test就能解決問題
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
複製程式碼
也可以使用slf4j框架來列印資訊
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
</dependency>
複製程式碼
也可以使用lombok框架,實現註解@getter和@setter代替getter方法和setter方法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
複製程式碼
2.2 private
需要建立物件 呼叫類中屬性
2.2.1 例項
package classtest;
import lombok.Getter;
import lombok.Setter;
import org.junit.Test;
/**
* @Author buer
* @create 2019/4/28 10:06
* @description 父類
*/
@Getter@Setter
public class Animal {
public int id = 1;
private String name="chen";
protected String parent = "parent";
@Test
public void eat(){
Animal animal = new Animal();
System.out.println(animal.name);
}
}
複製程式碼
2.2.2 結果
chen
ps:貼圖很麻煩 就貼字了
2.2.3 結論
在本類建立物件可以直接訪問private屬性欄位
2.3 default
建立物件,訪問屬性
2.3.1 例項
package classtest;
@Getter
@Setter
public class Classtest {
@Test
public void defaultTest(){
Animal animal = new Animal();
System.out.println(animal.name);
}
}
複製程式碼
另一個類name屬性改變--》protected
package classtest;
@Getter
@Setter
public class Animal {
private int id;
String name="chen";
protected String parent;
}
複製程式碼
2.3.2 結果
chen
2.3.3 結論
在同一個包中建立物件可以直接訪問,不同包下建立物件不能訪問default 預設屬性欄位,例子省略
2.4 protected
繼承父類,不需要建立父類物件,直接訪問protected屬性欄位
2.4.1 例項
package butong;
import classtest.Animal;
import org.junit.Test;
/**
* @Author buer
* @create 2019/5/4 14:37
* @description
*/
public class Animalbutong extends Animal{
@Test
public void defaultTest(){
System.out.println(parent);
}
}
複製程式碼
2.4.2 結果
chen
2.4.3 結論
在子類中可以直接進訪問父類欄位,不需要建立物件
2.5 public
在不同包以及非子類關係下,建立物件可以訪問public屬性欄位
2.5.1 例項
test屬性是public
package butong;
import classtest.Animal;
import org.junit.Test;
/**
* @Author buer
* @create 2019/5/4 14:37
* @description
*/
public class Animalbutong {
@Test
public void defaultTest(){
Animal animal = new Animal();
System.out.println(animal.test);
}
}
複製程式碼
2.5.2 結果
chen
2.5.3 結論
在不同包以及非子類關係下,建立物件可以訪問public屬性欄位