kotlin言語のクラスとオブジェクト

7363 ワード

1、クラス
クラスは1種の具体的な対象の抽象化を表して、例えば人は1つのクラスを表して、それでは私自身は具体的な対象です;クラスには属性記述クラスのオブジェクト状態があり、関数はクラスのオブジェクト関数を記述する.KotlinはJavaと同様にclassキーワードを使用して対応するクラスの名前を修飾します.次にkotlinコードでクラスを定義します.
ps:コードはAndroid Studioで書かれています
/**
 *      ,   Person
 */
class Person {
 /**
 *      String       name
 */
 var name: String? = null
 /**
 *      Int       age
 */
 var age: Int = 0
 constructor(name: String,age: Int) {
 this.name = name
 this.age = age
 }
 /**
 *       ,   eat
 */
 fun eat() {
 var s:String = "  " + name + ",  " + age + " ,      "
 println(s)
 }
}

**2、対象**
オブジェクトはクラスの具体化またはクラスのインスタンス化であり、newキーワードを必要とせず、「クラス名()」だけでクラスをインスタンス化することができます.
3、 静的プロパティと動的動作
1つのクラスで宣言される基本的なデータ型または複雑なデータ型を静的属性と呼びます.ここでの静的属性は静的タイプのデータ型ではありません.ただ、属性を静的と言い、混同しないでください.上で定義したPersonクラスでは、nameとageは静的属性であり、使用するときはオブジェクト呼び出しだけです.1つのクラスで定義される関数は動的挙動を定義することであり,Personクラスではeat()関数は動的挙動であり,使用する場合もオブジェクト呼び出しが必要である.
4、パッケージ
カプセル化は実は内部の実現の詳細を隠すことであり、一つのクラスにとって、そのある関数をprivateで定義すると、このクラスをカプセル化し、外部ではオブジェクトを通じてアクセスできず、オブジェクトの内部を通じてアクセスするしかなく、つまり象関数を通じてオブジェクト自身のprivate定義の関数にアクセスすることである.次に例を示します.
(1)プリンタクラスを定義します.
class Printer {
 /**
 *     printSpeed            ,  private   ;
 *              
 */
 private fun printSpeed(num: Int) {
 println("1    " + num + "  ")
 }
 fun printPaper() {
 /**
 *                 private   ,
 *           private   
 */
 printSpeed(10)
 }
}

(2)プリンタクラスオブジェクトを外部から呼び出すprintPaperメソッドは,printSpeedメソッドを直接呼び出すことはできない.
 var printer: Printer = Printer()
 printer.printPaper()

5、継承
あるオブジェクトは別のオブジェクトの非プライベート属性と非プライベートメソッドを使用して継承と呼ぶことができます.例えば、学生も人間Personのname、age属性、eatメソッドを継承することができます.あるクラスは別のクラスを継承します.継承されたクラス定義にopenキーワードを付けることを示します.kotlin言語ではクラスがデフォルトfinalタイプであるためです.(抽象クラスまたはインタフェースでない場合).次に例を示します.
(1)Studentクラスを定義し、Personクラスを継承し、Personクラスの前にopenキーを付けます.
class Student(name: String,age: Int): Person(name,age) {
 
}

(2)親を継承するeatメソッドを直接呼び出す.
 var student: Student = Student("  ",21)
 student.eat()

6、書き換え
あるクラスが別のクラスを継承する場合、子クラスは親の非プライベートメソッドを書き換えることができます.書き換えることは、親が自分の夢を持っている場合、子クラスが親の夢を継承すると同時に自分の小さな夢を持つことができると理解できます.子クラスが関数を書き換えるときにoverrideキーワードを追加し、子オブジェクトが親と子クラスの同じ関数名の関数を呼び出すときに、子クラスオブジェクトを呼び出す親オブジェクトの関数ではなく書き換えられた関数です.継承されたクラスの関数の前にopenキーを付けます.kotlin言語では関数がデフォルトfinalタイプで書き換えられないためです(抽象関数でない場合).次に例を示します.
(1)Personクラスにdream関数を追加する.
 open fun dream() {
 var s:String = "  " + name + ",  " + age + " ,            。"
 println(s)
 }

(2)Studioクラスにdream関数を書き換える.
 override fun dream() {
 var s:String = "  " + name + ",  " + age + " ,         。"
 println(s)
 }

(3)dream関数の呼び出し
 var student: Student = Student("  ",21)
 /**
 *        Student    ,    Person  
 */
 student.dream()

7、抽象類
abstractキーワードを含むクラスは抽象クラスと呼ばれ、抽象クラスには抽象関数があってもなくてもよい.抽象関数があれば、抽象クラスを継承するクラスは抽象クラスのすべての抽象関数を実現しなければならない.抽象クラスはopenキーワードを付けなくてもよい.それは黙認して継承可能であるからである.以下の例を挙げる.
(1)抽象クラスFatherを新規作成する.
abstract class Father {
 abstract fun study()
}

(2)Sonクラスを新規作成しFatherクラスを継承しstudy関数を実装する.
class Son: Father() {
 override fun study() {
 var s: String = "   Son ,    "
 println(s)
 }
}

(3)study関数を呼び出す.
 var son: Son = Son()
 son.study()

