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: } 为什么第六行不报错,第七行报错的原因是?

解决方案 »

  1.   

    有错误吗
    是一个正确的程序啊
    执行结果是:
    amethod in parent class
    amethod in parent class
      

  2.   

    有错误吗 
    是一个正确的程序啊 
    执行结果是: 
    amethod   in   parent   class 
    amethod   in   parent   class 
      

  3.   

    应为你父类中的方法是一般的
    你把父类的方法改成静态的就可以了
    子类继承了父类,重载了方法,所以可以直接用的
    new Parent的一个对象出来就出问题了
      

  4.   

    报的错误是: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。
      

  5.   

    它们没有在一个包内,parent的amethod()是protect的,parent.amethod()是不可见的。由于child是parent的子类,它可以继承amethod(),因此在child包里面,
    Child child = new Child();  child.amethod()是可以的
      

  6.   

     public static void main(String []args) { 
    05:         Child child = new Child();  child.amethod(); 
    06:         Parent parent = child;   -------這是引用 
                                                    第5行已經實例化了
    07:         parent.amethod();   ------這是調用方法
    08:     }                          但你沒有實例化
      

  7.   

      Parent   parent   =   child;这句话,谁再帮我巩固下。 等于 Parent parent = new Child();  吧?   
    最后第七行  parent.amethod();       就相当于一个单独调用 9楼 yami251139 的说法。单独调用父类一个invisible的方法所以报错,是不是这样理解?
      

  8.   

    我无语了……
    明明只是一个protected关键字的问题,什么没有实例化,导入包错误之类的说法都出来了,这是哪跟哪阿?最后的解释:
    A a = new B();
    A决定了这个对象能访问哪些方法和成员变量,叫做用A来签名
    B决定了这个对象如何去初始化,调用哪个构造方法再不理解我也没办法了……
      

  9.   

    A   a   =   new   B(); 
    Parent parent = new Child();
    就是創建一個 A類型的對象a但實現的方法是從b()里面拿的吧
    就算你繼承父類   但你的方法還是從子類里面拿   他子類里又沒這個方法。。
    總歸報錯咯。。
      

  10.   

    报错是因为The   method   "amethod"   from   Parent   Class   is   not   visible,它们没有在一个包内,Parent的amethod()是protect的,parent.amethod()在Child里是不可见的。
    就算你繼承父類       但你的方法還是從子類里面拿       他子類里又沒這個方法。。 
    ....
    13楼的说法有误
    子类已经继承了amothod,在代码里虽然没有这个方法,但是
    Child   child   =   new   Child();     
    child.amethod()是可以执行的。
      

  11.   

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

  12.   

    Child child = new Child();  
    Parent   parent   =  child
    parent。amothod()。。
    你沒看懂我意思。。
    我是說他這個parent的引用類型是父類的  卻要在子類里調用父類的方法
    lz問第7行為什么報錯,我解釋一下而已
      

  13.   

    A决定了这个对象能访问哪些方法和成员变量,叫做用A来签名 B决定了这个对象如何去初始化,调用哪个构造方法。  这句很通俗,一看就懂。你第一次说签名,我不是太理解,现在清楚了。代码里边之所以有包是为了使用protected,重点不在这里。是在第六第七行上。Parent parent = child  这句是用Parent来签名,但是它的方法却应该由child来初始化和调用,而不是parent本身调用。因为amechod()方法在本题里只对child可见。