
Kotlin语言之面向对象编程
发布日期:2021-05-06 00:55:40
浏览次数:23
分类:原创文章
本文共 3360 字,大约阅读时间需要 11 分钟。
1. Kotlin语言之面向对象编程
这里定义了一个Person类 , 它哟有 姓名,年龄的成员变量和 eat的成员方法
class Person { var name = "" var age = 0 fun eat() { println("$name is eating. He is $age years old.") }}
接下来我们来对类进行实例化:Kotlin语言实例化的方式与Java类型, 但去掉了new关键字. 之所以这么设计, 是因为当你调用了某个类的构造函数, 你的意图就是将类进行实例化, 所以即使没有new关键字, 也能够清晰的表达你的意图.
val p = Person()
接下来在main函数中对对象p进行一些操作
fun main() { val p = Person() p.name = "Tom" p.age = 18// 调用p的 eat方法 p.eat()}
运行结果:
2. 继承与构造函数
Kotlin中一个类默认是不可以被继承的,如果想要让一个类可以被继承,需要主动声明open关键字:
open class Person {
…
}
要让另一个类去继承Person类,则需要使用冒号关键字:
class Student : Person() {
var sno = ""
var grade = 0
}
现在Student类中就自动拥有了Person类中的字段和函数,还可以定义自己独有的字段和函数。
Kotlin将构造函数分为了2种: 主构造函数和次构造函数
2.1 主构造函数
主构造函数是最常用的构造函数, 每个类都会默认的有一个不带参数的主构造函数,可以显示的它指明参数. 主构造函数没有函数体, 直接定义在类名后面即可. 如:
class Student(val sno: String, val grade: Int) : Person(){}
代码验证:
fun main() {// 将学生类实例化 并且调用它的study方法 val student = Student("11923020121", 3) student.study()}//open 表明类是可以被继承的open class Person { var name = "" var age = 0 fun eat() { println("$name is eating. He is $age years old.") }}//显示的指明学生类的参数class Student(val sno: String, val grade: Int) : Person() { fun study(){ println("grade is $grade and sno is $sno") }}
运行结果:
如果你想在主构造函数中编写逻辑, 可以使用init结构体, 所有主函数的逻辑都可以写在里面:
测试代码:
fun main() {// 将学生类实例化 并且调用它的study方法 val student = Student("11923020121", 3)// student.study()}//open 表明类是可以被继承的open class Person { var name = "" var age = 0 fun eat() { println("$name is eating. He is $age years old.") }}//显示的指明学生类的参数class Student(val sno: String, val grade: Int) : Person() {// init 这里给主构造方法添加了2个打印语句 init { println("sno is $grade") println("grade is $grade") } fun study(){ println("grade is $grade and sno is $sno") }}
运行结果:
子类的构造函数调用父类中的哪一个构造函数,在继承的时候通过括号来指定:
class Student(val sno: String, val grade: Int) : Person() { }
在这里, Person类后面的一对空括号表示Student类的主构造函数在初始化的时候会调用Person类的无参构造函数, 即使在无参的情况下, \这对括号也不能省略.如果我们将Person类改造一下,将姓名和年龄都放在主构造函数中
open class Person(val name:String,val age :Int) {}
那么Student类在继承Person类的时候,就必须给Person类的构造函数传入name和age字段
class Student(val sno:String, val grade:Int, name: String, age: Int) :Person(name, age){ init { println("sno is $sno") println("grade is $grade") println("name is $name") println("age is $age") }}
接下来是完整的代码演示
fun main() { val stu= Student("119230",3,"Tom",18)}open class Person(val name:String,val age :Int) {}class Student(val sno:String, val grade:Int, name: String, age: Int) :Person(name, age){ init { println("sno is $sno") println("grade is $grade") println("name is $name") println("age is $age") }}
运行结果:
2.2 次构造函数
任何一个类都只能有一个主构造函数, 但可以有多个次构造函数, 次构造函数也是用来实例化一个类的, 但它是有自己的函数体的所有次构造函数都必须调用主构造函数(包括间接调用) .代码演示:
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {// 第一个次构造函数 constructor(name: String, age: Int) : this("", 0, name, age) {} //第二个次构造函数 constructor() : this("", 0) {} init { println("sno is $sno") println("grade is $grade") println("name is $name") println("age is $age") }}
第一个次构造函数:接受name和age参数, 并且通过this调用了 主构造函数第二个次构造函数:空参构造函数下面用创建一些类的实例
fun main() { val stu1 = Student() val stu2 = Student("Peter", 19) val stu3 = Student("119230", 3, "Tom", 18)}
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月14日 16时24分24秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
顺序表各种功能的实现
2019-03-04
SpringMVC框架学习(十三)——全局异常处理
2019-03-04
JAVA初窥-DAY13
2019-03-04
Spring Boot (五)——配置自己的banner
2019-03-04
数组--Go语言学习笔记
2019-03-04
Spring Boot (二十一)——自定义异常处理
2019-03-04
线程池-----ScheduledExecutorService实现定时任务
2019-03-04
Redis (三)——Linux 上安装 Redis
2019-03-04
Redis踩坑(1)-----配置文件redis.conf修改后不生效问题
2019-03-04
Linux启动Nginx后访问虚拟机的ip时会出现链接不上的问题
2019-03-04
Vue学习(一)——概述及入门
2019-03-04
Vue学习(四十五)——Element-UI
2019-03-04
Docker教程(二)——Docker的安装及配置加速器
2019-03-04
MyBatis(二)——MyBatis入门实例
2019-03-04
mysql常用函数
2019-03-04
Redis 缓存击穿
2019-03-04
从零带你学习Go语言:21、 Go关键词goroutine和channel
2019-03-04
从零带你学习Go语言:23、 Go指针 、切片、 map、 结构体复习
2019-03-04
从零带你学习Go语言:22、 Go基础 、包、变量和函数、流程控制语句复习
2019-03-04