为什么父类的protected成员无法通过子类对象调用?

明月镇魂 2016-11-09 02:07:24
package cn.A;

public class PackageTest01 {
protected void show()
{
System.out.println("hello Package");
}
}

package cn.B;

public class PackageDemo1 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//cn.A.PackageTest01 pt =new cn.A.PackageTest01();
//pt.show();
package_extends pe =new package_extends();
pe.show();
}

}

class package_extends extends cn.A.PackageTest01
{

}


protected修饰符修饰过的成员不是同包或者子类能够访问么?为什么在PackageDemo1类中使用子类对象无法访问到show方法呢?
...全文
505 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wallEVA96 2019-01-17
  • 打赏
  • 举报
回复
将衍生类赋值给基类, 如果重载拷贝构造函数的话, 不就相当于在基类中,访问了衍生类共有的protectecd成员了。 这样不是也违背了protected的限定范围了。
沐风sly 2018-12-23
  • 打赏
  • 举报
回复
醍醐灌顶,感谢发帖人和解答的大佬
明月镇魂 2016-11-10
  • 打赏
  • 举报
回复
引用 7 楼 qq_26508409 的回复:
PackageDemo1 是子类吗
一语中的。
明月镇魂 2016-11-10
  • 打赏
  • 举报
回复 1
引用 5 楼 Q80470101 的回复:
我想下面这个表格,你应该也知道。 作用域 当前类 同包 子孙类 其他包 public √ √ √ √ protected √ √ √ × 无修饰符 √ √ × × private √ × × × 不过这里,你误解了一个概念,所谓 protected 修饰的方法能在当前类、同包和子孙类中被访问。 这里的“子孙类中被访问”,是指在类里面被访问,而不是在外部创建的子孙对象中访问。(如果是这样的话,和public就没有区别了。) 试试如下写法: class package_extends extends cn.A.PackageTest01 { public void show() { super.show(); } public void other() { super.show(); // 只有是子孙类内部,都可以访问 } }
是的,就是这样,在PackageDemo1中用子类对象访问show方法那也是在别的类里访问了show方法,与protected相违背了。 早晨起来自己提出了一个比较蠢的问题。多谢解答。
家里敷泥呀 2016-11-10
  • 打赏
  • 举报
回复
引用 8 楼 rockpk008 的回复:
[quote=引用 5 楼 Q80470101 的回复:]
是的,就是这样,在PackageDemo1中用子类对象访问show方法那也是在别的类里访问了show方法,与protected相违背了。 早晨起来自己提出了一个比较蠢的问题。多谢解答。[/quote] 其实不蠢,是个常见误区。
nikyotensai 2016-11-09
  • 打赏
  • 举报
回复
PackageDemo1 是子类吗
家里敷泥呀 2016-11-09
  • 打赏
  • 举报
回复
订正一个错别字: super.show(); // 只要是子孙类内部,都可以访问。
家里敷泥呀 2016-11-09
  • 打赏
  • 举报
回复
我想下面这个表格,你应该也知道。 作用域 当前类 同包 子孙类 其他包 public √ √ √ √ protected √ √ √ × 无修饰符 √ √ × × private √ × × × 不过这里,你误解了一个概念,所谓 protected 修饰的方法能在当前类、同包和子孙类中被访问。 这里的“子孙类中被访问”,是指在类里面被访问,而不是在外部创建的子孙对象中访问。(如果是这样的话,和public就没有区别了。) 试试如下写法: class package_extends extends cn.A.PackageTest01 { public void show() { super.show(); } public void other() { super.show(); // 只有是子孙类内部,都可以访问 } }
伫望-向北 2016-11-09
  • 打赏
  • 举报
回复
[quote=引用 1 楼 zhuwangxiangbie 的回复:] //cn.A.PackageTest01 pt =new cn.A.PackageTest01(); //pt.show(); 因为PackageTest01与PackageDemo1不在同一个包,也没有继承关系,所以在PackageDemo1中不能调用protected修饰的show()方法 package_extends pe =new package_extends(); pe.show(); 这个是没有问题的,因为 package_extends继承了PackageTest01,也就继承了show()方法.而package_extends与PackageDemo1在同一包下,可以访问. 上面这个搞错了,没注意子类没重写. package_extends pe =new package_extends(); pe.show(); 这个子类也是访问不了show方法的. 创建一个子类的对象的时候,会先调用父类的构造函数来创建一个父类的对象,这个父类对象被包含在子类对象的内部。所以,子类在继承父类时所继承的属性和方法(非私有的)是和父类共用的,不过,这个父类对象里的属性和方法必须通过子类对象才能访问到,因为它是包含在子类对象内部的。调用子类对象中的属性和方法的时候,会先从子类对象里面找,找不到的话才去那个父类对象中找,所以如果发生了重写/覆盖,就会调用子类对象里重写的方法而不是父类对象里的。如果要在子类中调用父类中被重写/覆盖的属性和方法,必须在前面加上关键词super. 如果你是分别创建一个父类和一个子类的对象的话,除了static修饰的部分外,他们之间的属性和方法是完全分开的,彼此互不干涉。你要理解单独创建一个父类对象跟创建子类对象的时候创建出来的那个父类对象之间的区别。
自由自在_Yu 2016-11-09
  • 打赏
  • 举报
回复
package_extends pe =new package_extends(); pe.show(); 这不是子类对象访问到show方法吗
游一游走一走 2016-11-09
  • 打赏
  • 举报
回复
Access Levels
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N

Visibility
Modifier Alpha Beta Alphasub Gamma
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
伫望-向北 2016-11-09
  • 打赏
  • 举报
回复
//cn.A.PackageTest01 pt =new cn.A.PackageTest01(); //pt.show(); 因为PackageTest01与PackageDemo1不在同一个包,也没有继承关系,所以在PackageDemo1中不能调用protected修饰的show()方法 package_extends pe =new package_extends(); pe.show(); 这个是没有问题的,因为 package_extends继承了PackageTest01,也就继承了show()方法.而package_extends与PackageDemo1在同一包下,可以访问.

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