本帖最后由 huyang936 于 2015-2-5 00:37 编辑
- <p>package cn.itcast;
- /****************调用出错******************************************************************************/
- class Person {
- String name;//加static
- String department;
- int age;//加static
- int num = age;
- public Person()
- {
- System.out.println(name+"::"+age);
- }
- public Person(String n) {
- name = n;
- }
- public Person(String n, int a) {
- name = n;
- age = a;
- }
- public Person(String n, String d, int a) {
- // 完成Person(String n, int a)的逻辑
- this(name,age); //【【【此处调用出错】】】
- department = d;
- }
- }
- /****************加static后,错误解除******************************************************************************/
- package cn.itcast;
- class Person {
- static String name;//加static
- String department;
- static int age;//加static
- int num = age;
- public Person()
- {
- System.out.println(name+"::"+age);
- }
- public Person(String n) {
- name = n;
- }
- public Person(String n, int a) {
- name = n;
- age = a;
- }
- public Person(String n, String d, int a) {
- // 完成Person(String n, int a)的逻辑
- this(name,age); //【【【问题解除】】】
- department = d;
- }
- }
- </p>
复制代码
第23道选择题:
1. 给出下面的不完整的类代码 class Person { String name, department; int age; public Person(String n){ name = n; } public Person(String n, int a){ name = n; age = a; } public Person(String n, String d, int a) { // 完成Person(String n, int a)的逻辑 department = d; } } 下面的哪些表达式可以加到构造方法中的注释处? ( ) A. Person(n,a); B. this(Person(n,a)); //构造函数的名字不能当方法名调用; C. this(n,a); D. this(name,age); //构造方法的参数也不能直接传实例变量名
D选项:“构造方法的参数也不能直接传实例变量名”: 如下图测试的那样,加static后就能使用呀,这个到底是怎么理解的呢???求解释!!!
**************************************************************************************************************************************** 晚上回来又看了看这个问题,在网上找到了我认为合理的解释,大家不妨也看下 问题原因: Cannot refer to an instance field name while explicitly invoking a constructor 明确调用一个构造器的时候不能引用类的一个实例域 原因分析:
全都没讲到点子上。报错这和final没有任何关系。举个列子
public int i=1;
public MyThing(){
super(i);
}
原因很简单,我们假如可以通过编译器。我问一个问题,调用构造器是干什么的?
大家都知道,创建一个对象并初始化对象中的数据域。红色字体很重要,在上面的列子中new MyThing()的作用就是为了初始化这个对象的数据域i,试问在没有通过构造器初始化之前,i的值是不确定的。我们怎么能使用一个不确定的i值来初始化对象。
打个比方:我们去银行取5元钱,但是必须首先交5块钱手续费(也就是首先明确初始化)。我能不能给银行的人说:你把5元先取给我,然后我再把这钱给你交手续费呢???
当然例子不是很恰当,但说的意思差不多。总之,必须要先明确初始化实例域,才能创建好对象,进而才能使用对象的数据域。在没有实例化之前就想使用他,就像没有取出5元钱就想先用这钱一样,不可能。
public int i=1;
public MyThing(int j){
super(j);
}
上面的代码就可以,为什么,因为编译器知道,你如果想构造这个对象,必须传过来一个确定的值来初始化。
|