8、インタフェース
インタフェースとは、エンティティが外部に提供する抽象化物であり、内部操作から外部コミュニケーション方法を分離するために使用される.kotlin言語では、インタフェースは特殊な抽象クラスであり、関数があることを宣言してもよいし、ないこともできる.関数があることを宣言すれば、すべての関数は抽象関数である.インタフェースを定義するにはinterfaceキーワードであり、classキーではない文字、openキーワードを追加する必要もありません.デフォルトで継承可能な外部使用のためです.インタフェースで宣言された関数は、抽象関数であるため、サブクラスに実装されます.サブクラスがインタフェースを実装する場合、インタフェースの後ろにカッコを付けることはできません.次の例を挙げます.
(1)インタフェースMyInterfaceを定義する.
interface MyInterface {
 fun callback()
}

(2)実装クラスMyInterfaceImplementを定義する.
class MyInterfaceImplement: MyInterface {
 override fun callback() {
 var s: String = "   MyInterfaceImplement    ,     MyInterface     callback   "
 println(s)
 }
}

(3)インタフェースメソッドを呼び出す.
 var myInterfaceImplement: MyInterfaceImplement = MyInterfaceImplement()
 myInterfaceImplement.callback()

9、多態
同じ機能で、異なる表現形式は多態と呼ばれています.どういう意味ですか.例えば、1つの抽象クラスに抽象関数があり、複数のサブクラスがこの抽象クラスを継承しているとします.では、この抽象クラスの抽象関数は同じ機能で、複数のサブクラスが異なるコードで抽出クラスを実現した関数は異なる表現形式です.次に例を挙げます.
(1)MyInterfaceに基づいて,MyInterfaceImplement 2クラスを新規作成し,MyInterfaceインタフェースを実現する.
class MyInterfaceImplement2: MyInterface {
 override fun callback() {
 var s: String = "   MyInterfaceImplement2    ,     MyInterface     callback   "
 println(s)
 }
}

(2)複数のMyInterfaceインタフェースをインスタンス化し,それらの関数を呼び出す.
 /**
 *     
 */
 var myInterface: MyInterface = MyInterfaceImplement()
 var myInterface2: MyInterface = MyInterfaceImplement2()
 var list: List = listOf(myInterface,myInterface2)
 for (myInterface: MyInterface in list) {
 /**
 *            ,     MyInterfaceImplement   MyInterfaceImplement2        
 */
 myInterface.callback()
 }

10、委託と代理
依頼とは、事を他人に委託することであり、代理は他人の名義で、許可された場合に被代理人に直接法律的な役割を果たす行為である.例えば、歌手が契約に行くが、彼が直接契約に行かないのか、アシスタントを呼んで契約するのか、これが典型的な依頼と代理モデルである.以下に例を挙げる.
(1)インタフェースCompanyを定義する.
interface Company {
 fun sign()
}

(2)歌手アシスタントクラスSingerAssistantを定義し,Companyインタフェースを実現する.
class SingerAssistant: Company {
 override fun sign() {
 var s: String = "       ,       "
 println(s)
 }
}

(3)シンガーソングライタークラスSingerを定義し,Companyインタフェースを実装するが関数を実装せずにSingerAssistantエージェントで関数を実装する.
class Singer: Company by SingerAssistant() {
}

(4)歌手契約関数を呼び出す.
 var company: Company = Singer()
 /**
 *       Singer      ,        ,
 *     SingerAssistant        
 */
 company.sign()

11、単例モード
1つのプロセスでは、クラスオブジェクトが1つだけあることを単例モードと呼びます.kotlin言語では、あるクラスにobjectキーワードを追加してcalssキーワードを削除するだけで、JVMをインスタンス化でき、1つのインスタンスしか現れません.次の例を挙げます.
(1)一例モードクラスSingletonを定義する.
object Singleton {
 fun action() {
 var s:String = "       ,      1     "
 println(s)
 }
}

(2)この単例モードのクラスオブジェクトメソッドを呼び出す.
 /**
 *               ,
 *                   
 */
 Singleton.action()
 /**
 *      ,       ,            
 */
 var singleton: Singleton = Singleton()

12、印鑑類
印鑑類は密封類とも呼ばれ、制限された類継承構造を表すために用いられる.一つの値が限られたいくつかのタイプであり、他のタイプは存在しない.制限されたサブクラスと理解でき、それは列挙型の拡張であり、異なるのは列挙型が限られたデータ個数であり、印鑑類が限られたサブクラスタイプである.sealedキーワード修飾類を使用して、印鑑類にサブクラスがあるただし、すべてのサブクラスは印鑑クラスに埋め込まなければなりません.次に例を挙げます.
(1)スタンプ類Snakeを定義する.
sealed class Snake {
 class WaterSnake(): Snake()
 class GrassSnake(): Snake()
 fun sayName(name: String) {
 println(name)
 }
}

(2)スタンプ類のすべてのサブクラスの関数を呼び出す.
 var snake: Snake = Snake.GrassSnake()
 var snake2: Snake = Snake.WaterSnake()
 var list:List = listOf(snake,snake2)
 for (snakes: Snake in list) {
 snakes.sayName()
 }

この文章はここまで书いて终わりました.技术のレベルが限られているため、文章の中で间违いがあるのは避けられません.皆さんの批判と指摘を歓迎します.また、demoアドレスを添付します.https://github.com/Yubao1/Kot...