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
关键字