java作用域的區別

 

 Java中,針對不同的修飾詞,類及其類中的方法、域都有不同的可見性。以下爲針對java中可見性的幾點總結。

一.java中的默認包(這個包是沒有名稱的),對於任何修飾詞來說,其中的內容只能對其包內類爲可見。

      最近在寫java測試程序的時候突然遇到了一個問題:java默認包中的public類是不能在其他包中直接調用的。

      首先,總結一下默認包中類的使用範圍,java默認包中的類可以實例化其它包中的public類,但是其它包中的類是不能顯式實例化默認包中的類這個特性在JDK1.4以後的版本成立;

      其次,可以通過反射來訪問默認包中的類,例如下面代碼

public class Hello {
 private String codeing;

 public String getCodeing() {
  return codeing + " Hello!";
 }

 public void setCodeing(String codeing) {
  this.codeing = codeing;
 }
}

package junit;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import junit.framework.Assert;
import junit.framework.TestCase;

public class TestHello extends TestCase{
 
 public void testDplit() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{
  
  Class c = Class.forName("Hello");
  Method m1 = c.getDeclaredMethod("setCodeing", String.class);
  Object ins = c.newInstance();
  m1.invoke(ins, "qh");
  
  Method m2 = c.getDeclaredMethod("getCodeing");
  Assert.assertEquals((String)m2.invoke(ins),"qh Hello!");
 }
}


二.對於java中的非默認包中的內容,各修修飾詞及其可見性如下:

java作用域public ,private ,protected 及不寫時的區別。

在說明這四個關鍵字之前,我想就class之間的關係做一個簡單的定義,對於繼承自己的class,base class可以認爲他們都是自己的子女,而對於和自己一個目錄下的classes,認爲都是自己的朋友。

1、public:public表明該數據成員、成員函數是對所有用戶開放的,所有用戶都可以直接進行調用
2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有財產神聖不可侵犯嘛,即便是子女,朋友,都不可以使用。
3、protected:protected對於子女、朋友來說,就是public的,可以自由使用,沒有任何限制,而對於其他的外部class,protected就變成private。

4、default 則在包內包外的子類都可見。

作用域  當前類 同一package 子孫類  其他package
public √     √     √     √    
protected  √     √     √     ×  
default(無修飾詞) √     √     ×   × 
private √     ×   ×   ×  
對上表有幾點說明:對於default類型修飾詞,如果其子孫類與父類如果是位於同一個包內,則子孫類中的方法可以訪問無修飾詞修飾的父類方法;如果子孫類與父類是位於不同的包內,則子孫類中的方法無法訪問父類中的無修飾詞修飾的父類方法。對於protected類型修飾詞,則子孫類可以訪問父類中的protected方法,而其它類則不行。上面提到的父類都是public。



發佈了11 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章