我是java的新手并试图理解在java中使用这个关键字。根据文档,如果实例和局部变量具有相同的名称,则局部变量会掩盖实例变量。我们使用此关键字以便实例变量可能不是由本地变量掩盖.Below是我写的程序,用于理解这个关键工作的使用,但即使在使用这个关键字后,实例变量仍然被掩盖。
class Box{
int height=5;
int length=10;
int breadth=15;
int CalcVol(){
int vol = height*breadth*length;
return vol;
}
Box(int height, int length,int breadth){
this.height = height;
length = length;
breadth = breadth;
System.out.println("height is " + height);
}
}
class MyBox{
public static void main(String args[]){
Box mybox1 = new Box(10, 20, 30);
int vol=mybox1.CalcVol();
System.out.println("volume is" + vol);
}
}
我在想的是变量"身高"打印在Box构造函数中应该打印5即实例变量的值但是它的打印10即作为参数传递的值。请帮我这个。
答案 0 :(得分:1)
您需要在要访问的每个字段之前添加this
:
Box(int height, int length,int breadth){
// ...and move this statement to the beginning, otherwise this.height gets overriden.
System.out.println("height is " + this.height);
this.height = height;
this.length = length;
this.breadth = breadth;
}
否则,length = length
和breadth = breadth
无效。
答案 1 :(得分:1)
这是名称冲突问题。
在构造函数Box
中有参数height
,length
和breadth
。这些也是Box
中三个字段的名称。
在Java中,人们认为成员变量和块变量是"更接近"比场变量。因此,如果您对两者使用完全相同的名称(正如您所做的那样),那么分配
height = height
将参数高度分配给它所拥有的完全相同的值(实际上是一个noop)。
要避免此问题,您需要指定您要分配的 height
。
this.height = height;
这是"这个班级的高度"或"场高"。当没有名称冲突时,编译器会认为你的意思是字段变量;因为块中没有其他名称。
顺便说一句,这是了解如何使用final
关键字的一个非常好的理由。 Final
表示变量只能分配一次,而且只能分配一次。它可以防止在您可能永远不会想要的情况下重新分配它。
例如
public Box(final int height, final int width, final int breadth) {
然后会在
上抛出一个恭维错误 height = height;
因为您正在重新分配高度值。这些技术在编写代码时非常有价值,因为当你真正编写参数赋值时,它们会阻止你编写你认为是字段赋值的东西。
答案 2 :(得分:0)
您正在此处执行作业,这将使this.height
获取参数height
的值。
this.height = height;
如果您要打印this.height
的原始值,请将打印件放在作业上方并使用this.height
进行打印。
System.out.println("height was " + this.height);
更完整的是,您的构造函数应该如下所示。请注意,每次访问由局部变量遮蔽的任何实例变量时,都需要使用this
关键字作为前缀。
Box(int height, int length,int breadth){
System.out.println("height was " + this.height);
this.height = height;
this.length = length;
this.breadth = breadth;
}
答案 3 :(得分:0)
对于你的班级:
class Box{
int height=5;
int length=10;
int breadth=15;
Box(int height, int length,int breadth){
this.height = height;
length = length;
breadth = breadth;
System.out.println("height is " + height);
}
}
构建Box时,会发生以下情况:
height
正在设置为构造函数参数height
length
正在设置为自身(不更改实例变量length
)breadth
正在设置为自身(不更改实例变量breadth
)。你可能想在构造函数中做的是使用传递给构造函数的值设置实例变量,如下所示:
Box(int height, int length,int breadth){
this.height = height;
this.length = length;
this.breadth = breadth;
}
答案 4 :(得分:0)
我认为OP不是在理解Java中this
键盘的用法,而是在理解面向对象编程时不会理解,当看到值已经改变时,他正在尝试打印出“5”。一旦理解了这个概念,this
关键字就会变得更加混乱。
假设您有类Box,它只有一个值,高度:
class Box {
// This is a instance variable, that is, each new instance of Box
// has a different height variable even if they are all equal to 5
// initially. It's a different variable in memory.
int height = 5;
// Here's our constructor that sets this instance's value of height
Box(int height){
this.height = height;
}
当您制作一个新的Box时,您正在制作一个新的 Box对象 - 对于每个对象,高度最初将从5开始,但您正在更改该Box实例的高度 在你的构造函数中。
Box box1 = new Box(10); // Height was originally 5, but changed to 10 in the constructor
Box box2 = new Box(20); // Height was originally 5, but changed to 20 in the constructor
Box box3 = new Box(30); // Height was originally 5, but changed to 30 in the constructor
当您到达原始程序中的以下代码行时:
System.out.println("height is " + height);
如果它是this.height
或height
并不重要,它将从不返回5. 您已经更改了实例高度的值构造
那么。我们如何打印出5的默认高度?你不能。没有相同的变量名称。您必须在类中定义常量(如final int HEIGHT = 5
),它们表示该类的默认值,或者使用另一个不设置这些值的构造函数。
class Box{
int height=5;
int length=10;
int breadth=15;
int CalcVol(){
int vol = height*breadth*length;
return vol;
}
Box() {
System.out.println("height is " + height);
}
Box(int height, int length,int breadth) {
this.height = height;
this.length = length;
this.breadth = breadth;
System.out.println("height is " + height);
}
}
class MyBox{
public static void main(String args[]){
Box mybox1 = new Box(10, 20, 30); // this will never print 5, and always 10
Box mybox2 = new Box(); // this will always print 5
}
}
但是,如果您移动打印语句上方,并使用this.height
,就像Maxim Bernard那样,那么它将打印出5,因为我们还没有更改值
Box(int height, int length,int breadth) {
System.out.println("height is " + this.height); // this will print out 5
this.height = height;
this.length = length;
this.breadth = breadth;
}
如果这真的令人困惑,而不是试图理解Java的this
关键字,我建议只阅读一些关于OOP的文章。您会理解,this
只是意味着类的当前实例。