有两个包;
第一个包com. one 中的 Stu.java 文件内容:package com.one;public class Stu {
public int x;
protected int y;}
第二个包com. two 中的 CollStu.java文件中内容:
package com.two;
import com.one.*;
public class CollStu extends Stu {
String another;
protected int z;
}class Test {
public static void main(String[] args) {
CollStu c = new CollStu();
c.another = "";
c.x = 1;
c.y = 1; //编译错误
c.z = 2;
}
}
CollStu 从 父类 Stu 继承 了 Stu中可以访问的成员 ,实例变量 y声明为 protected,应该可以被
子类CollStu 继承 ,但是为什么在IDE 中 用 "c ." 的形式点不出来y ,而且那一行会编译错误?
既然 父类中的y已经被 子类继承,成为子类的成员,那就可以想子类中定义的其他成员一样用了,它们都被认为是子类的成员。所以,为什么同样是protected 声明 ,z可以引用 ,y就不行了呢?
第一个包com. one 中的 Stu.java 文件内容:package com.one;public class Stu {
public int x;
protected int y;}
第二个包com. two 中的 CollStu.java文件中内容:
package com.two;
import com.one.*;
public class CollStu extends Stu {
String another;
protected int z;
}class Test {
public static void main(String[] args) {
CollStu c = new CollStu();
c.another = "";
c.x = 1;
c.y = 1; //编译错误
c.z = 2;
}
}
CollStu 从 父类 Stu 继承 了 Stu中可以访问的成员 ,实例变量 y声明为 protected,应该可以被
子类CollStu 继承 ,但是为什么在IDE 中 用 "c ." 的形式点不出来y ,而且那一行会编译错误?
既然 父类中的y已经被 子类继承,成为子类的成员,那就可以想子类中定义的其他成员一样用了,它们都被认为是子类的成员。所以,为什么同样是protected 声明 ,z可以引用 ,y就不行了呢?
z可以引用,是因为protected的作用域还包含同一个包,属性同一个包可见。
你Test是子类么?
可是“ c.y” c是对子类 CollStu 的引用,不是对父类的引用 。而子类CollStu继承了 Stu中的y ,而且 CollStu 和test类又都是在同一个包里,所以这样想,我觉得可以用
class Test{
private int i=5;
}
class Test2{
public static void main(String[] args) {
Test t=Test();
//这里你觉得可以直接t.i;调用么?原理一样的。
}
}