黑马程序员技术交流社区
标题: 这个题我怎么看不懂呢,标号3 的地方 [打印本页]
作者: 细听风语为梧桐 时间: 2016-9-4 21:50
标题: 这个题我怎么看不懂呢,标号3 的地方
分析如下所示的Java代码,则选项中的说法正确的是( )。
class Parent{---------------------------------------b
public String name;
public Parent(String pName){
this.name = pName;
}
}
public class Test extends Parent { //1
public Test(String Name){ //2
name="hello"; //3
super("kitty"); //4 //super()语句必须放在第1行,死规定,记住.
}
}
A. 第2行错误,Test类的构造函数中参数名称应与其父类构造函数中的参数名相同
B. 第3行错误,应使用super关键字调用父类的name属性,改为super.name="hello";
C. 第4行错误,调用父类构造方法的语句必须放在子类构造方法中的第一行
D. 程序编译通过,无错误
-----------------------------------------------------------------------
标号 3 的地方怎么是“hello”赋值给 方法的参数啊?
作者: sjb201609 时间: 2016-9-4 22:14
这一行就是把"hello"赋给name 虽然传进来了String Name 但是不用
作者: 细听风语为梧桐 时间: 2016-9-4 23:32
这个name 是成员变量还是 方法中的参数啊
作者: 小超超 时间: 2016-9-4 23:38
我好想也看不懂
作者: Toxicant 时间: 2016-9-5 00:30
super调用了父类的构造方法,然后对父类的参数赋值
作者: MarsBong 时间: 2016-9-5 00:40
第一,super()必须放第一行,第二,name="hello" 这里子类将自己的name属性赋值,虽然构造方法有参数,但是没用上,就是说,使用构造方法创建多个不同name参数的对象,实际name都是一个值,第三,具体区分是叫hello还是kitty,分情况,如果是使用多态,父类引用指向子类对象,那么调用后,获取到的name为父类自己的kitty,否则是子类的hello
作者: sjb201609 时间: 2016-9-5 12:59
赋给成员变量中name
作者: obvilion 时间: 2016-9-5 13:20
我来说一下吧
这道题答案是C,是单选题
A错了,构造方法的格式不能改,其他的随意,例如参数列表可以不一样,
B错了,当父类的属性定义为public时,子类对象在写代码时,可以通过三种方式直接对其修改,<super.name>;<this.name>和<name>,虽然说在编译时JVM对这三种代码默认的都是调用super.name;本人做过测试,无论是哪一种生成的.class的文件内容一模一样.
C对了,这是因为若第一行不是父类的构造方法,JVM默认加上一条父类的空参构造,而构造方法不能同时出现两条或两条以上,所以会导致编译器在编译时发生错误;所以C是正确的.
D错了,既然C对了,那么说明在编译期出现了错误,所D的说法是错误的
作者: 细听风语为梧桐 时间: 2016-9-5 21:36
xiexie谢谢你的解答
作者: heilashi 时间: 2016-9-5 21:46
name是从父类继承过来的成员变量,在子类中赋值。没问题啊
作者: obvilion 时间: 2016-9-6 09:15
关于B
昨天写的时候有点不全面,没有抓住核心思想,整个人被4×4的问题弄得头大
下面关于B的补充说明;
换一个思路进行理解.这个思路比之前的清晰一些而且易理解:
以下基于就近原则:
就这道题而言;当子类代码块中出现name时,JVM会优先去找参数列表看列表中是否有name,有就会使用列表中的name变量,没有的话就会自动在name前面加上一个this.用于访问本类的成员变量name,如果在本类中找不到,就会将this.替换为super.先去找直接父类中的非私有(没有用private修饰的)的成员变量name,直接父类中找不到,就去找间接父类一直上溯到object类,找到最近的一个可使用的name;找到就使用,找不到就编译报错;使用this.也是同理
作者: wb277379322 时间: 2016-9-6 09:48
学习了一下
作者: 小菜白白白 时间: 2016-9-6 10:01
public Test(String Name){ //2 name="hello";
作者: 小菜白白白 时间: 2016-9-6 10:03
public Test(String Name){ //2
name="hello";
Test方法中形参是Name 不是name,而name是从父类继承过来的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |