Java中有关this的一个问题
2017-03-14 19:39
176 查看
先看这样一个简单的程序:
很显然,输出结果是3.
但如果我把构造器中的this去掉呢?即,将程序改为:
class Construct {
int i=1;
Construct(int num,int i){
i=i;
}
public static void main(String[] args){
Construct ct=new Construct(2,3);
System.out.println(ct.i);
}
}
程序能否编译通过?结果又是多少?
运行之后发现,编译能够通过,而且输出结果是1.
我们注意到系统给出了一个警告:"The assignment to variable i has no effect."
这个警告说明了构造器中的“i=i”是个毫无意义的语句。
经过debug发现,在对象ct创建时,构造器中的语句没有起到任何作用,对于i的赋值直接采用的是默认值1.
如果传入参数的名称和域变量的名称相同,则必须用this来指明域变量,否则编译器将认为语义不清,从而调用其默认值。
这个问题看似简单,但如果我们在平时的编程中稍有不注意,也是很容易犯这样的错误的。
class Construct { int i=1; Construct(int num,int i){ this.i=i; } public static void main(String[] args){ Construct ct=new Construct(2,3); System.out.println(ct.i); } }
很显然,输出结果是3.
但如果我把构造器中的this去掉呢?即,将程序改为:
class Construct {
int i=1;
Construct(int num,int i){
i=i;
}
public static void main(String[] args){
Construct ct=new Construct(2,3);
System.out.println(ct.i);
}
}
程序能否编译通过?结果又是多少?
运行之后发现,编译能够通过,而且输出结果是1.
我们注意到系统给出了一个警告:"The assignment to variable i has no effect."
这个警告说明了构造器中的“i=i”是个毫无意义的语句。
经过debug发现,在对象ct创建时,构造器中的语句没有起到任何作用,对于i的赋值直接采用的是默认值1.
如果传入参数的名称和域变量的名称相同,则必须用this来指明域变量,否则编译器将认为语义不清,从而调用其默认值。
这个问题看似简单,但如果我们在平时的编程中稍有不注意,也是很容易犯这样的错误的。
相关文章推荐
- 有关java中数据类型byte,int的一个小问题
- mybatis中遇到的一个小问题【There is no result map named java.lang.Integer in this SqlMap】
- 有关JAVA Generic的一个问题
- mybatis中遇到的一个小问题【There is no result map named java.lang.Integer in this SqlMap】
- 在做JAVA和UCENTER整合登陆时一个要注意的问题
- 有关一个PB的问题,帮帮我吧!
- 一个JDK版本问题引发的思考--Java环境配置 && Eclipse的JDK配置
- 有关QT中声明一个vector为全局变量的初始化问题
- 多年困扰我的一个技术问题,希望这方面的专家指点一下,有关SQLServer并发控制方面的问题
- 一个有关JS参数的问题
- java环境变量中的一个Bug还是系统的问题
- 关于java中连接sqlite的有关问题
- 有关Context,this,getBaseContext()问题(整理)
- java一个简单的问题,大家可以看下
- 工作问题-java-一个好用的正则表达式
- 有关C++中常量字符串的一个小问题
- 一个JAVA的XSD解析问题的解决
- java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState问题解决
- 一个关于java.net.Socket的超时的问题
- java--第十周--任务一 封装一类对象,功能是随机产生一个2000年后的年份,并输出该年2月的日历页,需处理闰年的问题