Spark 기본 학습 노트: Scala 클래스 및 객체

기사 디렉토리

한 종류

(1) 클래스 정의

객체는 클래스의 구체적인 인스턴스입니다. 클래스는 추상적이고 메모리를 차지하지 않는 반면 객체는 구체적이며 저장 공간을 차지합니다.
여기에 이미지 설명 삽입

class User {
    private var name = "张三丰"
    private var gender = "男"
    private var age = 25

    def speak(): Unit = println(name + ", " + gender + ", 今年" + age + "岁了~")
}

(2) 클래스 인스턴스화

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

2. 싱글톤 객체

(1) 싱글톤 객체 개념

Scala에는 정적 메서드나 정적 필드가 없지만 키워드 object를 사용하여 싱글톤 개체를 정의할 수 있습니다. 싱글톤 개체의 메서드는 Java의 정적 메서드와 동일하며 "싱글톤 개체 이름"을 직접 사용할 수 있습니다. 메서드 이름" 메서드를 호출합니다. 싱글톤 객체는 생성자 매개변수가 없다는 점을 제외하면 클래스의 모든 특성을 가질 수 있습니다.

(2) 사례 시연

여기에 이미지 설명 삽입

object Person {
    private var name = "陈燕文"
    private var gender = "女"
    private var age = 18

    def speak(): Unit = println(name + ", " + gender + ", 今年" + age + "岁了~")
}

3. 수반물품

(1) 컴패니언 객체의 개념

싱글톤 객체가 클래스와 이름이 같은 경우 해당 객체를 해당 클래스의 컴패니언 객체라고 합니다. 이 클래스를 객체의 컴패니언 클래스라고 합니다. 클래스와 동반 객체는 동일한 파일에서 정의되어야 하며 둘 다 개인 멤버에 액세스할 수 있습니다.

(2) 사례 시연

여기에 이미지 설명 삽입

4, get 및 set 메서드

(1) 생성 원리

기본적으로 Scala는 클래스 속성의 수정자에 따라 다양한 get 및 set 메서드를 생성합니다.

1. val에 의해 수정된 속성

시스템은 개인 상수 속성과 공용 get 메서드를 자동으로 생성합니다.

2. var 수정 속성

시스템은 개인 변수 속성과 공용 get/set 메소드 쌍을 자동으로 생성합니다.

3. private var에 의해 수정된 속성

시스템은 클래스의 개인 속성에 해당하는 한 쌍의 개인 get/set 메서드를 자동으로 생성하며 클래스 내부 및 컴패니언 객체에서만 사용할 수 있습니다.

4. private[this]에 의해 수정된 속성

시스템은 get/set 메서드를 생성하지 않습니다. 즉, 속성은 클래스 내에서만 사용할 수 있습니다.

(2) 사례 시연

작업 1. 시스템에서 자동으로 생성된 get 및 set 메서드 사용

(1) Dog 클래스 생성

여기에 이미지 설명 삽입

package net.py.obj

class Dog {
  val id: Int = 1 // 系统会自动生成公共的get方法
  var name: String = "瑞瑞" // 系统会自动生成公共的get和set方法
  private var gender: String = "公" // 系统会自动生成私有的get和set方法,只有伴生对象可以访问
  private[this] var age: Int = 5 // 系统不会生成get和set方法,即使伴生对象也无法访问
}

(2) 바이트코드 파일로 컴파일

Dog.scala를 Dog.class로 컴파일하고 프로젝트의 아웃 디렉토리에서 클릭하여 레이어별로 열고 Dog를 찾아 바이트 코드 파일을 생성합니다.

(3) 바이트코드 파일을 자바 코드로 디컴파일

여기에 이미지 설명 삽입

(4) 디컴파일로 생성된 Java 코드 설명

name 속성을 예로 들어보겠습니다. Scala에서 get 및 set 메소드 이름은 getName 및 setName이 아니라 name 및 name_=입니다. JVM에서는 메소드 이름에 =가 표시되는 것을 허용하지 않으므로 =는 KaTeX 구문 분석으로 변환됩니다. 오류 : 97번 위치의 '_' 다음에 그룹이 예상됨: ...메소드에 해당하는 name() 및 name_̲ eq() 메서드는 모두 공용입니다. 생성됨 - gender() 및 gender_$eq() 속성 age는 private[this]로 수정되므로 get 및 set 메서드가 생성되지 않으며 클래스 내에서만 사용할 수 있습니다.

(5) Dog 클래스를 테스트하기 위한 싱글톤 객체 생성

여기에 이미지 설명 삽입

작업 2. 사용자는 개인 속성에 대한 Scala 스타일 get 및 set 메서드를 작성합니다.

고양이 클래스 만들기
여기에 이미지 설명 삽입

