CSDN的一个帖子启发了这篇blog.在以下JBuilder2005中调试,可以看看错误提示,那就是问题的答案了.
先看如下两个例子:
package com.tom;
public class Supper {
public Supper() {
}
protected void f1() {
System.out.println("can see f1()");
}
void f2() {
System.out.println("can see f2()");
}
static protected void staticF1() {
System.out.println("can see staticf1()");
}
static void staticF2() {
System.out.println("can see staticf2()");
}
public static void main(String[] args) {
Supper supper = new Supper();
}
}
package com;
import com.tom.Supper;
public class Sub extends Supper {
public Sub() {
}
void subF1() {
f1(); //父类的f1()
//f2(); //这只在通一个包中才可见
}
public static void main(String[] args) {
Sub sub = new Sub();
Supper supper = new Supper();
//supper.f1(); //有问题!
//supper.f2(); //有问题!一句话,在包外通过一个类的引用只能访问该类public方法.
sub.f1();
sub.staticF1();
//sub.staticF2();
supper.staticF1(); //???这个为什么可以,就不明白了?
//supper.staticF2();
}
}
上面例子中的supper.f1()和supper.f2()为什么可以,就值得讨论了.因为这正式protected关键字的作用.
包外子类引用可以访问父类的protected函数.但此时包外子类的父类实例引用只能访问父类的public方法,其他的
protected,默认,都不能通过父类的实例引用访问的---这是为什么呢?解释如下:在子类和父类在不同的包时:子类实例引用可以访问父类的public和protected方法(这不正是Java中protected关键字的作用吗?);而此时如果包外生成父类的实例引用,那么这个父类的实例引用只能访问父类的public方法的.
至于supper.staticF1()为什么可以通过现在还不明白!