JAVA访问控制符问题--父类子类不在同一个包内的Protected问题

在com.fzq.study1包中父类:
package com.fzq.study1;

public class A {
public int intPublic;
int intFriendly;
protected int intProtected;
private int intPrivate;
static public int intPublicStactic;
static int intFriendlyStactic;
static protected int intProtectedStactic;
static private int intPrivateStactic;

public A() {

}

/**
* @param args
*/
public static void main(String[] args) {
}
public void fucPublic(){}
void fucFriendly(){}
protected void fucProtected(){}
private void fucPrivate(){}

public static void fucPublicStatic(){}
static void fucFriendlyStatic(){}
protected static void fucProtectedStatic(){}
private static void fucPprivateStatic(){}
}
在com.fzq.study2包中的子类:
package com.fzq.study2;
import com.fzq.study1.*;

public class E extends A{
public E() {
super.intProtected = 3;
super.intPublic = 6;
super.intProtectedStactic = 7;
super.intPublicStactic = 9;
super.fucProtected();
super.fucPublic();
super.fucProtectedStatic();
super.fucPublicStatic();
}

/**
* @param args
*/
public static void main(String[] args) {
A a = new A();
a.intPublic = 4;
//a.intProtected = 6; 不可以这样写,会编译报错
a.intProtectedStactic = 4;可以这样写,不会报错
a.intPublicStactic = 5;
a.fucPublic();
a.fucProtectedStatic();
a.fucPublicStatic();

E e = new E();
e.intProtected = 5;
e.intPublic = 6;
e.intProtectedStactic = 6;
e.intPublicStactic = 7;
e.fucProtected();
e.fucPublic();
e.fucProtectedStatic();
e.fucPublicStatic();
}
}
我想问的问题是:在上述包结构下,为什么在子类E的main()方法中父类对象a不能访问它的protected属性intProtected,而可以访问Stactic Protected属性intProtectedStactic。

弄了半天终于整明白了。。
protected的意思是本包可以访问..子类可以继承..
某类的protected 方法和属性在包外是不能通过该类对象进行访问的(你能在包外访问一个类的默认权限的方法和属性吗?当然不能),这就是为什么在某对象所在的包的以外的任何地方,你不可以通过该类的对象引用来调用它的protected 方法和属性,哪怕是在该类的子类中也不可以这样做。在该类包外的子类中能“看到“的只是子类自己继承来的protected 方法和属性,它是不能“看到“它的父类对象的protected方法和属性的。

也就是说你可以new 子类然后子类对象.protected属性..但是这样实际上访问的是子类继承来的属性..并不是父类的属性..
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-08-06
因为a是new出来的对象,其实相当于在对象a外部调用a的protected属性,当然是不可以的,楼上几位说的不对,即使把static void main(String[] args)改成void f(),a.intProtected也会报错,protected只能是同一包内或者子类对象,new出来的对象是不可以的,至于e.intProtected可以访问是因为在同一个包里
至于a.intProtectedStactic可以访问是因为intProtectedStactic是static类型,是针对类而不是对象,又因为E extends A,所以在intProtectedStactic其实指向的是同一块内存地址(共用一块内存地址),a.intProtectedStactic和e.intProtectedStactic值是一样的,你可以在你的程序最后判断一下。a.intProtectedStactic相当于访问E.intProtectedStactic
第2个回答  2010-08-06
因为你的main方法是静态的 静态中是不能访问非静态的所有属性和方法 所以你只能在非静态中去使用对象a的protected属性 访问的时候一定要用super.protected因为这样才是在同一个包中 如果你用a.protected是不能访问的 因为new 的话 就不是在同一个包中
E继承于A所以super.protected 是同一个包中的
new 的包就是不在同一个包中
第3个回答  2010-08-06
类的成员方法有实例方法和类方法之分
static方法也叫类方法或者静态方法,类方法体中只能访问类变量,
类方法既可以通过对象来调用,也可以通过类名来调用.
实例方法体中既可以访问类变量,也可以访问实例变量.实例方法只能通过对象调用.
第4个回答  2010-08-06
静态方法不能访问非静态成员变量
相似回答