ホームページ >Java >&#&チュートリアル >Java と Scala がオブジェクト指向プログラミングを実装する方法
パッケージ パッケージ名.クラス名
これらを区別する同じ名前の Class
クラスが多い場合でもクラスをうまく管理できる
アクセス範囲を制御
は通常小文字です。ドット
com.会社名.プロジェクト名.ビジネスモジュール名
作成したパッケージをインポートできます。 Maven を介してプロジェクトに追加します
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) } } } }
Scala では、パッケージもオブジェクト指向であり、パッケージ内にある限り (内部にある限り、内部ネストも可能)、パッケージ オブジェクトのプロパティとメソッドを直接呼び出すことができます
パッケージがネストされている場合、オーバーライドが発生し、最も近いパッケージのプロパティとメソッドが呼び出されます (最も近いパッケージが後で呼び出され、以前に呼び出されたパッケージが上書きされます)
ガイド パッケージは埋め込みをサポートしていません (パッケージをインポートすると、その下のクラスとオブジェクトのみが使用でき、その下のパッケージは使用できなくなります。その下のパッケージの場合は、 を使用する必要があります。ただし、パッケージをインポートして、その下のパッケージを直接インポートすると、 を使用せずに直接呼び出すことができます。 .Predef.__
クラスとオブジェクト:
クラス: テンプレートとみなすことができます
オブジェクト: 特定のものを表しますオブジェクトを使用するときは、クラスをテンプレートとして使用してオブジェクトを作成します
Java ではファイル内にパブリックは 1 つだけ存在できます
Scala ではデフォルトはパブリックですが、ファイル内にあります
# メイン コンストラクター内で定義できる補助コンストラクター定義の形式は固定されています。スレーブ コンストラクター内のコードの最初の行は、メイン コンストラクターを直接または間接的に呼び出す必要があります
class Person03(name:String){ var name1:String=name def this() { this("唐不唐") println("hello world") } }
マスター/スレーブ コンストラクターのロード メカニズム:
Scala にはクラス ロード メカニズムがないため、コードが補助コンストラクターを直接呼び出すとき、クラスの内容がわからないため、上記の要件 (コンストラクター内のコードの最初の行から。メイン コンストラクターは直接または間接的に呼び出す必要があります)。これが理由です。クラス情報を取得し (一度ロードし)、呼び出し後にコンストラクターに戻って実行を継続します。が完了しました
メイン メソッドのパラメーターに従って決定されます どのコンストラクターを呼び出しますか?
コンストラクターからはシーケンスがあり、後のコンストラクターは前のコンストラクターのみを呼び出すことができます (コンストラクターが呼び出される)このコンストラクタの前にある必要があります)
メインコンストラクタはプロパティとして渡せるパラメータです(パラメータの型を省略した場合、デフォルトは val です)
継承 :
継承キーワード : extends
基本構文 :
class サブクラスname は親クラス名 {クラス本体} を拡張しますサブクラスは親クラスの属性とメソッドを継承します
継承の本質は次のとおりです。実際、Java とはまったく異なります。サブクラスのオブジェクトを作成するとき、Scala は最初に親クラスのオブジェクトを作成し、次に外側の層にサブクラス オブジェクトを作成します (Java と同じ)
Scala 継承の本質は、親クラスのコンストラクターを継承することです (そのコンストラクター (パラメーターの数が異なる) が呼び出されます)
抽象属性:
は、等号 抽象メソッドを記述するには、クラスを抽象クラスに変更する必要があります
抽象属性を使用する場合は、それを継承してプロパティとメソッドを書き換える必要があります(プロパティを書き換える必要はありません) Java。Scala の最下層はプロパティをカプセル化し、独自のメソッドを持っているため)
在重写抽象类中的非抽象方法的时候需要在重写的方法前面加上 override 关键字
子类调用父类的方法的时候使用关键字super
子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;
子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
因为 var 修饰的为可变变量,子类继承之后就可以直接使用(可以直接进行修改),没有必要重写
父类的引用指向子类的实例
:在父子共有的属性和方法调用的是父类还是子类:
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"); } } }
属性是调用父类 方法是调用子类
在进行多态的时候是先将整个内存先把父类写入里面,再把子类嵌套到外边
引用是使用栈 把地址值是先指向父类的 指向谁就调用谁的属性,但是调用方法是一层一层的调用,是不断的被重写的,所以方法是调用子类
而Scala与Java不同 都是调用的子类的
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") } }
匿名子类:
可以使用匿名子类直接调用抽象类
也可以直接new这个抽象子类
匿名子类是自动使用多态的
多态无法调用子类独有的属性和方法,外部无法使用匿名子类中特有的(它自己的)方法和属性
以上がJava と Scala がオブジェクト指向プログラミングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。