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

时间:2017-07-11 10:49:32

标签: kotlin

这是一个在括号内包含一些代码(属性)的类的简单示例

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

现在这里是一个在括号内包含一些代码(参数)的函数的例子

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

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

3 个答案:

答案 0 :(得分:9)

参数传递给函数和构造函数,具有属性

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

要使其成为属性,您必须声明:

class Person(firstName: String) {

  val firstName : String = firstName
}

Kotlin允许此更短,这使得firstName参数可用作属性:

class Person(val firstName: String)

答案 1 :(得分:0)

属性和参数是不同的想法:

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

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>]

答案 2 :(得分:0)

首先,您的firstName也是parameter,而不是Person类中的property

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

您可以在init块或属性/字段声明中访问primary constructor上声明的参数,例如:

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
}

firstName设为属性,您可以使用关键字valvar,例如:

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

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

Kotlin属性将生成getter / setter(?)和backing field(?)到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 有效最终变量/参数,因此您无法重新分配参数在Kotlin,例如:

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