Scala-- 4.クラス

ときにJavaオブジェクト指向プログラミング言語、歴史的な理由のために、Javaは、非オブジェクト指向のコンテンツが残っています:基本的なタイプは、null、静的メソッド。JavaからScalaの言語なので、本質的にオブジェクト指向言語、純粋なオブジェクト指向言語とScalaの、Scalaですべてが対象ですクラスはコンセプトは、ヒトのようなもの、のクラスを表す、抽象的です。オブジェクトは、特定のものに代わって、具体的な、実用的です。クラスはテンプレートオブジェクトで、オブジェクトは、1つの例に、個人の対応のクラスです。

1.クラス定義

構文
[修飾]クラスのクラス名{
クラスの本体
}

オブジェクトの作成2.

構文
ヴァル| VARオブジェクト名[:タイプ] =新しいタイプ[()]
オブジェクト参照を変更しません(例:メモリアドレス)は、一般的なので、valの自然として宣言、またはVARとして宣言する必要があり、Scalaのデザイナーvalが、お勧めしますプロセスにおいて、通常だけではなく、オブジェクトを変更するよりも、オブジェクトのプロパティの値を変更します。
Scalaのあなたがタイプに応じて、オブジェクト変数を宣言型宣言を省略することができるので、オブジェクトを作成し、自動的に推論することができますが、背後にあるオブジェクトのタイプと新しいタイプのは、あなたが書く必要があり、継承の多型をであるとき。

object boke_demo01 {
   
  def main(args: Array[String]): Unit = {
    val emp = new Emp // emp 类型就是Emp
    //如果希望将子类对象,交给父类的引用,这时就需要写上类型
    val emp2: Person = new Emp
 
  }
}
 
class Person {
 
}
 
class Emp extends Person {
   
}
class Person2 {
  var name = ""
  var age: Int = _ //如果是用 _ 方式给默认值,则属性必须指定类型
}
3.メソッド

構文
DEFメソッド名[:戻り値型] = {
メソッドその
}

4.工事の方法

Scalaは、オブジェクトのコンストラクタを呼び出すように構成され、この方法は、任意の数の構成(すなわち構成でScalaはまた、過負荷支持体)であって、Scalaのクラスのコンストラクタ有することができる:主な構成と二次ビルダー。
構文
クラスのクラス名(パラメータリスト){//コンストラクタ主
DEFこの(パラメータリスト){//補助ビルダー
}
DEFこの(パラメータリスト){//コンストラクタは補助の複数を有していてもよいです...
}
}

object boke_demo01 {
 
  def main(args: Array[String]): Unit = {
    //    val p1 = new Person("Jack", 20)
    //    println(p1)
 
    //下面这句话就会调用def this(name:String)
    val p2 = new Person("Tom")
    println(p2)
  }
}
 
//构造器的快速入门
//创建Person对象的同时初始化对象的age属性值和name属性值
class Person(inName: String, inAge: Int) {
  var name: String = inName
  var age: Int = inAge
  age += 10
  println("~~~~~~~~~~")
 
  //重写了toString,便于输出对象的信息
  override def toString: String = {
    "name=" + this.name + "\t age" + this.age
  }
 
  println("ok~~~~~")
  println("age=" + age)
 
  def this(name: String) {
    //辅助构造器,必须在第一行显式调用主构造器(可以是直接,也可以是间接)
    this("Jack", 10)
    //this
    this.name = name //重新赋值
  }
}

Scalaのコンストラクタアクションは、新しいオブジェクトの初期化を完了され、コンストラクタは戻り値はありません。メインコンストラクタの声明では、に、クラス名の後に直接置きます。すべてのステートメントが実行プライマリコンストラクタクラス定義、ここでは、スカラ関数型プログラミングおよびオブジェクト指向一緒にプログラミングを理解即ち:コンストラクタメソッド(関数)、伝達関数、およびいくつかのパラメータと上記コンテンツの使用であります違いはありません。無プライマリコンストラクタパラメータ場合、括弧は、省略オブジェクトコンストラクタ括弧を省略してもよい構成する際に呼び出されてもよいです

class AA {
 
}
 
val a = new AA
val b = new AA()

