最近在寫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作用域public ,private ,protected 及不寫時的區別。
1、public:public表明該數據成員、成員函數是對所有用戶開放的,所有用戶都可以直接進行調用
2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有財產神聖不可侵犯嘛,即便是子女,朋友,都不可以使用。
3、protected:protected對於子女、朋友來說,就是public的,可以自由使用,沒有任何限制,而對於其他的外部class,protected就變成private。
4、default 則在包內包外的子類都可見。
作用域 | 當前類 | 同一package | 子孫類 | 其他package |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default(無修飾詞) | √ | √ | × | × |
private | √ | × | × | × |