在 新人求解 java 中的return 问题 帖子中,附的源码有问题,现在重新发现,求帮助。
 class Yz_20 {
   protected static String c="父类Yz_20变量c";
   public static void aa(Yz_20 l){
   System.out.println("父类Yz_20中的aa方法");
   }
   protected static String bb(String a,String b){
   a="父类Yz_20中的bb方法";
   b=" 字符串b ";
   String c=a+" "+b;
   System.out.println(c);
   return c;
   }
   
} public class Yz_19 extends Yz_20{
 public Yz_19(){
 System.out.println("Lz_19的构造方法");
 }
 public String bb(){
 System.out.println("子类Yz_19中的bb方法");
 return "返回bb方法";
 }
 public static void main(String[] args){
 Yz_19 p=new Yz_19();
 Yz_20 q=new Yz_20();
 aa(p);  
Yz_20.bb("a","c"); 
q.bb("a", "b");
p.bb();

 
 }
 }运行结果
Lz_19的构造方法
父类Yz_20中的aa方法
父类Yz_20中的bb方法  字符串b 
父类Yz_20中的bb方法  字符串b 
子类Yz_19中的bb方法问题:
1.成员变量c 和成员方法 bb()中的c 是一样吗?
    我理解的是一样的,我注释了//this.c=a+b; //return this.c; 和不用this引用的结果是一样的,
2.成员方法 bb()中的return c,怎么理解?
    c在方法中的取值是父类Yz_20中的bb方法  字符串b ,return c 是将方法中的c值返回,我想既然返回,那么第二个System.out.println(c); c的输出值应该是父类Yz_20中的bb方法  字符串b ,可实际输出值是父类Yz_20变量c,return c;有结束这个方法的意思,这个c 应该和方法中的String保持一致,
3.这个return c 怎么理解,c的取值是多是,return是返回值,那么这个c的值返回到哪里去了?
4.类名.静态类成员  类名调用只能是静态方法吗?
    Yz_20.bb("a", "b");这样调用,并没有提示错误啊,bb也不是静态方法,Yz_20.bb("a", "b")a和b是字符串a、b,protected String bb(String a, String b)  中的a、b 是变量?方法调用中的a、b是对String a,String b的赋值吗? 它们之间有关系吗?是什么关系

解决方案 »

  1.   

    4个问题中,其中3和4明显有错误:第3个问题——“可实际输出值是父类Yz_20变量c,”但运行结果却没有这一行第4个问题——“Yz_20.bb("a", "b");这样调用,并没有提示错误啊,bb也不是静态方法”
    对于这句话,无力吐槽,对于类Yz_20来说,其方法bb()明明是静态方法请仔细审查问题,问题都是错误的,谁能回答啊?
    就像1+1什么时候等于3,严格来说,即使算错了,也只能在一定的概率下等于3
    谁说算错了就非要等于3呢
    还可以问1+1什么时候不等于3呢,算错了也可以不等于3
      

  2.   

    看了上面的回答也看了你的问题,有些东西不想吐槽。不过刚学都这样!
    首先结果很正确,这里楼主只要根据执行的先后顺序仔细看就会明白。
    1、成员变量c和局部变量c怎么可能相同?这里只是一种“覆盖”罢了,还有this的概念好好理解下。
    2、这个你说的我太明白?你这里问的好像与java的传值有关。两次调用父类bb方法,互不影响。
    3、只要你调用父类中的bb方法,打印的结果都是“父类Yz_20中的bb方法  字符串b” 还有c的值被保存在Yz_20.bb("a","c"); 
            q.bb("a", "b");这里(具体的我语言表示不好,也就是调用它的语句中)。4、这个。,你的问题是关于形参于实参的问题上面的东东楼主可以自己查找、验证。
      

  3.   

    其实对于这类问题是很容易理解的:
    第一:创建对象的时候会调用构造方法,如果是创建子类的对象的时候,是会先调用父类的构造方法再调用子类的构造方法。所以第一个输出应该是在创建Yz_19对象p的时候输出。
    第二:子类会默认继承父类的属性和方法,如果子类没有重写父类的方法,那么就默认调用父类的方法。所以第二个输出是aa(p)调用aa(p)方法的输出。
    第三:第三个输出是因为你指定了调用父类的bb方法,所以肯定调用的父类的输出方法,如果不要前面的类型指定输出的就应该是子类重写的方法。
    第四:这本身就存在问题 bb(参数)子类根本就没有重写,所以就只可能是父类的方法,再说静态方法最好不要用对象去调用
    第五:就是对象调用方法
    其实对于这类问题可以总结如下:
    1、父类的引用指向子类的对象
    2、在创建子类的对象的时候,会先调用父类的构造方法再执行本身的构造方法
    3、父类的引用指向子类的对象,父类不能调用子类独有的方法
    4、构造方法的作用是在创建对象的时候初始化属性
    5、如果子类重写了父类的方法,那么在方法调用的过程中遵循以下原则:静态方法和属性由类型决定,也就是你创建对象是什么类型,就由它决定你调用的是父类的属性(静态方法)还是子类的属性(静态方法)。方法是动态绑定到new的对象上的,也就是调用的方法的时候是有new 后面的对象决定的。
      

  4.   


    其次第一问,2个C不一样,你正在bb()方法中是String c,这表示重新定义了1个局部变量c和全局变量 protected static String c是2个对象。第3问:
    请试下System.out.println(bb());
    第4问,为什么 Yz_20.bb("a", "b")可行
    理由 Yz_20继承 Yz_19,而 Yz_19 中有个protected static String bb(String a,String b);
    这里调用的就是Yz_19的protected static String bb(String a,String b);看清楚了,子类可以继承父类的非private方法。