A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

分析如下所示的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”赋值给 方法的参数啊?

13 个回复

倒序浏览
这一行就是把"hello"赋给name  虽然传进来了String Name 但是不用
回复 使用道具 举报
sjb201609 发表于 2016-9-4 22:14
这一行就是把"hello"赋给name  虽然传进来了String Name 但是不用

这个name 是成员变量还是 方法中的参数啊
回复 使用道具 举报
我好想也看不懂
回复 使用道具 举报
Toxicant 来自手机 中级黑马 2016-9-5 00:30:25
报纸
super调用了父类的构造方法,然后对父类的参数赋值
回复 使用道具 举报
第一,super()必须放第一行,第二,name="hello"  这里子类将自己的name属性赋值,虽然构造方法有参数,但是没用上,就是说,使用构造方法创建多个不同name参数的对象,实际name都是一个值,第三,具体区分是叫hello还是kitty,分情况,如果是使用多态,父类引用指向子类对象,那么调用后,获取到的name为父类自己的kitty,否则是子类的hello
回复 使用道具 举报
细听风语为梧桐 发表于 2016-9-4 23:32
这个name 是成员变量还是 方法中的参数啊

赋给成员变量中name
回复 使用道具 举报
我来说一下吧
这道题答案是C,是单选题
A错了,构造方法的格式不能改,其他的随意,例如参数列表可以不一样,
B错了,当父类的属性定义为public时,子类对象在写代码时,可以通过三种方式直接对其修改,<super.name>;<this.name>和<name>,虽然说在编译时JVM对这三种代码默认的都是调用super.name;本人做过测试,无论是哪一种生成的.class的文件内容一模一样.
C对了,这是因为若第一行不是父类的构造方法,JVM默认加上一条父类的空参构造,而构造方法不能同时出现两条或两条以上,所以会导致编译器在编译时发生错误;所以C是正确的.
D错了,既然C对了,那么说明在编译期出现了错误,所D的说法是错误的
回复 使用道具 举报
obvilion 发表于 2016-9-5 13:20
我来说一下吧
这道题答案是C,是单选题
A错了,构造方法的格式不能改,其他的随意,例如参数列表可以不一样,

xiexie谢谢你的解答
回复 使用道具 举报
name是从父类继承过来的成员变量,在子类中赋值。没问题啊
回复 使用道具 举报

关于B
昨天写的时候有点不全面,没有抓住核心思想,整个人被4×4的问题弄得头大
下面关于B的补充说明;
换一个思路进行理解.这个思路比之前的清晰一些而且易理解:
以下基于就近原则:
就这道题而言;当子类代码块中出现name时,JVM会优先去找参数列表看列表中是否有name,有就会使用列表中的name变量,没有的话就会自动在name前面加上一个this.用于访问本类的成员变量name,如果在本类中找不到,就会将this.替换为super.先去找直接父类中的非私有(没有用private修饰的)的成员变量name,直接父类中找不到,就去找间接父类一直上溯到object类,找到最近的一个可使用的name;找到就使用,找不到就编译报错;使用this.也是同理
回复 使用道具 举报
学习了一下
回复 使用道具 举报
public Test(String Name){               //2       name="hello";  
回复 使用道具 举报
public Test(String Name){               //2
      name="hello";  
Test方法中形参是Name  不是name,而name是从父类继承过来的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马