작업 3. 사용자는 개인 속성에 대한 Java 스타일 get 및 set 메서드를 작성합니다.

새 클래스 만들기
여기에 이미지 설명 삽입

5. 생성자

(1) 메인 생성자

1. val 또는 var가 있는 생성자 매개변수

net.py.consrtucuor 패키지에 Person 클래스를 만듭니다.
여기에 이미지 설명 삽입

2. 액세스 권한이 있는 생성자 매개변수

기본 생성자의 매개변수에 접근 수정자를 추가하여
매개변수의 접근 권한을 제어할 수 있습니다.Person 클래스를 생성하고 매개변수 age를 private으로 설정하고 매개변수 이름을 수정 불가능(val)으로 설정합니다.

class Person (val name: String, private var age: Int) {
  
}

3. var 또는 val이 없는 생성자 매개변수

class Person (name: String, age: Int) {
  
}

액세스 권한이 있는 매개변수로 재작성 가능

class Person (private[this] val name: String, private[this] val age: Int) {
  
}

4. 클래스 초기화 문

net.py.constructor 패키지에 Dog 클래스를 만듭니다.
여기에 이미지 설명 삽입

package net.py.constructor

class Dog (var name: String, var age: Int){
  name = "瑞瑞"
  age = 5
  println("主构造器被调用了~")

  def speak(): Unit = println(name + "今年" + age + "岁了~")
}

// 伴生对象
object Dog {
  def main(args: Array[String]): Unit = {
    val dog = new Dog("", 0)
    dog.speak()
  }
}

프로그램을 실행하여 결과 보기

主构造器被调用了~
瑞瑞今年5岁了~

5. 민영화 생성자

여기에 이미지 설명 삽입

package net.py.constructor
class Cat private (var name: String, var age: Int) {
  def speak(): Unit = {
    println(name + "今年" + age + "岁了~")
  }
}

// 伴生对象
object Cat {
  def main(args: Array[String]): Unit = {
    val cat = new Cat("刘璐", 9)
    cat.speak()
  }
}

프로그램을 실행하여 결과 보기

刘璐今年9岁了~

6. 매개변수 생성자가 없음

net.py.constructor 패키지에서 Bird 클래스를 생성합니다.
여기에 이미지 설명 삽입

package net.py.constructor

class Bird () { // 显式定义无参构造器
  var name = "mike"
  var age = 7

  def speak(): Unit = {
    println(name + "今年" + age + "岁了~")
  }
}

// 伴生对象
object Bird {
  def main(args: Array[String]): Unit = {
    val bird = new Bird() // 调用无参构造器实例化
    bird.speak()
  }
}

프로그램을 실행하여 결과 보기

mike今年7岁了~

(2) 보조 생성자

1. 보조 생성자 정의 시 주의사항

보조 생성자의 메서드 이름은 다음과 같습니다.
각 보조 생성자의 메서드 본문은 다른 정의된 생성자를 먼저 호출해야 합니다.
보조 생성자의 매개 변수는 var 또는 val로 수정할 수 없습니다.

2. 사례 시연

(1) 매개변수가 없는 기본 생성자와 매개변수가 있는 보조 생성자

여기에 이미지 설명 삽입

package net.py.constructor

class Student {
  private var name = "淑英"
  private var age = 18

  // 定义单参辅助构造器
  def this(name: String) = {
    this() // 调用无参主构造器
    this.name = name
  }

  // 定义双参辅助构造器
  def this(name:String, age: Int) = {
    this(name) // 调用单参辅助构造器
    this.age = age
  }

  // 重写toString方法
  override def toString: String = name + "今年" + age + "岁了~"
}

// 伴生对象
object Student {
  def main(args: Array[String]): Unit = {
    // 调用无参构造器实例化
    val student1 = new Student()
    println(student1)
    // 调用单参辅助构造器实例化
    val student2 = new Student("禹欢")
    println(student2)
    // 调用双参辅助构造器实例化
    val student3 = new Student("黎塘", 19)
    println(student3)
  }
}

프로그램을 실행하여 결과 보기

淑英今年18岁了~
禹欢今年18岁了~
黎塘今年19岁了~

(2) 매개변수가 있는 기본 생성자와 매개변수가 있는 보조 생성자

여기에 이미지 설명 삽입

package net.py.constructor
class Teacher (private var name: String, private var age: Int)   { 
  private var gender = ""
  def this(name: String, age: Int, gender: String) = {
    this(name, age) // 调用双参主构造器
    this.gender = gender
  }

  // 重写toString方法
  override def toString: String = name + "," + gender + ",今年" + age + "岁了~"
}

// 伴生对象
object Teacher {
  def main(args: Array[String]): Unit = {
    // 调用三参辅助构造器实例化
    val teacher = new Teacher("萧红", 20, "女")
    println(teacher)
  }
}

