为什么会报错,因为是涉及父类?

psyl 2008-01-31 01:09:53

01: package parent;
02: public class Parent {
03: protected void amethod() {
04: System.out.println("amethod in parent class");
05: }
06: }


Child.java
01: package child;
02: import parent.Parent;
03: public class Child extends Parent{
04: public static void main(String []args) {
05: Child child = new Child(); child.amethod();
06: Parent parent = child;
07: parent.amethod();
08: }
09: }



为什么第六行不报错,第七行报错的原因是?
...全文
112 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
psyl 2008-01-31
  • 打赏
  • 举报
回复
A决定了这个对象能访问哪些方法和成员变量,叫做用A来签名 B决定了这个对象如何去初始化,调用哪个构造方法。 这句很通俗,一看就懂。你第一次说签名,我不是太理解,现在清楚了。

代码里边之所以有包是为了使用protected,重点不在这里。是在第六第七行上。

Parent parent = child 这句是用Parent来签名,但是它的方法却应该由child来初始化和调用,而不是parent本身调用。因为amechod()方法在本题里只对child可见。
yami251139 2008-01-31
  • 打赏
  • 举报
回复
Child child = new Child();
Parent parent = child
parent。amothod()。。
你沒看懂我意思。。
我是說他這個parent的引用類型是父類的 卻要在子類里調用父類的方法
lz問第7行為什么報錯,我解釋一下而已

sugar712 2008-01-31
  • 打赏
  • 举报
回复
恩,谢谢Ant_Yang的那个用处的理解
(这样做是有好处的,父类定义一个方法,但不希望父类对象使用这个方法,必须由子类来使用。举个典型的例子:
Object是所有类的基类对吧?看看API里面它的clone方法?protected签名!)


,感觉很好~~谢谢~~
Johnson_Hong 2008-01-31
  • 打赏
  • 举报
回复
报错是因为The method "amethod" from Parent Class is not visible,它们没有在一个包内,Parent的amethod()是protect的,parent.amethod()在Child里是不可见的。


就算你繼承父類 但你的方法還是從子類里面拿 他子類里又沒這個方法。。
....
13楼的说法有误
子类已经继承了amothod,在代码里虽然没有这个方法,但是
Child child = new Child();
child.amethod()是可以执行的。
yami251139 2008-01-31
  • 打赏
  • 举报
回复
A a = new B();
Parent parent = new Child();
就是創建一個 A類型的對象a但實現的方法是從b()里面拿的吧
就算你繼承父類 但你的方法還是從子類里面拿 他子類里又沒這個方法。。
總歸報錯咯。。
Ant 2008-01-31
  • 打赏
  • 举报
回复
我无语了……
明明只是一个protected关键字的问题,什么没有实例化,导入包错误之类的说法都出来了,这是哪跟哪阿?

最后的解释:
A a = new B();
A决定了这个对象能访问哪些方法和成员变量,叫做用A来签名
B决定了这个对象如何去初始化,调用哪个构造方法

再不理解我也没办法了……
psyl 2008-01-31
  • 打赏
  • 举报
回复
Parent parent = child;

这句话,谁再帮我巩固下。 等于 Parent parent = new Child(); 吧?
最后第七行 parent.amethod(); 就相当于一个单独调用 9楼 yami251139 的说法。

单独调用父类一个invisible的方法所以报错,是不是这样理解?
Ant 2008-01-31
  • 打赏
  • 举报
回复
我晕……跟包没关系吧?
你们真的有运行过这程序么?
yami251139 2008-01-31
  • 打赏
  • 举报
回复
public static void main(String []args) {
05: Child child = new Child(); child.amethod();
06: Parent parent = child; -------這是引用
第5行已經實例化了
07: parent.amethod(); ------這是調用方法
08: } 但你沒有實例化
Johnson_Hong 2008-01-31
  • 打赏
  • 举报
回复
它们没有在一个包内,parent的amethod()是protect的,parent.amethod()是不可见的。

由于child是parent的子类,它可以继承amethod(),因此在child包里面,
Child child = new Child(); child.amethod()是可以的
Ant 2008-01-31
  • 打赏
  • 举报
回复
报的错误是:The method "amethod" from Parent Class is not visible.

这个一个关于Protected关键字的语法,在Java里面Protected的意义是防止在本继承层被调用,在本层对外部不可见。必须通过子类继承才会对外部可见。说白了后台运作的原理是Child通过继承把父类Parent的amethod方法的protected默认改成了public。

这样做是有好处的,父类定义一个方法,但不希望父类对象使用这个方法,必须由子类来使用。举个典型的例子:
Object是所有类的基类对吧?看看API里面它的clone方法?protected签名!

所以你new 任何一个对象,都可以调用clone()方法,当然不重写的话就是用Object类的实现,但唯独你new 一个Object是无法调用clone,因为clone在Object这一层对外部是不可见的!

综述:protected是作用就是无论对method还是field,对于本继承层次来说相当于private,对下一层子类相当于public。
枫叶rain 2008-01-31
  • 打赏
  • 举报
回复
说没错误的是因为,你们没有看清楚是两个不同的包啊
放在不同的包下就有问题了
你们看看
照我上面说的就正常了
枫叶rain 2008-01-31
  • 打赏
  • 举报
回复
应为在不同的包下,所以才会出现这种问题的
枫叶rain 2008-01-31
  • 打赏
  • 举报
回复
应为你父类中的方法是一般的
你把父类的方法改成静态的就可以了
子类继承了父类,重载了方法,所以可以直接用的
new Parent的一个对象出来就出问题了
V紫竹V 2008-01-31
  • 打赏
  • 举报
回复
有错误吗
是一个正确的程序啊
执行结果是:
amethod in parent class
amethod in parent class
枫叶rain 2008-01-31
  • 打赏
  • 举报
回复
有错误吗
是一个正确的程序啊
执行结果是:
amethod in parent class
amethod in parent class
dracularking 2008-01-31
  • 打赏
  • 举报
回复
报的什么错?执行下来貌似没问题

62,614

社区成员

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

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