Syntax Kotlin:为什么要将字段定义为;var"/&引用;val";构造器中需要什么?

Syntax Kotlin:为什么要将字段定义为;var"/&引用;val";构造器中需要什么?,syntax,compiler-errors,compilation,kotlin,syntax-error,Syntax,Compiler Errors,Compilation,Kotlin,Syntax Error,这是一个错误: class Apple(weightInGrams: Float){ fun grow() { weightInGrams+= 2.0f } } 使您的属性成为类成员 class Apple(var weightInGrams: Float){ fun void grow() { weightInGrams+= 2.0f } } 使您的属性成为类成员 class Apple(var weightInGrams:

这是一个错误:

class Apple(weightInGrams: Float){
    fun grow() {
        weightInGrams+= 2.0f
    }
}

使您的属性成为类成员

class Apple(var weightInGrams: Float){
    fun void grow() {
        weightInGrams+= 2.0f
    }
}

使您的属性成为类成员

class Apple(var weightInGrams: Float){
    fun void grow() {
        weightInGrams+= 2.0f
    }
}

首先,与
void
(在Java中)等价的是
Unit
(在Kotlin中),并且函数返回的类型在末尾,因此应该使用
fun grow():Unit{…}
而不是
fun void grow(){…}
。此外,您可以省略
Unit
而只编写
fun grow(){…}
,因为编译器知道您的函数不会返回任何有意义的值

现在,我将尝试解释基本知识来回答您的问题,并为您提供一些清晰的信息。在Java中,构造函数的参数仅在该构造函数内部可见。在Kotlin中,参数仅在初始值设定项块和属性初始值设定项中可见,除非将其转换为属性。让我们用例子来解释这一切

在Java中,我们多次在类似这样的类中看到构造函数:

public class Person {
    public final String name;
    public final Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
这些参数用于初始化类
Person
的字段

在科特林,等价物可以是:

a) 使用初始值设定项块中的参数

class Person(name: String, age: Int) {
    val name: String
    val age: Int

    init {
        this.name = name
        this.age = age
    }
}
b) 使用类主体中声明的属性初始值设定项中的参数

class Person(name: String, age: Int) {
    val name = name
    val age = age
}
c) 声明属性并直接在主构造函数中初始化它们

class Person(val name: String, val age: Int)
因此,如果您编写
var
val
,构造函数的参数也将是属性,您将能够在类中使用它们,就像您希望在函数
grow
中所做的那样

因此,您的最终代码应该是:

class Apple(var weightInGrams: Float) {
    fun grow() {
        weightInGrams += 2.0f
    }
}

var
因为您要多次为
weightInGrams
赋值。

首先,
void
(在Java中)的等价物是
Unit
(在Kotlin中),并且a函数返回的类型在末尾,因此您应该使用
fun grow():Unit{…}
,而不是
fun void grow(){…}
。此外,您可以省略
Unit
而只编写
fun grow(){…}
,因为编译器知道您的函数不会返回任何有意义的值

现在,我将尝试解释基本知识来回答您的问题,并为您提供一些清晰的信息。在Java中,构造函数的参数仅在该构造函数内部可见。在Kotlin中,参数仅在初始值设定项块和属性初始值设定项中可见,除非将其转换为属性。让我们用例子来解释这一切

在Java中,我们多次在类似这样的类中看到构造函数:

public class Person {
    public final String name;
    public final Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
这些参数用于初始化类
Person
的字段

在科特林,等价物可以是:

a) 使用初始值设定项块中的参数

class Person(name: String, age: Int) {
    val name: String
    val age: Int

    init {
        this.name = name
        this.age = age
    }
}
b) 使用类主体中声明的属性初始值设定项中的参数

class Person(name: String, age: Int) {
    val name = name
    val age = age
}
c) 声明属性并直接在主构造函数中初始化它们

class Person(val name: String, val age: Int)
因此,如果您编写
var
val
,构造函数的参数也将是属性,您将能够在类中使用它们,就像您希望在函数
grow
中所做的那样

因此,您的最终代码应该是:

class Apple(var weightInGrams: Float) {
    fun grow() {
        weightInGrams += 2.0f
    }
}

var
因为您多次为
weightInGrams
赋值。

我知道问题已经得到了回答

如果你想用initialWeight初始化一个苹果,你可以按如下操作。
init
块可以帮助初始化值,而grow函数可以有效地处理实际变量,而无需将构造函数变量声明为
var

class Apple(initWeight: Float){
    var weightInGrams = 0.0f
    init {
        var weightInGrams = initWeight
    }
    fun grow() {
        weightInGrams+= 2.0f
    }
}
fun main(args: Array<String>) {
    val a  = Apple(10.0f)
    a.grow()
    println(a.weightInGrams)
};
苹果级(初始重量:浮动){
var weightInGrams=0.0f
初始化{
var weightInGrams=initWeight
}
快乐成长{
加权平均值+=2.0f
}
}
趣味主线(args:Array){
val a=苹果(10.0f)
a、 成长
println(a.weightInGrams)
};

我知道问题已经得到了回答

如果你想用initialWeight初始化一个苹果,你可以按如下操作。
init
块可以帮助初始化值,而grow函数可以有效地处理实际变量,而无需将构造函数变量声明为
var

class Apple(initWeight: Float){
    var weightInGrams = 0.0f
    init {
        var weightInGrams = initWeight
    }
    fun grow() {
        weightInGrams+= 2.0f
    }
}
fun main(args: Array<String>) {
    val a  = Apple(10.0f)
    a.grow()
    println(a.weightInGrams)
};
苹果级(初始重量:浮动){
var weightInGrams=0.0f
初始化{
var weightInGrams=initWeight
}
快乐成长{
加权平均值+=2.0f
}
}
趣味主线(args:Array){
val a=苹果(10.0f)
a、 成长
println(a.weightInGrams)
};

就像在java中一样,如果您不使用
var
val
使属性类成为memeber,那么它只是一个函数参数,将仅在构造函数范围内请注意
fun void grow()
将不起作用。需要像在java中一样更改为
fun grow()
,如果您不使用
var
val
使属性类memeber,那么它只是一个函数参数,将仅在构造函数范围内请注意
fun void grow()
将不起作用。需要更改为
fun grow()
构造函数中缺少
var
关键字构造函数中缺少
var
关键字