프로그램을 실행하여 결과 보기

萧红,女,今年20岁~

6. 추상 클래스

(1) 추상 클래스의 정의

abstract class 类名 {

}

(2) 추상 클래스의 특징

1 추상 클래스는 인스턴스화할 수 없습니다.
2 추상 필드(초기화되지 않은 필드)와 추상 메소드(비구현 메소드)는 추상 클래스에서 정의할 수 있으며, 초기화 필드와 구현 메소드도 정의할 수 있습니다.

(3) 사례 시연

1. 추상 클래스 만들기 - Person

net.py.absclass 패키지에서 Person 추상 클래스를 만듭니다.
여기에 이미지 설명 삽입

package net.py.absclass
abstract class Person {
  var name: String // 抽象字段
  var age: Int // 抽象字段
  var address: String = "泸州市纳溪区" // 普通字段

  // 抽象方法
  def speak()

  // 普通方法
  def walk(): Unit = {
    print(name + "弹钢琴~")
  }
}

2. 추상 클래스 상속 및 공통 클래스 생성 - 교사


여기에 이미지 설명 삽입net.py.absclass 패키지 `패키지 net.py.absclass 에서 교사 일반 클래스를 만듭니다.

class Teacher extends Person { // 추상 필드 구현(재정의 없음) var name: String = "Xiao Hong" var age: Int = 20


// 오버라이드 없이 추상 메서드 구현
def speak(): Unit = { println(name + ", 올해" + age + "살, 사는 곳" + address + ", 노래와 춤을 잘합니다." ) }


// 일반적인 메서드를 재정의하려면 override override def walk()를 추가해야 합니다 . Unit = { println(name + "I like playing the piano~") } } `



3. 테스트 싱글톤 개체 만들기 - TestTeacher

net.py.absclass 패키지에 TestTeacher 싱글톤 객체를 생성합니다.
여기에 이미지 설명 삽입

4. 프로그램 실행 및 결과 보기

萧红,今年20岁,家住泸州市纳溪区,擅长唱歌舞蹈。
萧红喜欢弹钢琴~

7. 특성

(1) 특성의 개념

(2) 형질의 정의

1. 문법적 형식

2. 사례 시연

작업 1. 애완 동물 특성 만들기 - 애완 동물

여기에 이미지 설명 삽입

package net.py.mytrait

trait Pet {
  // 抽象字段
  var name: String
  var age: Int
  // 抽象方法
  def speak
  // 普通方法
  def eat: Unit = {
    print(name + "在吃东西~")
  }
}

작업 2. 실행 특성 만들기 - Runnable

여기에 이미지 설명 삽입

작업 3. 비행 특성 만들기 - Flyable

여기에 이미지 설명 삽입

(3) 특성의 구현

1. 문법적 형식

(1) 트레이트 구현

class 类名 extends 特质名 {
   // 实现抽象字段
   // 实现抽象方法
}

(2) 여러 특성 구현

class 类名 extends 特质名1 with 特质名2 with 特质名3 …… with 特质名n {
   // 实现抽象字段
   // 实现抽象方法
}

2. 사례 시연

작업 1. 트레이트 구현

package net.py.mytrait

class Cat extends Pet {
  // 实现抽象字段
  var name: String = "虎丸"
  var age: Int = 3

  // 实现抽象方法
  def speak: Unit = {
    println(name + "今年" + age + "岁了~")
  }

  // 重写普通方法
  override def eat: Unit = {
    println(name + "在吃鱼虾~")
  }
}

// 伴生对象
object Cat {
  def main(args: Array[String]): Unit = {
    // 创建猫对象
    val cat = new Cat()
    // 调用对象方法
    cat.speak
    cat.eat
  }
}

여기에 이미지 설명 삽입

작업 2. 여러 트레이트 구현

package net.py.mytrait

class Bird extends Pet with Runnable with Flyable {
  var name: String = "玲玲"
  var age: Int = 2

  def speak: Unit = {
    println("鸟儿[" + name + "]今年" + age + "岁了~")
  }

  def run: Unit = {
    println("鸟儿[" + name + "]在欢快地奔跑~")
  }

  def fly: Unit = {
    println("鸟儿[" + name + "]在自由地飞翔~")
  }
}

// 伴生对象
object Bird {
  def main(args: Array[String]): Unit = {
    // 创建鸟对象
    val bird = new Bird()
    // 调用对象方法
    bird.speak
    bird.run
    bird.fly
  }
}

여기에 이미지 설명 삽입

프로그램을 실행하여 결과 보기

鸟儿[玲儿]今年2岁了~
鸟儿[玲儿]在欢快的奔跑~
鸟儿[玲儿]在自由的飞翔~

Supongo que te gusta

Origin blog.csdn.net/py20010218/article/details/125339446
Recomendado
Clasificación