Kotlin 教程 在线

2291Kotlin 基本数据类型

@刘义 的说法是对的,但不完整;@RomanLuo 的说法也对,但也只在 [-128, 127] 范围之外有效。

下面给一个完整的用例,包含了所有情况,供大家参考。

注意其中 Int 和 Int? ,127 和 128 之间的区别。

// Int? Int? Int?
val a1: Int? = 128
var boxedA: Int? = a1
var boxedB: Int? = a1
log(" boxedA === boxedB ? " + (boxedA === boxedB))//true
log(" boxedA == boxedB ? " + (boxedA == boxedB))//true

// Int Int? Int?
val a2: Int = 128
boxedA = a2
boxedB = a2
log(" boxedA === boxedB ? " + (boxedA === boxedB))//false
//值相等
log(" boxedA == boxedB ? " + (boxedA == boxedB))//true

// Int? Int? Int?
val a3: Int? = 127
boxedA = a3
boxedB = a3
log(" boxedA === boxedB ? " + (boxedA === boxedB))//true
//值相等
log(" boxedA == boxedB ? " + (boxedA == boxedB))//true

// Int Int? Int?
val a4: Int = 127
boxedA = a4
boxedB = a4
log(" boxedA === boxedB ? " + (boxedA === boxedB))//true
//值相等
log(" boxedA == boxedB ? " + (boxedA == boxedB))//true



// Int Int Int
val a5: Int = 128
val boxedA2: Int = a5
val boxedB2: Int = a5

log(" boxedA === boxedB ? " + (boxedA2 === boxedB2))//true
//值相等
log(" boxedA == boxedB ? " + (boxedA2 == boxedB2))//true

2290Kotlin 基本数据类型

RomanLuo 这个说法有误导性:

val num: Int = 10000
val num1: Int = num
val num2: Int = num
println(num1 === num2)  //true

这里判断为地址相同不是因为有没有显示声明类型,而是类型都相同,都是数值类型,没有进行装箱操作。而案例中的类型是 Int? 可空类型,类型不同所以必须装箱,导致产生一个新对象。

2289Kotlin 基本数据类型

val a = 10000//不显示声明类型不会封装新对象
val boxedA = a
val anotherBoxedA = a
println(boxedA === anotherBoxedA) //  true

2288Kotlin 基本数据类型

val a: Int = 100
println(a === a) // true,值相等,对象地址相等

//经过了装箱,创建了两个不同的对象
val boxedA: Int? = a
val anotherBoxedA: Int? = a

//虽然经过了装箱,但是值是相等的,都是100
println(boxedA === anotherBoxedA) //  true,值相等,128 之前对象地址一样
println(boxedA == anotherBoxedA) // true,值相等

这里我把 a 的值换成 100,这里应该跟 Java 中是一样的,在范围是 [-128, 127] 之间并不会创建新的对象,比较输出的都是 true,从 128 开始,比较的结果才为 false。

2287Kotlin 基础语法

输入两个数据进行相乘:

import java.lang.Integer.parseInt
import java.util.*
fun main(args: Array<String>) {
  //    Greeter("me!").greet()          
  // 创建一个对象不用 new 关键字    
  println("请输入一个整数:")    
  val scannerX = Scanner(System.`in`)
  val x = scannerX.next().toString() 
  println("请输入另一个整数:")  
  val scannerY = Scanner(System.`in`) 
  val y = scannerY.next().toString()    //直接使用 x*y会导致错误   
  val s = parseInt(x)*parseInt(y)!!.toInt()  
  println("两数乘积为:" + s.toString())
}