Scalaオブジェクト向けプログラミング
6743 ワード
1.1クラスの定義
1.private var修飾パラメータ、生成されたgetterとsetterもprivateであり、現在のクラスでのみ使用できます.
2.val age=14//getterメソッドを生成するだけで新しい定義age:s.age=15からはできません
3.privateを持たないvarパラメータはprivateのnameフィールドとして定義され、publicのgetterとsetterメソッドが提供されます.
4.private[this]と宣言した場合、getterメソッドとsetterメソッドは生成されません.
クラスコンストラクション関数にパラメータがない場合は、class Studio{}カッコを付けないで使用できます.
1.2オブジェクトのインスタンス化
2.getterメソッドとsetterメソッドのカスタマイズ
カスタムgetterメソッドとsetterメソッドは、それぞれname、name_=に対応します.name、下線、=番号の間にスペースは使用できません
3.主構造関数と補助構造関数
//コンストラクション関数は、オブジェクトの作成後に呼び出されます//プライマリコンストラクション関数です.Scalaはjavaとは異なり、コンストラクション関数はクラスカッコでpythonと同様にデフォルトパラメータとして割り当てることもできます//プライマリコンストラクション関数にvalまたはvar修飾がない場合、代表のこのパラメータはprivate[this]修飾です
セカンダリコンストラクション関数、最初の行はプライマリコンストラクション関数を呼び出す必要があります.セカンダリコンストラクション関数間で相互に呼び出すことができます.
4.Scalaでの静的アプローチ:伴生オブジェクトと伴生クラス
classとclassと同じ名前のobjectがある場合、このobjectはclassの伴生オブジェクトであり、classはobjectの伴生クラスである.
def myObjectMethod = Teacher.myPrint()/objectのメソッドに直接アクセスし、静的メソッドフォーマットで呼び出す
5.匿名サブクラス
6.親メソッドの上書きと呼び出し
override親を上書きする方法、superが親を呼び出す方法
7.抽象クラス
抽象クラスのメソッドと属性はprivateではありません.サブクラスは抽象クラスのすべてのメソッドと属性を実現する必要があります.
1.private var修飾パラメータ、生成されたgetterとsetterもprivateであり、現在のクラスでのみ使用できます.
2.val age=14//getterメソッドを生成するだけで新しい定義age:s.age=15からはできません
3.privateを持たないvarパラメータはprivateのnameフィールドとして定義され、publicのgetterとsetterメソッドが提供されます.
4.private[this]と宣言した場合、getterメソッドとsetterメソッドは生成されません.
クラスコンストラクション関数にパラメータがない場合は、class Studio{}カッコを付けないで使用できます.
// Student
class Student(){
private var name: String = "mike" // private var , getter setter private ,
val age = 14 // getter age :s.age = 15
var isMale = true // private var , private name , public getter setter
private[this] val classNum = "class2" // private[this], getter setter
def sayHello() = {println("hello, everyone")}
def getName = name // name
}
1.2オブジェクトのインスタンス化
val s = new Student() //
s.sayHello()
println(s.getName)
println(s.age)
s.isMale = false // var
println(s.isMale)
// println(s.classNum)
2.getterメソッドとsetterメソッドのカスタマイズ
カスタムgetterメソッドとsetterメソッドは、それぞれname、name_=に対応します.name、下線、=番号の間にスペースは使用できません
class Student2(){
var myName: String = "mike"
def name = println("this is myname: " + myName)
def name_= (newName: String){
println("new name: " + newName)
}
}
val s2 = new Student2()
s2.name // this is myname: mike
println(s2.myName)
s2.myName = "zhangsan"
s2.name // this is myname: zhangsan
s2.name = "zhaosi" // new name: zhaosi
3.主構造関数と補助構造関数
//コンストラクション関数は、オブジェクトの作成後に呼び出されます//プライマリコンストラクション関数です.Scalaはjavaとは異なり、コンストラクション関数はクラスカッコでpythonと同様にデフォルトパラメータとして割り当てることもできます//プライマリコンストラクション関数にvalまたはvar修飾がない場合、代表のこのパラメータはprivate[this]修飾です
セカンダリコンストラクション関数、最初の行はプライマリコンストラクション関数を呼び出す必要があります.セカンダリコンストラクション関数間で相互に呼び出すことができます.
class Student3(var name: String, var age: Int){
private var myNum: String = "1919101" // myNum , ,
private var isMale: Boolean = true
// , ,
def this(name: String, age: Int, myNum: String){ //
this(name, age) //
this.myNum = myNum
println("this is auxiliary constructor")
}
def this(isMale: Boolean){ //
this("zhang", 14, "101901")
this.isMale = isMale
}
override def toString = s"name: $name, age: $age, myNum: $myNum, isMale: $isMale"
def show(){
println("name : "+ name, " age: " + age + " myNum " + myNum )
}
}
// , , show ,
val s3 = new Student3("zhangsan", 12) // name is : zhangsanage is :12
println(s3.toString) // name: zhangsan, age: 12, myNum: 1919101, isMale: true
s3.show() // (name : zhangsan, age: 12 myNum 1919101) myNum myNum
s3.show
val s31 = new Student3("zhangsan", 12, "19101910")
s31.show() // (name : zhangsan, age: 12 myNum 19101910)
val s32 = new Student3(true)
println(s32.toString) // name: zhang, age: 14, myNum: 101901, isMale: true
4.Scalaでの静的アプローチ:伴生オブジェクトと伴生クラス
classとclassと同じ名前のobjectがある場合、このobjectはclassの伴生オブジェクトであり、classはobjectの伴生クラスである.
def myObjectMethod = Teacher.myPrint()/objectのメソッドに直接アクセスし、静的メソッドフォーマットで呼び出す
class Teacher(val name: String, val age: Int){
def show() = {
// , private , .scala
println("name : "+ name + " age: " + age +" object name is :" + Teacher.myName)
}
def myObjectMethod = Teacher.myPrint() // object ,
}
object Teacher{
def apply(name: String, age: Int): Teacher ={
new Teacher(name, age)
}
private val name = "zhaosi"
def myPrint() ={
println("name is : " + name)
}
def myName = name
}
val t = Teacher("zhangsan", 27) // apply , new
println(t.name)
t.show() // name : zhangsan age: 27 object name is :zhaosi
t.myObjectMethod // name is : zhaosi
5.匿名サブクラス
class Human(val name: String)
val h = new Human("wangzi"){ //
def speak(msg: String){
println(name + " say " + msg)
}
}
def func(h: Human{def speak(msg: String): Unit}){
h.speak("hello")
}
// {def speak(msg: String): Unit} Human func
func(h) // wangzi say hello
class Hm(name: String) extends Human(name){ // val var ,
def speak(msg: String){
println(name + " not say " + msg)
}
}
val h1 = new Hm("lilisi")
func(h1) // lilisi not say hello
6.親メソッドの上書きと呼び出し
override親を上書きする方法、superが親を呼び出す方法
class Person1(){
private val isMale: Boolean = true
private val name: String= "lisi"
def getInformation(): String = if(isMale) "this is man" else "it is not a man"
def getName = name
}
class Student4() extends Person1(){
private val name: String = "zhaosi"
override def getInformation: String = "this is my name: " + name +" " + super.getInformation()
}
val s4 = new Student4()
println(s4.getName) // lisi
println(s4.getInformation) // this is my name: zhaosi this is man
// isInstanceOf
println(s4.isInstanceOf[Person1]) // true
println(s4.isInstanceOf[Student4]) // true
// .getClass == classOf[ ] ,
println(s4.getClass == classOf[Person1]) // false
println(s4.getClass == classOf[Student4]) // true
7.抽象クラス
抽象クラスのメソッドと属性はprivateではありません.サブクラスは抽象クラスのすべてのメソッドと属性を実現する必要があります.
abstract class Demo(){
var name: String // , private
def show()
}
//
class MyDemo extends Demo{
var name: String = "zhaosi " // name var
def pri = println("name : " + name)
def show() = println("this is a class") //
def getName(): String = {
name
}
}
val m = new MyDemo
m.pri // name : zhaosi
m.show