kotlin 复制对象属性_Kotlin面向对象编程笔记

Kotlin是基于Java的语言,所以Kotlin也是一种面向对象的语言,如果你熟悉Java,你应该很快可以上手,这篇文章假设你已经熟悉Java语言了。

1. 类与构造函数

Kotlin中的类与接口和Java中的有些区别。

Kotlin中接口可以包含属性申明。

Kotlin的类申明,默认是final和public的。

Kotlin的嵌套类并不是默认在内部的,他们不包含外部类的隐私引用。

Kotlin的构造函数,分为主构造函数和次构造函数。

Kotlin中可以使用data关键字来申明一个数据类。

Kotlin中可以使用object关键字来表示单例对象、伴生对象等。

Kotlin的类由下面几部分组成:

构造函数和初始化块。

属性

函数

嵌套类和内部类

对象申明

1.1 类的声明

使用class关键字声明,这个跟Java是一样的,如果你申明的类不包含任何东西的话,可以自己class后面直接写上类名。

class Person

1.2 构造函数

在Kotlin中可以有一个主构造函数,一个或者多个次构造函数。

主构造函数

主构造函数直接跟在类名后面,如下:

open class Person constructor(var name: String, var age: Int) : Any() {

...

}

主构造函数中申明的属性可以是可变的(var)也可以是不变的(val)。如果主构造函数没有任何注解或者可见性修饰符,可以省略constructor关键字,而且Koltin中的类默认就是继承Any的,也可以省略。所以可以简化成如下:

open class Person(var name: String, var age: Int) {

...

}

如果这个类是有注解或者可见性修饰符,那么constructor关键字不可少,如下:

class Student @MyAutoware public constructor(name: String, age: Int) : Person(name, age) {

...

}

主构造函数不能包括任何代码。初始化代码可以放到以init关键字作为前缀的初始化块中:

class Student @MyAutoware public constructor(name: String, age: Int) : Person(name, age) {

init {

println("Student(name = $name, age = $age) created")

}

}

主构造函数的参数可以在初始化块中使用,也可以在类体内申明的属性初始化器中使用。

次构造函数

我们也可以在类体中使用constructor申明次构造函数,次构造函数的参数不能使用val或者var申明。

annotation class MyAutoware

class Student @MyAutoware public constructor(name: String, age: Int) : Person(name, age) {

var grade: Int = 1

init {

println("Student(name = $name, age = $age) created")

}

constructor(name: String, age: Int, grade: Int) : this(name, age){

this.grade = grade

}

}

如果一个类有主构造函数,那么每个次构造函数都需要委托给主构造函数,委托到同一个类的另一个构造函数可以使用this关键字,如上面这个例子this(name, age)

如果一个非抽象类没有申明任何构造函数(包括主或者次),它会生成一个不带参数的主构造函数。构造函数的可见性是public。

私有的主构造函数

如果我们不希望这个类被实例化,我们可以申明如下:

class CantCreateMe private constructor()

037dd04b3186

cancreateme

当然我们可以通过次构造函数来创建。

class CantCreateMe private constructor(){

var name: String = ""

constructor(name: String) : this() {

this.name = name

}

}

1.3 属性

class Point{

var x:Int = 0

var y:Int = 0

}

fun main(args: Array) {

val p = Point()

p.x = 8

p.y = 10

println("Point(x = ${p.x}, y = ${p.y})")

}

可以看出Kotlin中的类的字段自动带有getter和setter方法,比Java会简洁很多。

1.3 方法(函数)

class Point{

var x:Int = 0

var y:Int = 0

operator fun plus(p: Point) {

x += p.x

y += p.y

}

}

fun main(args: Array) {

val p = Point()

p.x = 8

p.y = 10

val p1 = Point()

p1.x = 2

p1.y = 3

val p2 = p + p1

println("Point(x = ${p.x}, y = ${p.y})")

}

2. 抽象类

下面就是一个抽象类,类需要用abstract修饰,其中也有抽象方法,跟Java有区别的是Kotlin的抽象类可以包含抽象属性。

abstract class Person(var name: String, var age: Int){

abstract var addr: String

abstract val weight: Float

abstract fun doEat()

abstract fun doWalk()

fun doSwim() {

println("I am Swimming ... ")

}

open fun doSleep() {

println("I am Sleeping ... ")

}

}

2.1 抽象函数(方法)

在上面这个抽象类中,有doEat和doWalk抽象函数,同时还有具体的实现函数doSwim,在Kotlin中如果类和方法没有修饰符的化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值