public class class2 {
int x=10;
public void method2(int i){
        System.out.println("class2.m2 int i") ;
}

}
public class class3 extends class2 {
int x=100;
        public void method2(int i){
        System.out.println("class3.m2 int i") ;
}
public void method2(String s){
System.out .println("class3.m2 String s") ;

}
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
class2 c=new class3();
System.out.println(c.x);
c.method2("a");
c.method2(1);
}}
在这里为什么c.method2("a");这句编译时就出错了,这里子类不是重载了父类的method2吗,为什么这里不能调用子类的这个方法,而一定要在父类里再写个参数是String的method2才能调用,搞不太懂,请大家指点下,谢谢了

解决方案 »

  1.   

    用 class2 c 调用方法,只能调用 class2 里定义的,没啥问题啊
      

  2.   

    class2 c=new class3(); ---->>> class3 c = new class3(); 就可以了
      

  3.   

    根据你new的情况可以知道它的本质是:用父类的引用指向子类的对象,而这种方式只能调用父类的方法,第一楼的大哥解释是错误的!!!还有就是子类只是重写了父类中的方法而不是重载。解决方法二楼说的也是。
      

  4.   


    public class class2 { 
    int x=10; 
    public void method2(int i){ 
            System.out.println("class2.m2 int i") ; 
    } } 
    public class class3 extends class2 { 
    int x=100; 
            public void method2(int i){ 
            System.out.println("class3.m2 int i") ; 

    public void method2(String s){ 
    System.out .println("class3.m2 String s") ; } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    //class2 c=new class3(); 
    class3 c = new class3();//楼主一定要记住:子类可以访问父类中可访问控制的方法和属性,
    //反过来,则父类只能访问自己定义的方法和属性
    System.out.println(c.x); 
    c.method2("a"); 
    c.method2(1); 
    } }
      

  5.   

    该说的楼上几位都说的差不多了
    class2 c=new class3(); 
    //我感觉是以父类的观点看待子类,当然要调用父类的方法了
    //除非是子类重写(覆盖)了父类的方法,才会调用子类重写过的方法
    //你父类中并没有method2(String s),当然不会去调用了
      

  6.   

    樓上都說了,你的c是class2類的,但c所關聯的實例是class3類的,那麼該實例在c的引用下轉型為class2的實例
      

  7.   

    楼主好像对重载(参数不同)和重写没有搞清楚。只有子类重写了父类的方法才能被调用,而你的子类中的第二个方法只是重载了第一个方法,跟父类没有关系,你虽然new了子类,前面的定义的类型是父类,所以父类调不到这个方法。
      

  8.   

    class3 c=new class3();这样的话,父类中不是private的方法,子类不重写也能调用。 
      

  9.   

    class2 c = new class3;
    ((class3)c).method2("a"); 
    这样应该可以了,如果c是class2的实例的话,在class2里面没有method2(String s)这个方法,
    所以只能把c转化成class3的实例才能调用method2(String s)这个方法。