haha,我是看到你另一个问题,然后去看TIJ的,没想到你又开了个帖子。其实这里的噱头就在于变量的声明: 5. SuperclassX objX = new SubclassY(); 6. SubclassY objY = new SubclassY();于是在 9. objY.superclassMethodX(); 这里是调用一个SubclassY对象继承来的protected方法,由于即使不是在一个包里,只要有继承关系,子类就可以调用父类的protected方法,所以这里就没有问题而在 11. i = objX.superclassVarX; 这里objX是一个SuperclassX的句柄,所以调用protected时,就不行了,这是调用另一个包里的protected了。如果把声明改成 5. SubclassY objX = new SubclassY(); 6. SuperclassX objY = new SubclassY(); 那么报错就应该在第9行而不是第11行了。关于protected的访问范围,看上面hpy121(孩子)
如下改后应该没有问题! protect方法只能在同一个包内调用!//父类 package packageX;public class SuperclassX { protected void superclassMethodX() { } protected int superclassVarX; }//子类 1. package packageX; 2. // import packageX.*; 3. public class SubclassY extends SuperclassX 4. { 5. SuperclassX objX = new SubclassY(); 6. SubclassY objY = new SubclassY(); 7. void subclassMethodY() 8. { 9. objY.superclassMethodX(); 10. int i; 11. i = objX.superclassVarX; 12. } 13. }
to :mor(安稼) 而在 11. i = objX.superclassVarX; 这里objX是一个SuperclassX的句柄,所以调用protected时,就不行了,这是调用另一个包里的protected了==============================================objX是一个SuperclassX的句柄 这话不懂, 怎么讲的??
在类A实例化了另一个包里的类B,并且调用了这个类B里的非public成员会编译错
to : xyxu1982(云娜) 但类A 是 B类的子类啊..... 例如: objX 到底是一个什么身份啊????( SuperclassX objX = new SubclassY(); )
to 回复人: xyxu1982(云娜) 不是吧 , A如果是B的子类 不在同一个包里的话 如果有继承关系的话 ,是可以访问protect的啊??
5. SuperclassX objX = new SubclassY();
6. SubclassY objY = new SubclassY();于是在
9. objY.superclassMethodX();
这里是调用一个SubclassY对象继承来的protected方法,由于即使不是在一个包里,只要有继承关系,子类就可以调用父类的protected方法,所以这里就没有问题而在
11. i = objX.superclassVarX;
这里objX是一个SuperclassX的句柄,所以调用protected时,就不行了,这是调用另一个包里的protected了。如果把声明改成
5. SubclassY objX = new SubclassY();
6. SuperclassX objY = new SubclassY();
那么报错就应该在第9行而不是第11行了。关于protected的访问范围,看上面hpy121(孩子)
protect方法只能在同一个包内调用!//父类
package packageX;public class SuperclassX
{
protected void superclassMethodX()
{
}
protected int superclassVarX;
}//子类
1. package packageX;
2. // import packageX.*;
3. public class SubclassY extends SuperclassX
4. {
5. SuperclassX objX = new SubclassY();
6. SubclassY objY = new SubclassY();
7. void subclassMethodY()
8. {
9. objY.superclassMethodX();
10. int i;
11. i = objX.superclassVarX;
12. }
13. }
11. i = objX.superclassVarX;
这里objX是一个SuperclassX的句柄,所以调用protected时,就不行了,这是调用另一个包里的protected了==============================================objX是一个SuperclassX的句柄 这话不懂, 怎么讲的??
例如: objX 到底是一个什么身份啊????( SuperclassX objX = new SubclassY(); )
不是吧 , A如果是B的子类 不在同一个包里的话 如果有继承关系的话 ,是可以访问protect的啊??
protected 对继承者是开放的,不管在不在一个包里。
如果同一个包下,protected=firendly.
指的是,objX是SuperclassX声明的变量,但是它指向SubclassY。
父类里被声明为protected的实例方法,子类是可以访问到的
fireflyqt(孤独萤火虫)说的是对的:
类A继承类B,这两个类在不同的包中,那么在类A中自然继承了类B的protected方法,但是使用时,你声明的是类B的对象,既然不在同一包中,你有什么权力使用类B的protected方法,而你又声明了一个类A的对象,该对象与类A在同一包中,当然有权力使用类A的protected方法。
1.子类继承了父类,就自然会拥有父类的各种方法和变量(private除外)
2.通过super来访问。楼主通过实例父类来使用父类的方法和变量是绝对不可以的,这样做没有利用它们的父子关系,所以是不行的
哦 也就是说 objX 是 SuperclassX 声明的对象, 所以没有权利使用 SuperclassX 的protected方法,, 是不是这个意思啊???谢谢大家........... 我结贴了
1、protected 的方法和变量,在子类都可以正常访问的,但我认为不等同于
objY.superclassMethodX(); 而是说在子类里可以用 this.superclassMethodX(); 这样的语句(如果用 private 就不可能的)来访问父类的方法,变量也是一样的。所以我就用了这些代码测试,是无法成功运行的(去掉 11 行可以编译通过,但是不能运行,错误信息: java.lang.StackOverflowError)。
调用一个对象的方法时,调用程序就是外部的啦,所以肯定调用不到 protected 方法、变量的,除了在自己的类定义体里,所以 9 行可以编译通过。
2、SuperclassX objX = new SubclassY(); 实际创建出来的还是一个 SubclassY 的实例,只是你用了他的父类变量 objX 去指向而已(所有的实例都可以用 Object 的变量去指向),这时如果你想访问这个实例的 subclassMethodY 方法,只要做类型转换就可以了。
第二问:我同意楼上的意见。
2. 关于第二问,zhengcg(楚楚) 解释得好,我就不班门弄负了.
可以用子类的实例来访问继承的变量,
也可用父类的实例来访问父类的同一变量