ホームページ  >  記事  >  Java  >  Java と Scala がオブジェクト指向プログラミングを実装する方法

Java と Scala がオブジェクト指向プログラミングを実装する方法

WBOY
WBOY転載
2023-05-07 13:46:07848ブラウズ

Scala パッケージ:

基本構文:

パッケージ パッケージ名.クラス名

Scala パッケージの 3 つの主要な機能:

これらを区別する同じ名前の Class

クラスが多い場合でもクラスをうまく管理できる

アクセス範囲を制御

パッケージ名の命名規則:

は通常小文字です。ドット

com.会社名.プロジェクト名.ビジネスモジュール名

パッケージを作成する利点:

作成したパッケージをインポートできます。 Maven を介してプロジェクトに追加します

Scala でパッケージを記述する独自の方法は、フォルダーに対応せず、独立して存在することができます

下の図は、クラスの下に構築したパッケージです。通常のパッケージと同様に使用します

Java と Scala がオブジェクト指向プログラミングを実装する方法

パッケージは入れ子にすることができます

内层调用外层 不需要导包  atguigu包在techer下
外层调用内层 对象 需要导包

次のコード:

package chapter04
object Test_01_package {
  def main(args: Array[String]): Unit = {
  }
}
//Scala独有的
package techer {
  import chapter04.techer.atguigu.Inner
  object test01t {
    def main(args: Array[String]): Unit = {
      println("hello  我是大哥 pack")
      //外层调用内层 对象 需要导包
          //Inner.main是下边那个包中的
      Inner.main(args)
    }
  }
  package atguigu {
    object Inner {
      def main(args: Array[String]): Unit = {
        println("Inner")
        //内层调用外层 不需要导包  atguigu包在techer下
        test01t.main(args)
      }
    }
  }
}

Package オブジェクト:

Scala では、パッケージもオブジェクト指向であり、パッケージ内にある限り (内部にある限り、内部ネストも可能)、パッケージ オブジェクトのプロパティとメソッドを直接呼び出すことができます

パッケージがネストされている場合、オーバーライドが発生し、最も近いパッケージのプロパティとメソッドが呼び出されます (最も近いパッケージが後で呼び出され、以前に呼び出されたパッケージが上書きされます)

ガイド パッケージの説明:

ガイド パッケージは埋め込みをサポートしていません (パッケージをインポートすると、その下のクラスとオブジェクトのみが使用でき、その下のパッケージは使用できなくなります。その下のパッケージの場合は、 を使用する必要があります。ただし、パッケージをインポートして、その下のパッケージを直接インポートすると、 を使用せずに直接呼び出すことができます。 .Predef.__


クラスとオブジェクト:
クラス: テンプレートとみなすことができます
オブジェクト: 特定のものを表します
オブジェクトを使用するときは、クラスをテンプレートとして使用してオブジェクトを作成します

クラスの定義:

Java ではファイル内にパブリックは 1 つだけ存在できます

Scala ではデフォルトはパブリックですが、ファイル内にあります

カプセル化: ## 複数のコンパニオン クラスとコンパニオン オブジェクトを作成できます

#Scala には、変数 (var) と不変 (val) の 2 種類のプロパティしかありません (読み取り権限と書き込み権限が分離されています -- -- オブジェクト指向のカプセル化と同様です (get set メソッドは別の読み取りにカプセル化されます)および書き込み権限))

Scala では、プロパティの型はプロパティの型によって直接分離されます。

Scala では、プロパティの型は var--- にカプセル化されています。 -private val----private Final

そして、get set メソッドもカプセル化されています (アノテーションにカプセル化されています。get set メソッドを使用する場合は、アノテーション @BeanProperty を導入する必要があります--- -ただし、このアノテーションのスコープには属性が 1 つしかありません。つまり、アノテーションで 1 つの属性を設定する必要があります)

コンストラクター:

オブジェクト指向言語には基本的にコンストラクター (構築メソッド) があります。クラスにコンストラクターが存在しない場合. デフォルトのコンストラクターは空のパラメーターのコンストラクターです.

Scala にもコンストラクターがあります. Java とは異なり、

Scala のコンストラクターは () を追加します。クラス名。メイン コンストラクターです (メイン コンストラクターにパラメーターがない場合は () を省略できます。つまり、Java と同様に、デフォルトでパラメーターなしで構築できます)
メイン コンストラクターがある場合コンストラクター、スレーブ コンストラクターが必要です

# メイン コンストラクター内で定義できる補助コンストラクター定義の形式は固定されています。スレーブ コンストラクター内のコードの最初の行は、メイン コンストラクターを直接または間接的に呼び出す必要があります

class Person03(name:String){
  var name1:String=name
def this()
  {
    this("唐不唐")
    println("hello world")
  }
}

マスター/スレーブ コンストラクターのロード メカニズム:

Scala にはクラス ロード メカニズムがないため、コードが補助コンストラクターを直接呼び出すとき、クラスの内容がわからないため、上記の要件 (コンストラクター内のコードの最初の行から。メイン コンストラクターは直接または間接的に呼び出す必要があります)。これが理由です。クラス情報を取得し (一度ロードし)、呼び出し後にコンストラクターに戻って実行を継続します。が完了しました

メイン メソッドのパラメーターに従って決定されます どのコンストラクターを呼び出しますか?

コンストラクターからはシーケンスがあり、後のコンストラクターは前のコンストラクターのみを呼び出すことができます (コンストラクターが呼び出される)このコンストラクタの前にある必要があります)

