kotlin基础教程之类和继承
作者:Losileeya 发布时间:2023-09-24 07:55:53
kotlin基础教程之类和继承
类声明
使用class关键字声明类,查看其声明格式:
: modifiers ("class" | "interface") SimpleName
typeParameters?
primaryConstructor?
(":" annotations delegationSpecifier{","})?
typeConstraints
(classBody? | enumClassBody)
最简略的类声明至少包括 modifiers class SimpleName,如:
class Empty
modifiers
包括 classModifier 和accessModifier:
classModifier: 类属性修饰符,标示类本身特性。
abstract //抽象类标示
final //标示类不可继承,默认属性
enum //标示类为枚举
open //类可继承,类默认是final的
annotation //注解类
accessModifier: 访问权限修饰符
private //仅在同一个文件中可见
protected //同一个文件中或子类可见
public //所有调用的地方都可见
internal //同一个模块中可见
构造函数声明
可以声明一个主构造函数(primary constructor)和多个次级构造函数(secondary constructor),二者都是可选的。
primary constructor声明
作为类声明的头部存在,类声明结构:
class User constructor(name:String)
当constructor前无修饰符(如:private)时,constructor可以省略:
class User(name:String)
当是无参构造函数时,整个构造函数部分也可以省略,省略的构造函数默认是public的:
class User
primary constructor 初始化
由于primary constructor不能包含任何代码,因此使用 init 代码块对其初始化,同时可以在初始化代码块中使用构造函数的参数:
class User(name:String){
init{
//初始化..
}
}
可以类中初始化属性:
class User(name:String){
var customName = name.toUpperCase() //初始化属性
}
secondary constructor声明
使用constructor前缀声明,且必须调用primary constructor,使用this关键字:
class User(name:String){
/**secondary constructor**/
constructor(name:String,age:Int):this(name){
//初始化...
}
}
声明构造函数时,允许指定参数默认值,若所有参数都被指定默认值然后编译,编译器会生成一个额外的无参构造函数来使用初始化属性为初始值。
class User(name:String = “”)
作为校验,上述声明方式允许如下调用:
var user = User()
var anotherUser = User("jason")
若构造函数中并非所有参数都有默认值,则不会生成默认无参构造函数:
class User(name:String = "",age = Int)
var user = User() //将无法编译通过
var anotherUser = User("jason",18) //合法声明
实例化
无需new关键字,即可实例化对象:
var user = User()
继承(Inheritance)
Any
所有类都继承该类,提供默认的三个函数:
equals()
hashCode()
toString()
继承声明
在类的构造函数之后使用 : 标示继承:
class Student(name:String,age:Int):User(name,age){
}
当类未声明构造函数时,继承其他类时,也不需要在primary constructor中显示的声明构造函数,必须在secondary constructor中显示调用父类构造函数,若父类有多个构造函数,可选择其一进行调用:
/**用户基类**/
open class User(name:String){
/**secondary constructor**/
constructor(name:String,age:Int):this(name){
//初始化
}
}
/**子类继承User类**/
class Student:User{
/**构造函数**/
constructor(name:String):super(name){
}
/**另外一个构造函数**/
constructor(name:String,age:Int):super(name,age){
}
}
所有类定义时默认是final属性,不可被继承。若需要继承,使用open关键字进行修饰。
方法重载
方法默认是final的,不可被子类重载,若需要被重载,使用关键词 open 进行修饰,子类重载方法使用 override 关键词:
open class User{
open fun study(){}
fun run(){}
}
class Student:User{
override fun study(){}
}
override修饰的方法,默认是可以被继承的。若希望不被继承,可以使用 final 关键词修饰。
final override fun study(){}
重载规则
当类同时继承类和实现接口,且有相同方法,且相同方法都有实现时,需要在重载方法中调用所继承的方法,使用关键词 super ,T表示所继承或实现的接口:
open class User{
open fun study(){}
}
interface Reading{
fun study(){}
}
class Student:User(),Reading{
override fun study(){
super<User>.study()
super<Reading>.study() //与上者至少二选其一
}
}
当接口未实现方法时,默认为父类User的study方法,不需要调用所继承的方法:
interface Reading{
fun study()
}
class Student:User(),Reading{
override fun study(){
//do nothing
}
}
抽象类
Kotlin中的抽象类允许有abstract修饰的成员方法,非抽象类不允许有抽象方法;
abstract class User{
abstract fun study()
}
class Person{
abstract fun study() // 编译错误
}
抽象类默认是可被继承的,接口是特殊的抽象类,允许有抽象方法:
interface Reading{
abstract fun reading()
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


猜你喜欢
- 这是一个介绍基本异常处理的小例子,包括抛出,捕获,断言,日志。Java异常处理通过5个关键字try、catch、throw、throws、f
- final,static,this,super 关键字总结正文开始@Assassin1. final 关键字:final 关键字,意思是最终
- 员工管理系统要求如下:通过面向对象的编程思想,实现员工信息的增删改查,存储结构为数组。限定数组长度为100。实现页面:添加员工查找员工修改员
- 前言这几天同事跟我在升级Android target SDK和build tool版本的时候,碰到了一个非常搞笑的问题,基本可以算作是“坑”
- Java中有四种权限修饰符publicprotected(default)private同一个类yesyesyesyes同一个包yesyes
- tasks下面的代码展示了三个Gradle task,稍后会讲解这三者的不同。 task myTask { println "He
- List<T>.sort()可以实现对T的排序,比如List<int>.sort()执行后集合会按照in
- 前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的、搞前端的甚至是是搞后端的都跑过来凑热闹,一时之
- 使用正则表达式,效率较高public boolean canParseInt(String str){if(str == null){ //
- 我们首先看下BASEJDBC的写法实例:package com.dao;import java.sql.Connection;import
- namespace ConsoleTest{ class Program
- 挂起和恢复线程 Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已
- 本文实例为大家分享了java实现双色球机选 * 的具体代码,供大家参考,具体内容如下双色球号码1~32不重复选6个(排序好),1~16中
- Spring boot 2.1.X整合Elasticsearch最新版的一处问题新版本的Spring boot 2的spring-boot-
- 为什么是MVI而不是MVVMMVVM作为流行的架构模式,应用在 Compose上,并没有大的问题或者设计缺陷。但是在使用期间,发现了并不适合
- 基础编程模型和数据抽象把描述和实现算法所用到的语言特性,软件库和操作系统特性总称为基础编程模型。编写递归代码注意的点:1. 递归总有一个最简
- 前言不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息。获取用户信息就是获取公众号下微信用户的
- 本文实例为大家分享了unity实现虚拟摇杆控的具体代码,供大家参考,具体内容如下using UnityEngine;using UnityE
- 在C#中 “\”是特殊字符,要表示它的话需要使用“\\”。由于这种写法不方便,C#语言提供了@对其简化。只要在字符串前加上@即可直接使用“\
- 由于 python 本身为脚本语言,且经常存在调用第三方库的情况,有的时候用 java 调用 python 不如用 python 调用 ja