服务器之家

服务器之家 > 正文

kotlin基础教程之类和继承

时间:2020-10-26 16:40     来源/作者:Losileeya

kotlin基础教程之继承

类声明

使用class关键字声明类,查看其声明格式:

?
1
2
3
4
5
6
: modifiers ("class" | "interface") SimpleName
 typeParameters?
 primaryConstructor?
 (":" annotations delegationSpecifier{","})?
 typeConstraints
 (classBody? | enumClassBody)

最简略的类声明至少包括 modifiers class SimpleName,如:

?
1
class Empty

modifiers

包括 classModifieraccessModifier:

?
1
2
3
4
5
6
classModifier: 类属性修饰符,标示类本身特性。
 abstract //抽象类标示
 final //标示类不可继承,默认属性
 enum //标示类为枚举
 open //类可继承,类默认是final的
 annotation //注解类

accessModifier: 访问权限修饰符

?
1
2
3
4
private //仅在同一个文件中可见
protected //同一个文件中或子类可见
public //所有调用的地方都可见
internal //同一个模块中可见

构造函数声明

可以声明一个主构造函数(primary constructor)和多个次级构造函数(secondary constructor),二者都是可选的。

primary constructor声明

作为类声明的头部存在,类声明结构:

?
1
class User constructor(name:String)

当constructor前无修饰符(如:private)时,constructor可以省略:

?
1
class User(name:String)

当是无参构造函数时,整个构造函数部分也可以省略,省略的构造函数默认是public的:

?
1
class User

primary constructor 初始化

由于primary constructor不能包含任何代码,因此使用 init 代码块对其初始化,同时可以在初始化代码块中使用构造函数的参数:

?
1
2
3
4
5
class User(name:String){
  init{
    //初始化.. 
  }
}

可以类中初始化属性:

?
1
2
3
class User(name:String){
  var customName = name.toUpperCase() //初始化属性
}

secondary constructor声明

使用constructor前缀声明,且必须调用primary constructor,使用this关键字:

?
1
2
3
4
5
6
7
class User(name:String){
 
  /**secondary constructor**/
  constructor(name:String,age:Int):this(name){
    //初始化...
  }
}

声明构造函数时,允许指定参数默认值,若所有参数都被指定默认值然后编译,编译器会生成一个额外的无参构造函数来使用初始化属性为初始值。

?
1
class User(name:String = “”)

作为校验,上述声明方式允许如下调用:

?
1
2
var user = User()
var anotherUser = User("jason")

若构造函数中并非所有参数都有默认值,则不会生成默认无参构造函数:

?
1
2
3
class User(name:String = "",age = Int)
var user = User() //将无法编译通过
var anotherUser = User("jason",18) //合法声明

实例化

无需new关键字,即可实例化对象:

?
1
var user = User()

继承(Inheritance)

Any

所有类都继承该类,提供默认的三个函数:

?
1
2
3
equals()
hashCode()
toString()

继承声明

在类的构造函数之后使用 : 标示继承:

?
1
2
3
class Student(name:String,age:Int):User(name,age){
 
}

当类未声明构造函数时,继承其他类时,也不需要在primary constructor中显示的声明构造函数,必须在secondary constructor中显示调用父类构造函数,若父类有多个构造函数,可选择其一进行调用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**用户基类**/
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 关键词:

?
1
2
3
4
5
6
7
8
9
10
open class User{
 
  open fun study(){}
 
  fun run(){}
}
 
class Student:User{
  override fun study(){}
}

override修饰的方法,默认是可以被继承的。若希望不被继承,可以使用 final 关键词修饰。

?
1
final override fun study(){}

重载规则

当类同时继承类和实现接口,且有相同方法,且相同方法都有实现时,需要在重载方法中调用所继承的方法,使用关键词 super ,T表示所继承或实现的接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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方法,不需要调用所继承的方法:

?
1
2
3
4
5
6
7
8
9
interface Reading{
  fun study()
}
 
class Student:User(),Reading{
  override fun study(){
    //do nothing
  }
}

抽象类

Kotlin中的抽象类允许有abstract修饰的成员方法,非抽象类不允许有抽象方法;

?
1
2
3
4
5
6
7
abstract class User{
  abstract fun study()
}
 
class Person{
  abstract fun study() // 编译错误
}

抽象类默认是可被继承的,接口是特殊的抽象类,允许有抽象方法:

?
1
2
3
interface Reading{
  abstract fun reading()
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
最新idea2020注册码永久激活(激活到2100年)
最新idea2020注册码永久激活(激活到2100年) 2020-07-29
返回顶部