Kotlin的属性和参数有什么区别?

这里是一个简单的例子,在括号里面有一些代码(属性)

class Person(firstName: String) { .... } 

现在这里是一个在括号里面带有一些代码(参数)的函数的例子

 fun double(x: Int) { ... } 

我知道这是一个基本的问题,但作为一个初学者我很困惑。

您将参数传递给函数和构造函数,并且具有属性

在你的例子中, Person类的构造函数只有一个参数, double函数也是如此。 在这种情况下, firstName参数不是一个属性!

为了使它成为一个财产,你必须声明如下:

 class Person(firstName: String) { val firstName : String = firstName } 

Kotlin允许这个更短,这使得firstName参数成为一个属性:

 class Person(val firstName: String) 

属性和参数不一样认为:

参数 :当我们声明任何函数时:

 fun sum(a: Int, b: Int): Int { return a + b } 

带有Int返回值的两个Int参数的函数:

属性和字段:

声明属性

Kotlin课程可以有属性。 这些可以声明为可变的,使用var关键字或使用val关键字只读。

 class Address { var name: String = ... var street: String = ... var city: String = ... var state: String? = ... var zip: String = ... } 

要使用一个属性,我们只需按照名称引用它,就好像它是Java中的一个字段:

 fun copyAddress(address: Address): Address { val result = Address() // there's no 'new' keyword in Kotlin result.name = address.name // accessors are called result.street = address.street // ... return result } 

声明属性的完整语法是:

 var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>] 

首先,你的firstName也是Person类中的一个参数而不是属性 。

 // v-- a parameter declared on primary constructor class Person(firstName: String) 

您可以访问在init块或property / field声明中的主构造函数中声明的参数,例如:

 class Person(firstName: String){ val first:String init{ first=firstName } } class Person(firstName: String){ val first:String = firstName } class Person(firstName: String){ @JvmField val first:String = firstName } 

要使用关键字valvarfirstName设置为属性,例如:

 // v--- immutable property class Person(val firstName: String) // v--- mutable property class Person(var firstName: String) 

一个Kotlin属性将生成getter / setter(?)和一个后台字段(?)给java字节码。 以java代码的可变属性为例:

 public final class Person{ private String firstName; // backing field // v--- parameter public Person(String firstName){ this.firstName = firstName; } //getter public final String getFirstName(){ return firstName; } //setter public final String setFirstName(String firstName){ this.firstName= firstName; } } 

除了在主构造函数中声明的参数之外,这个参数只在函数作用域/构造函数的作用域中可见

注意 :一个参数是不可变的,就像java effective-final变量/参数一样,所以你不能在Kotlin中重新分配一个参数,例如:

 fun foo(bar:String){ bar = "baz" // ^--- compile error }