同一包中 | 不同包中 | |||
同一类中 | 同一包中[的子类] | 不同包中的子类 | 不同包中的非子类 | |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
1、public
在自己类中可以随便调用;同一包下不同类中不用import,创建类对象后随便调用;不同包下import后创建类对象随便调用,无论是不是子类。
2、protected
区分于public:在不同包下的非子类不能调用。
模板1) test包下的父类test2:
package test;
public class test2
{
int number = 0;
public test2(int number)
{
this.number = number;
}
protected void getNumber()
{
System.out.println(number);
}
public static void main(String[] args)
{
test2 test = new test2(1);
test.getNumber();
}
}
模板2) test3包下的test3子类,调用test2的protected方法(注意这里是通过其子类对象来间接调用,因为不同包下的父类和子类,不能直接通过父类对象去访问子类的非public成员):
package test3;
import test.test2;
public class test3 extends test2
{
//继承构造函数带有参数需要重写构造函数,并在函数体中调用父类构造函数
public test3(int number)
{
super(number);
}
public static void main(String[] args)
{
test3 t3 = new test3(1);
t3.getNumber();
}
}
编译运行一下:
javac -d . test2.java
javac -d . test3.java
java test3.test3
运行结果:
1
将模板2)中的test3改成非子类,调用test2的protected方法:
package test3;
import test.test2;//两个包在同一级可以这样调用
public class test3
{
public static void main(String[] args)
{
test2 t2 = new test2(1);
t2.getNumber();
}
}
编译报错:
错误: getNumber() 在 test2 中是 protected 访问控制
t2.getNumber();
说明protected修饰的成员在不同包的非子类中不能调用。
3、default(默认)
区分于protected:在不同包下的子类不能调用。
把模板1)中的getNumber方法改为默认修饰符
package test;
public class test2
{
int number = 0;
public test2(int number)
{
this.number = number;
}
void getNumber()
{
System.out.println(number);
}
public static void main(String[] args)
{
test2 test = new test2(1);
test.getNumber();
}
}
模板2)不变
编译一下:
javac -d . test2.java
javac -d . test3.java
在编译test3.java时报错:
错误: 找不到符号
t3.getNumber();
说明默认修饰的成员在不同包的子类中不能调用。
4、private
只能在自己类中调用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)