使用class关键字声明类,查看其声明格式:
:modifiers("class"|"interface") SimpleName typeParameters? primaryConstructor? (":"annotations delegationSpecifier{","})? typeConstraints(classBody? | enumClassBody)
modifiers
包括classModifier和accessModifier:
classModifier:类属性修饰符,标示类本身特性
//抽象类标示 abstract //标示类不可继承,默认属性 final //标示类为枚举 enum //类可继承,类默认是final的 open //注解类 annotation
accessModifier:访问权限标识符
//仅在同一个文件中可见 private //同一个文件中或子类可见 protected //所有调用的地方都可见 public //同一个模块中可见 internal
类的声明
类声明由类名、类头(指定其类型参数、主 构造函数等)和由大括号包围的类体构成。类头和类体都是可选的; 如果一个类没有类体,可以省略话括号。
class Empty
构造函数
可以包含一个主构造函数和一个或者多个次构造函数。主构造函数是类头的一部分,它跟在类名(和可选的类型参数)后。
class Person constructor(firstName: String){ }
如果主构造函数有任何注解或者可见性修饰符,需要增加constructor关键字
class Person public @Inject constructor(firstName: String){ }
1:主构造函数(Primary constructor)
主构造函数不能包含任何的代码,初始化的代码可以放到以 init 为前缀的初始化块(initializer blocks)中:
1.1:声明:
作为类声明的头部存在,类声明结构如下:
class Person constructor(name: String){ }
当constructor前无修饰符如(private)时,可以省略constructor
class Person(name: String){ }
当是无参构造函数时,整个构造函数部分也可以省略,省略的构造函数默认是public的:
class Person{ }
1.2:初始化
由于primary constructor不能包含任何代码,因此使用 init 代码块进行初始化,同时可以在代码块中使用构造函数的参数:
class Person(name: String){ init { // 初始化... } }
可以类中初始化属性:
class Person(name: String){ var customName = name.toUpperCase() }
2:次构造函数(Secondary Constructor)
2.1:声明
使用constructor进行声明,必须调用主构造函数(Primary Constructor),使用this关键字:
/** * Primary constructor */ class Person(name: String) { // secondary constructor //使用constructor前缀声明,且必须调用primary constructor,使用this关键字: constructor(name: String,age: Int) :this(name) { //初始化... } }
需要注意的地方:声明构造函数时,允许指定参数默认值,若所有参数都被指定默认值然后编译,编译器会生成一个额外的无参构造函数来使用初始化属性为初始值。
class User(name: String="") { }
若构造函数中并非所有参数都有默认值,则不会生成默认无参构造函数:
class User(name: String="", age: Int) { }
3:实例化
无需new关键字,即可实例化对象:
var User = User()
网友评论