在 新人求解 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的赋值吗? 它们之间有关系吗?是什么关系
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的赋值吗? 它们之间有关系吗?是什么关系
对于这句话,无力吐槽,对于类Yz_20来说,其方法bb()明明是静态方法请仔细审查问题,问题都是错误的,谁能回答啊?
就像1+1什么时候等于3,严格来说,即使算错了,也只能在一定的概率下等于3
谁说算错了就非要等于3呢
还可以问1+1什么时候不等于3呢,算错了也可以不等于3
首先结果很正确,这里楼主只要根据执行的先后顺序仔细看就会明白。
1、成员变量c和局部变量c怎么可能相同?这里只是一种“覆盖”罢了,还有this的概念好好理解下。
2、这个你说的我太明白?你这里问的好像与java的传值有关。两次调用父类bb方法,互不影响。
3、只要你调用父类中的bb方法,打印的结果都是“父类Yz_20中的bb方法 字符串b” 还有c的值被保存在Yz_20.bb("a","c");
q.bb("a", "b");这里(具体的我语言表示不好,也就是调用它的语句中)。4、这个。,你的问题是关于形参于实参的问题上面的东东楼主可以自己查找、验证。
第一:创建对象的时候会调用构造方法,如果是创建子类的对象的时候,是会先调用父类的构造方法再调用子类的构造方法。所以第一个输出应该是在创建Yz_19对象p的时候输出。
第二:子类会默认继承父类的属性和方法,如果子类没有重写父类的方法,那么就默认调用父类的方法。所以第二个输出是aa(p)调用aa(p)方法的输出。
第三:第三个输出是因为你指定了调用父类的bb方法,所以肯定调用的父类的输出方法,如果不要前面的类型指定输出的就应该是子类重写的方法。
第四:这本身就存在问题 bb(参数)子类根本就没有重写,所以就只可能是父类的方法,再说静态方法最好不要用对象去调用
第五:就是对象调用方法
其实对于这类问题可以总结如下:
1、父类的引用指向子类的对象
2、在创建子类的对象的时候,会先调用父类的构造方法再执行本身的构造方法
3、父类的引用指向子类的对象,父类不能调用子类独有的方法
4、构造方法的作用是在创建对象的时候初始化属性
5、如果子类重写了父类的方法,那么在方法调用的过程中遵循以下原则:静态方法和属性由类型决定,也就是你创建对象是什么类型,就由它决定你调用的是父类的属性(静态方法)还是子类的属性(静态方法)。方法是动态绑定到new的对象上的,也就是调用的方法的时候是有new 后面的对象决定的。
其次第一问,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方法。