kotlin基礎教程の類と継承


kotlin基礎教程の類と継承
クラス宣言
クラスクラスクラスを使用して、その宣言形式を確認します。

: modifiers ("class" | "interface") SimpleName
 typeParameters?
 primaryConstructor?
 (":" annotations delegationSpecifier{","})?
 typeConstraints
 (classBody? | enumClassBody)
最も簡単なクラスステートメントは、少なくともmodifiers class SimpleNameを含む。

class Empty
modifiers
classModifierとaccessModifierを含む:

classModifier:       ,       。
 abstract //      
 final //       ,    
 enum //      
 open //    ,    final 
 annotation //   
accessModifier:アクセス権限修飾子

 private //          
 protected //           
 public //          
 internal //        
コンストラクタ宣言
一つの主なコンストラクタと複数の二次コンストラクタを宣言してもいいです。両方とも選択できます。
price constructor声明
クラス声明の頭として存在し、クラス宣言構造:

class User constructor(name:String)
constructorの前に修饰符がないとき、constructorは省略できます。

class User(name:String)
無参画構造関数の場合は、全体の構造関数も省略できます。省略された構造関数はデフォルトではpublicです。

class User
prmary constructor初期化
primary constructorはコードを一切含まないので、initコードブロックを使用して初期化し、初期化コードブロックで構築関数のパラメータを使用することができる。

class User(name:String){
  init{
    //   ..  
  }
}
クラスで属性を初期化できます。

class User(name:String){
  var customName = name.toUpperCase() //     
}
secondary constructor声明
constructorプレフィックス宣言を使用して、prmary constructorを呼び出す必要があります。thisキーワードを使用します。

class User(name:String){

  /**secondary constructor**/
  constructor(name:String,age:Int):this(name){
    //   ...
  }
}

コンストラクタを宣言すると、パラメータのデフォルト値を指定することができます。すべてのパラメータがデフォルト値を指定してコンパイルされると、コンパイラは初期化属性を初期値とする追加の無参画関数を生成します。

class User(name:String = “”)
検証として、上記の宣言は以下のように呼び出すことができます。

var user = User()
var anotherUser = User("jason")
コンストラクタにすべてのパラメータに標準値がないと、デフォルトのコンストラクタは生成されません。

class User(name:String = "",age = Int)
var user = User() //        
var anotherUser = User("jason",18) //    
実用化
newキーワードを使わずに、オブジェクトを具体化できます。

var user = User()
継承(イノセンス)
アンイ
すべてのクラスはこのクラスを継承し、標準の3つの関数を提供します。

equals()
hashCode()
toString()
相続声明
クラスのコンストラクタの後に使用します。引き継ぎを表示します。

class Student(name:String,age:Int):User(name,age){

}

クラスがコンストラクタを宣言していない場合、他のクラスを継承する場合も、primary constructorに表示されるステートメントコンストラクタは、secondary constructorに父のコンストラクタを呼び出す必要があります。父が複数のコンストラクタがある場合、その1を選択して呼び出します。

/**    **/
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属性ですので、引き継ぎはできません。継承が必要な場合は、オープンキーで修飾します。
メソッドの再ロード
方法はデフォルトではfinalです。布団類の重積載はできません。もし重い荷物が必要なら、キーワードopenを使って修飾します。サブキャリアの方法はoverrideキーワードを使います。

open class User{

  open fun study(){}

  fun run(){}
}

class Student:User{
  override fun study(){}
}

overrideの飾り方は、デフォルトでは継承されます。継承されないことを望むなら、finalのキーワードを使って修飾することができます。

final override fun study(){}
リロード規則
クラスがクラスを継承し、インターフェースを実装し、同じ方法があり、同じ方法で実装される場合、継承された方法をリロード方法で呼び出す必要があります。キーワードsuperを使用して、Tは継承または実現されたインターフェースを表します。

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方法であり、継承された方法を呼び出す必要はありません。

interface Reading{
  fun study()
}

class Student:User(),Reading{
  override fun study(){
    //do nothing
  }
}

抽象類
Kotlinの中の抽象類はabstract修飾のメンバー方法があることを許可して、非抽象類は抽象的な方法があることを許さないです。

abstract class User{
  abstract fun study()
}

class Person{
  abstract fun study() //     
}

抽象類のデフォルトは継承できます。インターフェースは特殊な抽象類です。抽象的な方法があります。

interface Reading{
  abstract fun reading()
}

読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。