java中类内的方法前有四类修饰符号:public、protected、default、private,用来限制方法的使用范围。网上四个修饰符的使用范围如下表所示:
修饰符号 当前类 同一包内 子孙类 其他包内 (Y 表示可以访问,N表示不可以访问)
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N
这个表很直白的告诉了我们结果,但是却没有详细解释,我在学习这张表示产生了以下几个疑问:
1. 如果当前类中有函数的入口public static void main(String args[]), main函数是否能访问所在类中用protected、default、private修饰的方法?
答:main可以访问其所在类中被public、protected、default和private修饰的方法。
public class Basic {
public Basic()
{
System.out.println("test construction method");
}
public void test_public()
{
System.out.println("test_public");
}
private void test_private()
{
System.out.println("test_private");
}
protected void test_protected()
{
System.out.println("test_protected");
}
void test_default()
{
System.out.println("test_default");
}
private static void test_
public static void main(String[] args) {
Basic b = new Basic();
b.test_public();
b.test_protected();
b.test_default();
b.test_private();
}
}
2. 不同包内是什么含义?
package Algorithm;//Basic3属于Algorithm包
import Basic.Basic;//类Basic属于Basic包,即类Basic和类Basic属于不同的包
public class Basic3
{
public Basic3()
{
Basic b = new Basic();
b.test_public();//只有Basic中的public方法可以被访问,其他3个修饰符限定的方法都不能被访问。
}
public static void main(String arg[])
{
Basic3 b = new Basic3();
}
}
3.子孙类中可以访问的含义是什么?
子类只能调用父类中使用public、protected修饰的方法,default和private修饰的方法不能调用。
package Algorithm;
import Basic.Basic;
public class Basic3 extends Basic
{
public Basic3()
{
super.test_protected();
test_public();//可以不使用关键字 super
}
public static void main(String arg[])
{
Basic3 b = new Basic3();
}
}