当前位置: 技术问答>java相关
关于protected的访问问题。
来源: 互联网 发布时间:2015-03-21
本文导语: 我知道如果super class与sub class 在不同的包中,sub class 不能访问super class 的protected 变量和方法。但是sub class 为什么能够在重载protected method时,用super访问super class 的protect method呢? 哪位大侠解释一下,在下...
我知道如果super class与sub class 在不同的包中,sub class 不能访问super class 的protected 变量和方法。但是sub class 为什么能够在重载protected method时,用super访问super class 的protect method呢?
哪位大侠解释一下,在下初学乍练,以后请多多指教。谢谢。
//file Test1.java
package a;
public class Test1{
protected void f(){ System.out.println("Super protected method");}
}
//file Test2.java
import a;
public class Test2 extends test1{
protected void f(){
super.f();//这句正确。
System.out.println("Sub protected method");
}
public static void main(String[] args){
Test1 t1=new Test1();
// t1.f() 这句访问protected方法出错。
Test2 t2=new Test2();
t2.f(); //这句正确。
}
}
哪位大侠解释一下,在下初学乍练,以后请多多指教。谢谢。
//file Test1.java
package a;
public class Test1{
protected void f(){ System.out.println("Super protected method");}
}
//file Test2.java
import a;
public class Test2 extends test1{
protected void f(){
super.f();//这句正确。
System.out.println("Sub protected method");
}
public static void main(String[] args){
Test1 t1=new Test1();
// t1.f() 这句访问protected方法出错。
Test2 t2=new Test2();
t2.f(); //这句正确。
}
}
|
这个比较复杂,嘻嘻 你看看下面的程序,把“//”去掉或加上,试一试:
- 父类中的protected static方法 和 protected方法,是不一样的
- 在子类中(new Father()).f()是“间接调用父类方法”,在子类中f() 或 super.f()
是“直接继承调用父类方法”,这2个是不一样的。
- 在子类中(new Father()).f(),和在另一个类中(new Father()).f(),也是不一样的
- 虽然protected包括同包和子类,但实际上同包和子类是不一样的(这是怎么回事?嘻嘻)
package p0;
public class CTest0{
protected void f(){
System.out.println("Father-f");
}
static protected void fs(){
System.out.println("Father-fs");
}
}
package p1;
public class CTest1 extends p0.CTest0{
public void g(){
//super.f();
f();
}
public void h(p0.CTest0 t0){
//t0.fs();
((p1.CTest1)t0).fs();
//t0.f();
//((p1.CTest1)t0).f();
}
public void f(){
System.out.println("Son-f");
}
static public void fs(){
System.out.println("Son-fs");
}
public static void main(String[] args){
//(new CTest1()).h(new p1.CTest1());
(new CTest1()).g();
}
}
package p2;
public class CTest2{
public void m(p0.CTest0 t0){
//t0.fs();
((p1.CTest1)t0).fs();
//t0.f();
//((p1.CTest1)t0).f();
}
public static void main(String[] args){
//(new p2.CTest2()).m(new p1.CTest1());
(new p1.CTest1()).g();
}
}
- 父类中的protected static方法 和 protected方法,是不一样的
- 在子类中(new Father()).f()是“间接调用父类方法”,在子类中f() 或 super.f()
是“直接继承调用父类方法”,这2个是不一样的。
- 在子类中(new Father()).f(),和在另一个类中(new Father()).f(),也是不一样的
- 虽然protected包括同包和子类,但实际上同包和子类是不一样的(这是怎么回事?嘻嘻)
package p0;
public class CTest0{
protected void f(){
System.out.println("Father-f");
}
static protected void fs(){
System.out.println("Father-fs");
}
}
package p1;
public class CTest1 extends p0.CTest0{
public void g(){
//super.f();
f();
}
public void h(p0.CTest0 t0){
//t0.fs();
((p1.CTest1)t0).fs();
//t0.f();
//((p1.CTest1)t0).f();
}
public void f(){
System.out.println("Son-f");
}
static public void fs(){
System.out.println("Son-fs");
}
public static void main(String[] args){
//(new CTest1()).h(new p1.CTest1());
(new CTest1()).g();
}
}
package p2;
public class CTest2{
public void m(p0.CTest0 t0){
//t0.fs();
((p1.CTest1)t0).fs();
//t0.f();
//((p1.CTest1)t0).f();
}
public static void main(String[] args){
//(new p2.CTest2()).m(new p1.CTest1());
(new p1.CTest1()).g();
}
}