コンストラクタから 名前はこれに統一されます(基本パラメータの数で区別されます)

メインコンストラクタはプロパティとして渡せるパラメータです(パラメータの型を省略した場合、デフォルトは val です)

継承 :

継承キーワード : extends

基本構文 :

class サブクラスname は親クラス名 {クラス本体} を拡張します

サブクラスは親クラスの属性とメソッドを継承します

#scala は単一継承です

継承の本質は次のとおりです。実際、Java とはまったく異なります。サブクラスのオブジェクトを作成するとき、Scala は最初に親クラスのオブジェクトを作成し、次に外側の層にサブクラス オブジェクトを作成します (Java と同じ)

Scala 継承の本質は、親クラスのコンストラクターを継承することです (そのコンストラクター (パラメーターの数が異なる) が呼び出されます)

抽象属性:

は、等号 抽象メソッドを記述するには、クラスを抽象クラスに変更する必要があります

抽象属性を使用する場合は、それを継承してプロパティとメソッドを書き換える必要があります(プロパティを書き換える必要はありません) Java。Scala の最下層はプロパティをカプセル化し、独自のメソッドを持っているため)

在重写抽象类中的非抽象方法的时候需要在重写的方法前面加上    override   关键字

子类调用父类的方法的时候使用关键字super  

子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;

子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
因为 var 修饰的为可变变量,子类继承之后就可以直接使用(可以直接进行修改),没有必要重写    

多态:

父类的引用指向子类的实例

Java中的多态测试

:在父子共有的属性和方法调用的是父类还是子类:

public class Polymorphic {
    public static void main(String[] args) {
        Person person=new Student();
        System.out.println(person.name);
        person.sayhi();
    }
    public static class Person{
     String   name="Person";
     public void sayhi()
     {
         System.out.println("person  sayhi");
     }
    }
public static class Student extends Person{
        String name="Student";
        public void sayhi()
        {
            System.out.println("student sayhi");
        }
}
 
}

属性是调用父类   方法是调用子类   

在进行多态的时候是先将整个内存先把父类写入里面,再把子类嵌套到外边

引用是使用栈 把地址值是先指向父类的   指向谁就调用谁的属性,但是调用方法是一层一层的调用,是不断的被重写的,所以方法是调用子类

Java と Scala がオブジェクト指向プログラミングを実装する方法

而Scala与Java不同 都是调用的子类的

Scala测试如下:
package chapter04
 
object Test07_Polymorphic {
  def main(args: Array[String]): Unit = {
       val  per:Person07=new Student07
       per.sayhi();
    println(per.name)
  }
}
class Person07()
{
  val name:String="dsdsd"
def sayhi():Unit={
  println("hi person")
}
}
class Student07 extends Person07{
  override val name: String = "Student"
override def sayhi(): Unit =
  {
    println("Student say hi")
  }
}

Java と Scala がオブジェクト指向プログラミングを実装する方法

匿名子类:

可以使用匿名子类直接调用抽象类

也可以直接new这个抽象子类

匿名子类是自动使用多态的

多态无法调用子类独有的属性和方法,外部无法使用匿名子类中特有的(它自己的)方法和属性

以上がJava と Scala がオブジェクト指向プログラミングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。