先看如下代码:class Country {    String name="xianfan";     String value(String name) {       name = "China";       return name;    }} class City extends Country {    String name;     String value(String name) {    name = "Hefei";super.value("失败");       System.out.println(name);       System.out.println(super.name);       return name;    }     public static void main(String[] args) {       City c=new City();       c.value("成功");    }}    结果为:Hefeixianfan
各位进来的兄弟们,我的问题是:
子方法是,子类调用带参的super.value(xxx).父类的相应方法执行后不能改变父类成员变量的值name
而我试过只要不带参如super.value().(相应方法进行必要修改后)却能改变父类中的成员变量name的值。

解决方案 »

  1.   


    class Country {    String name="xianfan";    String value(String name) {      name = "China";      return name;    }}String name="xianfan";与 name = "China"
    你估计认为这两个name是一个变量,应该是两个变量,你传参数的变量只改变name = "China",而你输出的name与super.name(),是方法外定义的那个,String name="xianfan"与name = "Hefei"; 一直没有改变,所以把你搞混乱了,建议你给参数改个名字,你再试试,应该没问题了
      

  2.   


    name = "China"; 改成this.name = "China";
      

  3.   

    在你的程序里,value函数中存在与成员变量“name”相同的变量!这个导致value方法无法改变成员变量name!如果同名时你非要改变成员变量name!则要用this限制一下,d代码如下:
    class Country {     String name="xianfan";    public  String value(String name) {       name = "China";       return name;     } 
       
       //以下为测试代码
       
       /*public static void main(String[] args) {     Country co=new Country();       // co.value("成功"); 
          System.out.println(co.value("成功")); 
          System.out.println(co.name); 
        } */
    } class City extends Country {     String name;     public String value(String name) {     this.name = "Hefei";      super.value("失败");       System.out.println(name);       System.out.println(super.name);       return name;     }     public static void main(String[] args) {       City c=new City(); 
          
          System.out.println("执行方法value前成员变量"+c.name);       c.value("成功"); 
          
          System.out.println("执行方法value后成员变量"+c.name); 
        } 

      

  4.   

    你这个用法也太\奇怪了 呵呵 参数和变量当成一个了 那\肯定是错的 不过这个java怎么判断return的就是类的属性 而修改的正好是参数的值呢 不过似乎也应该是这样 呵呵
      

  5.   

    LZ,很简单,你的2个打印语句中,第一个name指向的是子类中方法的参数,而第二个super.name指向的是父类中的属性name,所以打印的第二句话就是父类的属性name值;
    而且父类中的SUPER方法没有修改父类中属性name,它只修改了方法中参数name
      

  6.   

     
    楼主问题是:
    调用c.value("成功");  第一个 输出语句就输出方法里面声明的确  name = "Hefei"; 
     第二个 输出语句就父类的确String name="xianfan";  因为
    super.name就是引用父类String name="xianfan"; 
      

  7.   

    super 和this 的用法,变量的作用范围,必学的东西!
      

  8.   

    是你没有把成员变量和局部变量区分开,
    你可以用ECLIPSE中的DEBUG调试下就知道了,
    下面是注释的代码:package net.csdn.blog.johnston;public class City extends Country { String name;    String value(String name) {    name = "Hefei";    super.value("失败");      System.out.println(name);      System.out.println(super.name);      return name;    }    public static void main(String[] args) {      City c=new City();      c.value("成功");    } }class Country {    String name="xianfan";    String value(String name) {      name = "China"; //此处应该改为this.name = "China";就是类的成员变量,否则还是你局部变量,你在后面输出的是类Country在成员变量      return name;    }} 
      

  9.   

    首先谢谢各位的回复。都仔细看了遍。其实是我有点没搞清楚:当父类方法String value(String name){name="china"} 变为String value(){name="china"}时,这时方法里的name就是指的成员变量,所以调用super.value()能修改。原来单独着清楚,跟带参的一比,我说怎么一个能改一个不能改了,哈哈。太菜了~~