7. Scalaのapplyメソッド()
apply メソッドは、次の形式の式が見つかったときに呼び出されます。
オブジェクト(パラメータ1,パラメータ2,...,パラメータN)
通常、このような apply メソッドはコンパニオン クラスのオブジェクトを返します。その結果、new キーワードが省略されます。
オブジェクトの apply メソッドの例:
//object的apply方法
class Student5(val stuName:String) {
}
object Student5 {
//定义自己的apply方法
def apply(stuName: String) = {
println("*********Apply in Object **********")
new Student5(stuName)
}
//如果没有这个apply方法,下面创建Mary的时候就会报错
def main(args: Array[String]): Unit = {
var s51 = new Student5("Tom")
println(s51.stuName)
var s52 = new Student5("Mary")
//由于省略了new关键字,创建这个对象的时候,就会在Object找对应的apply方法
println(s52.stuName)
}
}
8. Scala における継承
Scala は Java と同様に、extends キーワードを使用してクラスを拡張します。
ケース 1: Employee クラスが Person クラスを継承する
//演示Scala的维承父类
class Person(val name:String,val age:Int) {
//定义结果
def sayHello():String = "Hello" + name + " and the age is " + age
}
//子类
class Employee (override val name:String,override val age:Int,val salary:Int) extends Person(name,age){
//重新父类的sayHello方法
//注意override 是关键字
override def sayHello(): String = "子类中的sayHello方法"
}
object Demo {
//测试程序
def main(args: Array[String]): Unit = {
//创建一个Employee的对象
var p2:Person = new Employee("Mike",25,1000)
println(p2.sayHello())
//使用匿名子类来创建Person对象
//这里我们创建了Person的一个匿名子类,并且在该子类中重写了sayHello方法。
var p3:Person = new Person("Jerry",26) {
override def sayHello(): String = "匿名子类中的sayHello方法"
}
println(p3.sayHello())
}
}
ケース 2: サブクラスで親クラスのメソッドをオーバーライドする
//子类
class Employee (override val name:String,override val age:Int,val salary:Int) extends Person(name,age){
//重新父类的sayHello方法
override def sayHello(): String = "子类中的sayHello方法"
}
ケース 3: 匿名サブクラスの使用
//使用匿名子类来创建Person对象
//这里我们创建了Person的一个匿名子类,并且在该子类中重写了sayHello方法。
var p3:Person = new Person("Jerry",26) {
override def sayHello(): String = "匿名子类中的sayHello方法"
}
println(p3.sayHello())
ケース 4: 抽象クラスを使用します。抽象クラスには抽象メソッドが含まれており、抽象クラスは継承にのみ使用できます。
//Scala中的抽象类
//父类:抽象类
abstract class Vehicle{
//定义抽象方法
def checkType():String
}
//子类
class Car extends Vehicle {
//实现checkType 方法
override def checkType(): String = {"I am a Car"}
}
class Bycical extends Vehicle {
//实现checkType方法
override def checkType(): String = {"I am a bike"}
}
object Demo2 {
//定义两个交通工具
def main(args: Array[String]): Unit = {
var v1:Vehicle = new Car
println(v1.checkType())
var v2:Vehicle = new Bycical
println(v2.checkType())
}
}
ケース 5: 抽象フィールドを使用します。抽象フィールドは初期値のないフィールドです
package class4
//Scala中的抽象字段:就是没有初始值的字段
//抽象的父类
abstract class Person{
//第一个抽象字段,并且只有get方法
val id:Int
//另一个抽象字段,并且有get和set方法
var name:String
}
//子类:应该提供抽象字段的初始值,否则该子类也,应该是抽象的
abstract class Employee1 extends Person {
//val id:Int = 1
var name:String = "No Name"
}
class Employee2(val id:Int) extends Person {
var name:String = "No Name"
}
object Demo3 {
def main(args: Array[String]): Unit = {
var a:Person = new Employee2(1)
println(a.id,a.name)
}
}
9. Scala の特性
trait は抽象クラスです。トレイトと Java 抽象クラスの最大の違い: トレイトは多重継承をサポートします
package class4
/*
* Scala中的trait
* 1.trait 就是抽象类
* 2.区别:trait 支持多重继承
*/
//第一个trait
trait Human {
val id:Int
val name:String
//方法
def sayHello():String = "Hello" + name
}
//第二个trait
trait Actions {
//抽象方法
def getActionNames():String
}
//子类
class Student(val id:Int,val name:String) extends Human with Actions {
override def getActionNames(): String = "Action is running"
}
object Demo4 {
def main(args: Array[String]): Unit = {
//创建一个student的对象
var s1 = new Student(1,"Tom")
println(s1.sayHello())
println(s1.getActionNames())
}
}
10. パッケージの利用
Scala のパッケージは、Java のパッケージや C++ の名前空間と同じ目的、つまり大規模なプログラム内の名前を管理する目的で使用されます。
Scala でのパッケージの定義と使用:
パッケージ定義
パッケージの紹介: Scala は依然として、パッケージを参照するキーワードとして import を使用します。たとえば、
そして、Scala でのインポートはどこにでも書くことができます
11. パッケージオブジェクト
パッケージにはクラス、オブジェクト、特性を含めることができますが、関数や変数の定義は含めることはできません。残念ながら、これは
Java 仮想マシンの制限事項。Utils オブジェクトではなく、ユーティリティ関数または定数をパッケージに追加します。
より合理的なアプローチ。Scala では、パッケージ オブジェクトの外観はまさにこの制限を解決するためのものです。Scalaのパッケージ
オブジェクト: 定数、変数、メソッド、クラス、オブジェクト、トレイト
package class4
//Scala中的包对象:常量,变量,方法,类,对象,trait(特质)
//定义一个包对象
package object MyPackageObject {
//常量
val x:Int = 0
//变量
var y:String = "Hello World "
//方法
def sayHelloWorld():String = "Hello World"
//类
class MyTestClass {
}
//对象object
object MyTestObject {
}
//特质 trait
trait MyTestTrait {
}
}
class Demo3 {
//测试
def method1 = {
//导入需要的包对象
import class4.MyPackageObject._
//定义MyTestClass的一个对象
var a= new MyTestClass
}
}
12. Scala でのファイル アクセス
読み込まれた行
val source = scala.io.Source.fromFile("e:\\temp\\a.txt")
println(source.mkString)
val lines = source.getLines()
for(l<-lines) println(l.toString)
文字を読む
val source = scala.io.Source.fromFile("e:\\temp\\a.txt")
for(c <-source) println(c)
実際、ここのソースはこのファイル内の各文字を指しています。