1、訪問器
kotlin字段是私有的 會生成get和set方法
當有需求只能內部設置名稱 外部不能修改名稱
方法就是:在該屬性下增加private set
1)訪問器
fun main(args: Array<String>) {
val person = Person()
println(person.age)
println(person.name)
// person.name="hehe" //無法設置該屬性
//報錯 Cannot assign to 'name': the setter is private in 'Person
}
class Person {
var name = "小明"
private set
var age = 20
}
2)自定義訪問器
當有需求只能設置小於150的年齡
在該屬性下增加 set()方法
fun main(args: Array<String>) {
val person = Person()
person.age=190
println(person.age )
println(person.name)
}
class Person {
var name = "張峯"
var age = 20
set(value) {
if (value < 150) {
//切記使用field
field = value
}else{
println("年齡太大了")
}
}
}
2、構造函數
1)構造函數
kotlin構造函數:
構造函數不帶var的那種(name:String,age:Int) 只能往裏面傳參數;
帶var那種(var name:String,var age:Int)相當於setter 和getter
fun main(args: Array<String>) {
val person=Person1("呵呵",30)
println(person.age)
}
class Person1(var name: String,var age: Int) {
}
2)構造函數參數的使用
使用init關鍵字
class Person11(name: String, age: Int) {
var name = ""
var age: Int = 0
//構造函數中的代碼可以放到init中執行
init {
this.name = name
this.age = age
}
}
3)次構造函數
主構函數和次構函數順序,先走主構函數 —>次構函數
fun main(args: Array<String>) {
var person = Person3("大頭", 22, "13132421")
}
//次構函數即重載
class Person3(var name: String, var age: Int) {
init {
println("走了主構函數")
}
var phone = ""
constructor(name: String, age: Int, phone: String) : this(name, age) {
println("走了次構函數")
this.phone = phone
}
}
3、繼承
kotlin的類都是 final的 不能被繼承所以父類要是用open關鍵字
fun main(args: Array<String>) {
val son=Son()
println(son.age)
println(son.name)
son.habit()
}
open class Father{
open var name="hehe"
open var age=25
//動態行爲
open fun habit(){
print("呵呵喜歡抽菸")
}
}
//子繼承父業
class Son:Father(){
override var name: String="didi"
override var age: Int=10
override fun habit() {
// super.habit()
println("我不愛抽菸")
}
}
4、抽象類
抽象類:反映的是事物的本質
說明:
(1)抽象類裏面可以沒有抽象方法和抽象屬性
(2)並且方法和屬性可以具體實現
(3)抽象類可繼承抽象類,抽象類只能單繼承
fun main(args: Array<String>) {
val zh = Chinese()
println(zh.color)
println(zh.language)
zh.eat()
val usa = Chinese()
println(usa.color)
println(usa.language)
usa.eat()
val af = Chinese()
println(af.color)
println(af.language)
af.eat()
}
//定義人類抽象類
abstract class Human {
//人類共同屬性
//膚色
abstract var color: String
//語言
abstract var language: String
//吃飯
abstract fun eat()
}
open class Chinese : Human() {
override var color: String = "黃色"
override var language: String = "中文"
override fun eat() {
println("吃飯用筷子")
}
}
class American : Human() {
override var color: String = "白色"
override var language: String = "英語"
override fun eat() {
println("吃飯用刀叉")
}
}
class African : Human() {
override var color: String = "黑色"
override var language: String = "葡萄牙語"
override fun eat() {
println("吃飯用手")
}
}
5、接口
1)接口
接口:接口反映的是事物的能力
描述:接口可以進行多實現
fun main(args: Array<String>) {
val xiaoming = XiaoMing()
xiaoming.eat()
println(xiaoming.language)
xiaoming.ride()
}
//小明
class XiaoMing : Chinese(), RideBike, DriveCar {
override fun drive() {
println("小明學會了開車")
}
override fun ride() {
println("小明學會了騎自行車")
}
}
//能力使用接口表示
interface RideBike {
fun ride()
}
interface DriveCar {
fun drive()
}
2)接口細節
接口細節:java中接口裏面可以具體實現,kotlin不行;
描述: java中接口方法是不能實現的 kotlin 是可以實現的。
fun main(args: Array<String>) {
val xiaoming = XiaoMing()
xiaoming.eat()
println(xiaoming.language)
xiaoming.ride()
}
//小明
class XiaoMing : Chinese(), RideBike, DriveCar {
override val licenseNumber: String="1425646476"
override fun drive() {
println("小明學會了開車")
}
override fun ride() {
println("小明學會了騎自行車")
}
}
//能力使用接口表示
interface RideBike {
fun ride()
}
interface DriveCar {
//車牌
// val licenseNumber="12432132"
val licenseNumber: String
fun drive(){}
}
6、多態
描述:通過父類的接收 執行的是子類的方法
fun main(args: Array<String>) {
val dog:Animal = Dog()
dog.let {
println(it.color)
it.call()
}
val cat = Cat()
cat.let {
println(it.color)
it.call()
}
}
//定義動物類
abstract class Animal {
var color: String = ""
//行爲
abstract fun call()
}
//狗
class Dog : Animal() {
override fun call() {
println("狗汪汪叫")
}
}
//貓
class Cat : Animal() {
override fun call() {
println("貓喵喵叫")
}
}