关于protected的有趣现象 根本没有什么有趣的,protected的用处就是子类可以访问,但是其它package的类是不可以访问的!你的ChildClass处于的packate和ParentClass 不同,所以是不能进行访问的这个是Java的规范!!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to 楼上的楼上:凶归凶, 不过你好像说的不准确哦!"protected的用处就是子类可以访问,但是其它package的类是不可以访问的!" "你的ChildClass处于的packate和ParentClass 不同,所以是不能进行访问的"子类如果位于其它包里也是可以访问protected成员的, 所以上面ChildClass是可以访问aMethod()方法的, 倒是创建这个方法的ParentClass本身不能访问. 这个例子对加深protected的理解还是很有意义的。 回复人: liuchunjp() :对,只要是子类,跟在不在同一个包里无关------------------------------------------------------------这点是显而易见的, 我主要不是说明这一点.我说的是, 在另一个包里, 继承自父类的子类可以访问protected成员, 而父类本身(它最初创建了这个protected成员)都不能再访问protected成员了. 为什么你会说“父类本身(它最初创建了这个protected成员)都不能再访问protected成员了.”当然不对你在ChildClass 不能使用new ParentClass().aMethod(); 是因为你已经在包的外面了,所以ChildClass已经不能访问这个方法了(就是指你不可以在ChildClass的代码中调用到这个方法),父类当然还是可以调用aMethod 回复人: ChDw(米) ( ) 信誉:155 说的很对,protected ,主要目的就是给子类继承用的 ParentClass p = new Childclass();p.aMethod();--------------------这样也不行啊, 为什么 to ChDw(米):不太明白你的意思。protected权限大于default权限,子类在包外是可以访问父类的protected成员的。注意main()方法中,ChildClass的实例可以访问aMethod(),而ParentClass的实例不可以。 protected的意思应该是子类可以继承,但是除了可以继承以外其他应该和private一样。所以new ChildClass().aMethod();访问的不是父类ParentClass的aMethod()方法,而是访问的他自己继承过来的aMethod()方法。至于为什么ParentClass()自己为什么不能访问就应该很明白了吧,因为aMethod()方法是private的啊 ^_^ 1:protected可以继承,但是除了可以继承以外其他应该和private一样,因为调用new ChildClass().aMethod()的main方法在ChildClass类内,所以可以调用,如果main在ChildClass类外应该是不可以使用的。2:new ParentClass().aMethod(); 不能调用的原因是不在同一个包里面,如果能够调用那么和public就差不多了。 protected是在子类方法中可以调用,但是并不是说在一个静态方法中也可以调用在子类当中,如果存在一个方法c,它是可以调用父类的方法a的!public void c() { a(); super.a();}但是在子类的静态方法当中,由于这个方法根本不在继承关系当中,所以它是无法按照继承关系来判断方法是否可以调用,所以在你的例子当中是无法编译通过的! 我赞同楼上的观点,原因不在于子类方法,而在于main方法的静态属性。 To 回复人: angues1980(石头心) 回复人: esunboy(天使联盟)protected权限大于default权限, 怎么会和private一样? To 回复人: ChDw(米) 我敢肯定与是否静态方法无关, 而是与是否创建ParentClass的实例有关, 在方法c中:public void c() { a(); super.a();}这样是可以的, 但是如果换成:public void c() { a(); new ParentClass().a();}就不行了! 没测试过代码,我的想法:protected 在所属类的定义中是可以访问,代码中main方法在子类的类定义内部,所以是可以访问该Protected方法的,但是这行代码:new ParentClass().aMethod(),首先他会建立一个ParentClass类的对象实例,对象实例是不可以访问Protected方法的。但你会反问new ChildClass().aMethod()也是用实例访问该方法啊?原因是它调用的是ChildClass的Protected方法,而这行调用代码又在ChildClass类定义的内部。前一行代码new ParentClass().aMethod()不行是因为他调用的是ParentClass类的方法,而这行调用代码并不在ParentClass类定义的内部。 可能我说得不清楚只有子类才能访问到父类的方法,这个父类并不是指所有的父类对象,这个父类仅仅指这个子类目前所继承的父类中的对象方法和属性!所以你再初始化一个Parent就已经不可以了 晕,越来越说不清了简单点,protected只对继承的子类和包内的类是可见的明显的,package p2;import p1.ParentClass;public class ChildClass extends ParentClass { public static void main(String[] args) { new ChildClass().aMethod(); //new ParentClass().aMethod(); //!不能调用 }}这里的new ParentClass()已经是p1的外部了,当然不能使用aMethod(),难道不是这样? 大家再思考一下下面的代码:// p1\ParentClass.javapackage p1;public class ParentClass { protected void aMethod() { }}// p2\ChildClass.javapackage p2;import p1.ParentClass;public class ChildClass extends ParentClass { void anotherMethod() { aMethod(); }}// p2\TestClass.javapackage p2;import p1.ParentClass;public class TestClass { public static void main(String[] args) { //new ChildClass().aMethod(); //!不能调用 //new ParentClass().aMethod(); //!不能调用 new ChildClass().anotherMethod(); //只有这样才可以 }}有一个结论是非常明显的: aMethod()在ChildClass类内部直接调用是可以的, 因为它继承自ParentClass, 这点很容易理解.令人不解的是: 在ChildClass类的内部, new ChildClass().aMethod()这种方式可以调用, 但是new ParentClass().aMethod()却不可以. 是啊,正是不能调用!因为new ParentClass()这个对象已经在包p1的外部了,而protected只对包内和子类可见,难道不是这样吗??package p2;import p1.ParentClass;public class TestClass { public static void main(String[] args) { //new ChildClass().aMethod(); /**不能调用,在继承过程中降低了访问权限,private当 然不能访问*/ //new ParentClass().aMethod(); //!不能调用,已经在包外了 new ChildClass().anotherMethod(); //只有这样才可以 }} To 回复人: killme2008(Java-Dog)我的疑问不在上面这个例子中, 上面的例子是用来和第一个例子做对比的.咳! 其实我根本就没有疑问, 我只是想说这是一个有趣的现象. 我的结论是:在与父类所在包不同的包中的子类中, 可以直接访问父类中的protected成员, 也可以通过创建父类的任何一个子类(包括它自已)的实例来访问protected成员, 但是不能通过创建父类本身的实例来访问protected成员. 这是符合的我最初的题意的.也就是说, 在包的外部, 父类把protected成员的访问权限给了它的子类们, 连通过自己来访问protected成员的权利都没有了. 仔细想一想, 难道不是一个有趣的现象么? 我觉得怎么老是强调"通过自己来访问protected成员的权利都没有"其实并不是通过自己没有,而根本是因为那个代码不在同一个包中,所以不在继承关系下的访问方式是不被允许的,这个是JVM的规范! “也就是说, 在包的外部, 父类把protected成员的访问权限给了它的子类们, 连通过自己来访问protected成员的权利都没有了. 仔细想一想, 难道不是一个有趣的现象么?”---------------------------------我想楼主对这两个概念有点混淆(或者楼主没有描述清楚):类 《=》 对象类的对象只能访问类的public成员,而只有类定义中才可以访问private,子类的定义中或同一包中的非子类代码可以访问protected,public成员。而 new ParentClass().aMethod()是用对象访问protected方法,所以是不行的。这个不是“权限”的问题,而是“可见性”问题,这是jvm的规范。 小方说得对!!!!///////////////////////quote:我想楼主对这两个概念有点混淆(或者楼主没有描述清楚):类 《=》 对象类的对象只能访问类的public成员,而只有类定义中才可以访问private,子类的定义中或同一包中的非子类代码可以访问protected,public成员。而 new ParentClass().aMethod()是用对象访问protected方法,所以是不行的。这个不是“权限”的问题,而是“可见性”问题,这是jvm的规范。 变量初始值的问题 java中有没有类似VB中shell功能的函数 用commons-email-1.1.jar和mail.jar包发送邮件报错 程序启动后,每天在特定的时间调用一个方法 responese 尝试连接MySQL 关于java的IO操作(急) 关于静态方法问题????????? 一个关于java泛型反射的问题 多线程锁的问题 初学JAVA,很菜,问XP下如何设置环境变量和安装JAVA虚拟机 关于java连接数据源的问题
"你的ChildClass处于的packate和ParentClass 不同,所以是不能进行访问的"子类如果位于其它包里也是可以访问protected成员的, 所以上面ChildClass是可以访问aMethod()方法的, 倒是创建这个方法的ParentClass本身不能访问.
对,只要是子类,跟在不在同一个包里无关
------------------------------------------------------------这点是显而易见的, 我主要不是说明这一点.我说的是, 在另一个包里, 继承自父类的子类可以访问protected成员, 而父类本身(它最初创建了这个protected成员)都不能再访问protected成员了.
你在ChildClass 不能使用
new ParentClass().aMethod(); 是因为你已经在包的外面了,所以ChildClass已经不能访问这个方法了(就是指你不可以在ChildClass的代码中调用到这个方法),父类当然还是可以调用aMethod
p.aMethod();
--------------------
这样也不行啊, 为什么
所以new ChildClass().aMethod();访问的不是父类ParentClass的aMethod()方法,而是访问的他自己继承过来的aMethod()方法。至于为什么ParentClass()自己为什么不能访问就应该很明白了吧,因为aMethod()方法是private的啊 ^_^
public void c() {
a();
super.a();
}但是在子类的静态方法当中,由于这个方法根本不在继承关系当中,所以它是无法按照继承关系来判断方法是否可以调用,所以在你的例子当中是无法编译通过的!
回复人: esunboy(天使联盟)protected权限大于default权限, 怎么会和private一样? To 回复人: ChDw(米)
我敢肯定与是否静态方法无关, 而是与是否创建ParentClass的实例有关, 在方法c中:public void c() {
a();
super.a();
}这样是可以的, 但是如果换成:public void c() {
a();
new ParentClass().a();
}
就不行了!
protected 在所属类的定义中是可以访问,代码中main方法在子类的类定义内部,所以是可以访问该Protected方法的,但是这行代码:
new ParentClass().aMethod(),首先他会建立一个ParentClass类的对象实例,对象实例是不可以访问Protected方法的。但你会反问new ChildClass().aMethod()也是用实例访问该方法啊?原因是它调用的是ChildClass的Protected方法,而这行调用代码又在ChildClass类定义的内部。前一行代码new ParentClass().aMethod()不行是因为他调用的是ParentClass类的方法,而这行调用代码并不在ParentClass类定义的内部。
这个父类仅仅指这个子类目前所继承的父类中的对象方法和属性!所以你再初始化一个Parent就已经不可以了
简单点,protected只对继承的子类和包内的类是可见的
明显的,
package p2;
import p1.ParentClass;
public class ChildClass extends ParentClass {
public static void main(String[] args) {
new ChildClass().aMethod();
//new ParentClass().aMethod(); //!不能调用
}
}
这里的new ParentClass()已经是p1的外部了,当然不能使用aMethod(),难道不是这样?
package p1;
public class ParentClass {
protected void aMethod() { }
}// p2\ChildClass.java
package p2;
import p1.ParentClass;
public class ChildClass extends ParentClass {
void anotherMethod() { aMethod(); }
}// p2\TestClass.java
package p2;
import p1.ParentClass;
public class TestClass {
public static void main(String[] args) {
//new ChildClass().aMethod(); //!不能调用
//new ParentClass().aMethod(); //!不能调用
new ChildClass().anotherMethod(); //只有这样才可以
}
}有一个结论是非常明显的: aMethod()在ChildClass类内部直接调用是可以的, 因为它继承自ParentClass, 这点很容易理解.令人不解的是: 在ChildClass类的内部, new ChildClass().aMethod()这种方式可以调用, 但是new ParentClass().aMethod()却不可以.
因为new ParentClass()这个对象已经在包p1的外部了,而protected只对包内和子类可见,难道不是这样吗??
package p2;
import p1.ParentClass;
public class TestClass {
public static void main(String[] args) {
//new ChildClass().aMethod(); /**不能调用,在继承过程中降低了访问权限,private当 然不能访问*/
//new ParentClass().aMethod(); //!不能调用,已经在包外了
new ChildClass().anotherMethod(); //只有这样才可以
}
}
---------------------------------
我想楼主对这两个概念有点混淆(或者楼主没有描述清楚):
类 《=》 对象类的对象只能访问类的public成员,而只有类定义中才可以访问private,子类的定义中或同一包中的非子类代码可以访问protected,public成员。而 new ParentClass().aMethod()是用对象访问protected方法,所以是不行的。这个不是“权限”的问题,而是“可见性”问题,这是jvm的规范。
///////////////////////quote:
我想楼主对这两个概念有点混淆(或者楼主没有描述清楚):
类 《=》 对象类的对象只能访问类的public成员,而只有类定义中才可以访问private,子类的定义中或同一包中的非子类代码可以访问protected,public成员。而 new ParentClass().aMethod()是用对象访问protected方法,所以是不行的。这个不是“权限”的问题,而是“可见性”问题,这是jvm的规范。