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 }
要使用关键字val
或var
将firstName
设置为属性,例如:
// 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 }