Kotlin Notes オブジェクト指向 (5)
Kotlin ノートのデータ型 (1) Kotlin ノート文字列 (2) Kotlin ノート演算子 (3) Kotlin ノート関数 (4)
記事ディレクトリ
序文
オブジェクト指向の 3 つの特徴を完全に理解するには、オブジェクト指向の方が重要です。
カプセル化: カプセル化は、外部の訪問者がオブジェクトの内部データに恣意的にアクセスするのを防ぎ、オブジェクトの内部の詳細を隠し、限られた外部インターフェイスのみを保持します。外部の訪問者はオブジェクトの内部の詳細を気にする必要がないため、オブジェクトを簡単に操作できます
継承: 継承とは、サブクラス オブジェクト (インスタンス) が親クラスのインスタンス フィールドとメソッドを持つように、サブクラスが親クラスの特性と動作を継承すること、またはサブクラスが親クラスからメソッドを継承することを意味します。サブクラスは親クラスと同じ動作をします
ポリモーフィズム: クラス インスタンス (オブジェクト) の同じメソッドが、さまざまな状況でさまざまな形で現れることを意味します。ポリモーフィズムにより、内部構造が異なるオブジェクトが同じ外部インターフェイスを共有できます。つまり、特定の操作はオブジェクトごとに異なりますが、それら (これらの操作) は共通のクラスを介して同じ方法で呼び出すことができます。
ヒント: 以下はこの記事の本文であり、以下のケースは参考用です
1. オブジェクト指向のマインドマップ
例: pandas は、データ分析タスクを解決するために作成された NumPy ベースのツールです。
二、属性
Kotlin のプロパティは、メンバー プロパティと呼ばれるクラスで宣言できます。プロパティは、トップレベル プロパティと呼ばれるトップレベル関数と同様に、クラスの外にある場合もあります
. 実際、トップレベル プロパティはグローバル変数です. プロパティ宣言構造
var|val 属性名 [ : 数据类型] [= 属性初始化 ]
[getter访问器]
[setter访问器]
1.プロパティの遅延初期化
lateinit
キーワードを使用すると、クラスの宣言時に属性を初期化する必要があり、このキーワードを使用して属性の初期化を遅らせることができます
fun main(args: Array<String>) {
var student3=Student3()
student3.name="zyb"
println(student3.name)
}
class Student3{
var score:Float=10.0f
lateinit var name:String
}
2.委任されたプロパティ
キーワード by を使用して、プロパティの get/set メソッドをオブジェクトにデリゲートします。
class Student3{
var name:String by Teacher()
}
class Teacher{
var name:String="张三"
operator fun getValue(thisRef: Any, property: KProperty<*>):String{
return this.name
}
operator fun setValue(thisRef: Any,property: KProperty<*>,value:String){
this.name=value
}
}
3. 属性の遅延読み込み
キーワードby lazy
lazy-、lazy-initialized properties must be var
fun main(args: Array<String>) {
var dog=Dog()
println(dog.info)
}
class Dog{
var name:String="金毛"
var age:Int=2
val info:String by lazy{
"name:$name age:$age"
}
}
4. 観測可能な特性
プロパティの変更をリッスンする
fun main(args: Array<String>) {
var cat=Cat()
cat.age=1
}
class Cat{
var age:Int by Delegates.observable(0){
property, oldValue, newValue ->
println("old:$oldValue new:$newValue")
}
}
3. コンストラクター
コンストラクターは、クラスの初期化時に呼び出される特別な関数です
1. 一次コンストラクタ宣言
完全なプライマリ コンストラクタ宣言
class Pig constructor(name:String,age:Int){
var name:String
var age:Int
init {
this.name=name
this.age=age
}
}
省略形のプライマリ コンストラクター宣言
class Pig (var name:String,var age:Int)
修飾子で変更する場合、コンストラクターは省略できません
class Pig private constructor(var name:String,var age:Int)
プライマリ コンストラクターはデフォルト値を設定することもできます
class Pig (var name:String="品种",var age:Int=2)
2. 二次コンストラクタ宣言は
fun main(args: Array<String>) {
var cat=Pig("大猪")
var pig=Pig("小猪",18,20.0f)
var pig1=Pig()
}
class Pig (var name:String,var age:Int){
var price:Float=10.0f
constructor(name:String,age:Int,price:Float) :this(name,age){
this.price=price
}
constructor(name: String):this(name,12,12.0f)
constructor()
}
3.デフォルトのコンストラクタ
コンストラクターが明示的に宣言されていない場合、システムはパラメーターなしのコンストラクターを自動的に生成します。
4.拡張
1.拡張属性
fun main(args: Array<String>) {
var pig =Pig("小猪",2,20.0f)
println(pig.info)
}
var Pig.info:String
get() {
return "${this.name} 年龄 :${this.age} 价格:${this.price}"
}
set(value) {
}
class Pig (var name:String,var age:Int){
var price:Float=10.0f
constructor(name:String,age:Int,price:Float) :this(name,age){
this.price=price
}
constructor(name: String):this(name,12,12.0f)
}
2.拡張機能
fun main(args: Array<String>) {
var pig =Pig("小猪",2,20.0f)
println(pig.getInfoPig())
}
fun Pig.getInfoPig():String{
return "${this.name} 年龄 :${this.age} 价格:${this.price}"
}
class Pig (var name:String,var age:Int){
var price:Float=10.0f
constructor(name:String,age:Int,price:Float) :this(name,age){
this.price=price
}
constructor(name: String):this(name,12,12.0f)
}
3. インフィックス機能
infix 演算子を定義することは、 infix キーワードによって変更された関数を宣言することです. この関数は 1 つの
パラメータしか持つことができません. この関数は最上位関数にすることはできず, メンバー関数または拡張関数のみにすることができます.
fun main(args: Array<String>) {
var pig =Pig("小猪",2,20.0f)
pig getNamePig "pig"
}
class Pig (var name:String,var age:Int){
var price:Float=10.0f
constructor(name:String,age:Int,price:Float) :this(name,age){
this.price=price
}
constructor(name: String):this(name,12,12.0f)
infix fun getNamePig(name:String){
println(name)
}
}
4.会員優先
同じ関数の優先メンバ関数が拡張関数より大きい
5. 修飾子
視認性 | モディファイア | クラスメンバー宣言 | トップレベル宣言 |
---|---|---|---|
公共 | 公共のデフォルト | どこでも見える | どこでも見える |
内部 | 内部 | モジュールに表示されます | モジュールに表示されます |
守る | 保護された | サブクラスで表示 | トップレベルの宣言では使用できません |
プライベート | プライベート | クラスで見える | ファイルに表示されます |
6. データクラス
fun main(args: Array<String>) {
var person =Person1("zyb",1)
println(person)
}
data class Person1(var name:String,var age: Int)
7.列挙
列挙型クラスの使用
fun main(args: Array<String>) {
var flag=WeekDays.MONDAY
when(flag){
WeekDays.MONDAY -> println("星期一")
WeekDays.TUESDAY -> println("星期二")
WeekDays.WEDNESDAY -> println("星期三")
WeekDays.THURSDAY -> println("星期四")
else -> println("星期五")
}
}
//最简单形式的枚举类
enum class WeekDays {
// 枚举常量列表
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
}
列挙型クラス コンストラクター
fun main(args: Array<String>) {
println(WeekDays.MONDAY)
}
//最简单形式的枚举类
enum class WeekDays (private var names:String,private var index:Int){
// 枚举常量列表
MONDAY("星期一",2), TUESDAY("星期二",3), WEDNESDAY("星期三",4), THURSDAY("星期四",5), FRIDAY("星期五",5);
override fun toString(): String {
return "$names:$index"
}
}
8.ネストされたクラス
内部クラスは外部クラスのプロパティとメソッドにアクセスできず、外部クラスは内部クラスを初期化し、プロパティとメソッドにアクセスできます
class A{
var index:Int=0
fun sayA(){
println(index)
}
class B{
var indexB:Int=1
fun sayB(){
println("B")
}
}
fun initB(){
var b=B()
b.indexB
b.sayB()
}
}
九、インナークラス
class Out{
var age:Int=10
fun getAges():Int=age
inner class Inner{
var innerName:String="Inner"
fun getOutInfo():String{
println(getAges())
return "$innerName $age"
}
}
fun test(){
var inner=Inner()
inner.getOutInfo()
}
}
10. object キーワード
1.オブジェクト表現
Java ライクな無名オブジェクト
fun main(args: Array<String>) {
setOnclickLister( object : OnclickLister{
override fun onclick() {
println("点击了")
}
})
}
fun setOnclickLister(onclickLister: OnclickLister){
onclickLister.onclick()
}
interface OnclickLister{
fun onclick()
}
2. オブジェクト宣言
オブジェクトがシングルトンであることを宣言します
object Sun{
}
3. コンパニオン オブジェクト
Kotlin には static キーワードはありません。したがって、静的メソッド、静的プロパティ、および静的コード ブロックを使用するには、次のcompanion object
方法で
fun main(args: Array<String>) {
var fish =Fish()
println(fish.name)
println(Fish.getVersin())
}
class Fish{
var name:String="zhang"
constructor(){
println("构造方法")
}
companion object{
var version:Int=10
fun getVersin():Int{
return version
}
init {
println("静态代码块")
}
}
}