、補助ビルダー複数のパラメータの異なるリストによって識別され、この補助構成名前(これは同じとJavaではない)、底部はコンストラクタをオーバーロードされています。
プライマリコンストラクタプライベートなプログラミングをしたい場合は、そのユーザーがのコンストラクタで補助オブジェクト()によって構築することができるので、例えば、民間追加する前に実行することができる:クラスPERSON2プライベート(){}
文が設定されておらず、補助メインコンフィギュレーション合意文が間違っている(つまり、コンストラクタ名前の重複)が発生します。

object boke_demo01 {
 
  def main(args: Array[String]): Unit = {
 
    val p1 = new Person2("jack")
    p1.showInfo()
  }
}
 
//定义了一个Person类
//Person 有几个构造器 4
class Person2 private() {
  var name: String = _
  var age: Int = _
 
  def this(name: String) {
    //辅助构造器无论是直接或间接,最终都一定要调用主构造器,执行主构造器的逻辑
    //而且需要放在辅助构造器的第一行[这点和java一样,java中一个构造器要调用同类的其它构造器,也需要放在第一行]
    this() //直接调用主构造器
    this.name = name
  }
 
  //辅助构造器
  def this(name: String, age: Int) {
    this() //直接调用主构造器
    this.name = name
    this.age = age
  }
 
  def this(age: Int) {
    this("匿名") //调用主构造器,因为 def this(name : String) 中调用了主构造器!
    this.age = age
  }
 
  def showInfo(): Unit = {
    println("person信息如下:")
    println("name=" + this.name)
    println("age=" + this.age)
  }
}
コンストラクタのパラメータ

Scalaのメインクラスのコンストラクタパラメータは、任意の変性剤で変性されていない場合、このパラメータは、ローカル変数です。パラメータvalのキーワードを宣言する場合は、Scalaはプライベート読み取り専用の属性クラスなどのパラメータを使用します。パラメータはvarキーワードを使用して宣言されている場合、Scalaは使用するクラスのメンバーとしてパラメータ属性し、対応するXXXを(提供する)同様のゲッター] / xxx_ $ EQ()同様のセッター】方法、その今回メンバプロパティそれはプライベートですが、読み取りおよび書き込みすることができます。

object boke_demo01 {
 
  def main(args: Array[String]): Unit = {
 
    val worker = new Worker("smith")
    worker.name //不能访问 inName
 
    val worker2 = new Worker2("smith2")
    worker2.inName  //可以访问 inName
    println("hello!")
 
    val worker3 = new Worker3("jack")
    worker3.inName = "mary"
    println(worker3.inName)
  }
}
 
//如果 主构造器是Worker(inName: String) ,那么 inName就是一个局部变量
class Worker(inName: String) {
  var name = inName
}
//如果 主构造器是Worker2(val inName: String) ,那么 inName就是Worker2的一个private的只读属性
class Worker2(val inName: String) {
  var name = inName
}
 
// 如果 主构造器是Worker3(var inName: String) ,那么 inName就是Worker3的一个
// 一个private 的可以读写属性
class Worker3(var inName: String) {
  var name = inName
}

フィールドは@BeanProperty場合スカラ、この自動生成された標準のsetXXX / getXXXメソッド増加します。その後、オブジェクト.setXxx()とプロパティを呼び出すオブジェクト.getXxx()を使用することができます。@BeanPropetryプロパティの注釈に加え、のgetXXX setXXXメソッドを生成し、自動的に類似)(オリジナルXXXの根底にある、xxx_ $ EQ()メソッドを生成した後、競合が存在しない、両者は共存することができます。

import scala.beans.BeanProperty
 
object boke_demo01 {
 
  def main(args: Array[String]): Unit = {
    val car = new Car
    car.name = "a"
    println(car.name)
 
    //使用 @BeanProperty 自动生成 getXxx 和 setXxx
    car.setName("b")
    println(car.getName())
  }
}
 
class Car {
  @BeanProperty var name: String = null
}

---- Blueicex 2020年2月15日夜06時06 [email protected]

公開された55元の記事 ウォンの賞賛0 ビュー1949

おすすめ

転載: blog.csdn.net/blueicex2017/article/details/104338813