class Person(val name:String,var age:Int )
def person = new Person("Kumar",12)
person.age = 20
println(person.age)
即使成功执行了person.age=20
,这些代码行也会输出12
。我发现发生这种情况是因为我在def person = new Person("Kumar",12)
中使用了def。如果我使用var或val,则输出为20
。我知道在scala中默认的是val。这一点:
def age = 30
age = 45
...gives一个编译错误,因为默认情况下它是val。为什么上面的第一组代码行不能正常工作,但也没有错误?
发布于 2010-12-14 16:59:51
使用
def person = new Person("Kumar", 12)
您正在定义一个函数/惰性变量,它总是返回一个新的Person实例,名称为"Kumar“,年龄为12岁。这是完全有效的,编译器没有理由抱怨。调用person.age将返回这个新创建的Person实例的年龄,该值始终为12。
在写的时候
person.age = 45
您为Person类中的age属性分配了一个新值,由于age声明为var
,因此该值是有效的。如果您尝试使用新的Person对象重新分配person
,编译器将会报错
person = new Person("Steve", 13) // Error
发布于 2010-12-14 19:33:47
正如Kintaro已经说过的,person是一个方法(因为def),并且总是返回一个新的Person实例。正如您发现的那样,如果您将方法更改为var或val,它将会起作用:
val person = new Person("Kumar",12)
另一种可能性是:
def person = new Person("Kumar",12)
val p = person
p.age=20
println(p.age)
但是,代码中的person.age=20
是允许的,因为您从person
方法中返回了一个Person
实例,并且在这个实例上,您可以更改var
的值。问题是,在那一行之后,您不再有对该实例的引用(因为每次调用person
都会生成一个新实例)。
这没什么特别的,您在Java中会有完全相同的行为:
class Person{
public int age;
private String name;
public Person(String name; int age) {
this.name = name;
this.age = age;
}
public String name(){ return name; }
}
public Person person() {
return new Person("Kumar", 12);
}
person().age = 20;
System.out.println(person().age); //--> 12
发布于 2010-12-15 01:20:18
让我们看一下这个:
class Person(val name:String,var age:Int )
def person =new Person("Kumar",12)
person.age=20
println(person.age)
并用等价的代码重写它
class Person(val name:String,var age:Int )
def person =new Person("Kumar",12)
(new Person("Kumar", 12)).age_=(20)
println((new Person("Kumar", 12)).age)
看,def
是一种方法。它将在每次调用时执行,并且每次都将返回(a) new Person("Kumar", 12)
。这些在“赋值”中没有错误,因为它不是真正的赋值,而只是对age_=
方法(由var
提供)的调用。
https://stackoverflow.com/questions/4437373
复制相似问题