Javaの最後のキーワード、インターフェース、ポリモーフィズム

最後のキーワード

最後のキーワードは最終的な意味であり、変更できます(メソッド、変数、クラス)

最終改造の特徴

変更メソッド:メソッドが最終メソッドであり、オーバーライドできないことを示します

変更された変数:変数が定数であり、再度割り当てることができないことを示します

変更されたクラス:クラスが最終クラスであり、継承できないことを示します

/変数はスタックに格納されます

/新しいものはヒープに格納されます

 基本数据类型变量:其值不能被更改
//常量的命名规范:如果是一个单词,所有字母大写,如果是多个单词,所有字母大写
   //但中间需要使用_分隔
   final int NAX = 10;
   final int MAX_VALUE = 20;
引用数据类型变量:内存地址不能被更改,但是可以修改对象的属性值
    final  Student stu = new Student();
        stu.setName("张三");
        stu.setName("李四");
 //final修饰成员变量 初始化时机
    //1.在创建的时候,直接给值
    //2.在构造方法结束之前,完成赋值

コードブロック

{}で囲まれたコードはコードブロックと呼ばれます

部分的なコードブロック:

場所:メソッドで定義

役割:変数のライフサイクルを制限し、変数を早期に解放して、メモリ使用率を改善する

コードブロックを作成します。

場所:クラスのメソッドの外側

機能:構築メソッドが実行されるたびに、構築メソッドが実行される前にコードブロックが実行されます。

機能:複数の構築メソッドで同じコードを構築コードブロックに抽出して、コードの再利用性を向上させる

静的コードブロック:

場所:クラスのメソッドの外側

機能:staticキーワードで変更し、クラスの読み込みで読み込み、1回だけ実行する必要があります

機能:クラスのロード時にデータの初期化操作を実行します。通常、ドライバーのインストールに使用されます

インターフェース:

もっと実現

クラス内のすべてのメソッドが抽象メソッドである場合、それらをインターフェイスとして定義できます

インターフェースも参照データ型であり、抽象クラスより抽象的です

インターフェースの存在の2つの重要な意味

1.ルールの定義

2.プログラムの拡張

インターフェースの定義と特徴:

インターフェイスはキーワードインターフェイスで定義されます

公開インターフェースインターフェース名{}

インターフェイスをインスタンス化できません

インターフェイスとクラスの間には実装関係があり、それはimplementsキーワードによって表されます

パブリッククラスクラス名はインターフェイス名{}を実装します

インターフェースサブクラス(実装クラス)

インターフェースのすべての抽象メソッドを書き直す

抽象クラス

例:

public class Demo1 {
    
    
    public static void main(String[] args) {
    
    
        Cat c = new Cat();
        c.catchMouse();
        Dog d = new Dog();
        d.catchMouse();
    }
}
interface CM{
    
    
    public abstract void catchMouse();//抽象方法
}
class Cat implements CM{
    
    //接口实现

    @Override
    public void catchMouse() {
    
    //重写方法
        System.out.println("猫抓老鼠");
    }
}
class Dog implements CM{
    
    //接口实现

    @Override
    public void catchMouse() {
    
    //重写方法
        System.out.println("狗拿耗子");
    }
}

注:インターフェースとクラス間の実装関係は、個別に実装することも、複数の実装で実装することもできます。

パブリッククラスクラス名は、インターフェイス1、インターフェイス2を実装します{}

public class Test1Interface {
    
    
    /*
    接口定义格式:
    public interface 接口名{}

    类实现接口的格式:
    public class 类名 implements 接口名{}
     */
    public static void main(String[] args) {
    
    
      //Inter i = new Inter();接口不允许创建对象
        InterImpl ii = new InterImpl();
        ii.study();
    }
}
public class InterImpl implements Inter,InterA{
    
    
    @Override
    public void study() {
    
    
        System.out.println("我是实现类中的study方法");
    }

    @Override
    public void print1() {
    
    

    }

    @Override
    public void print2() {
    
    

    }
}
public interface Inter {
    
    
    public abstract void study();
}
public interface InterA {
    
    
    public abstract void print1();
    public abstract void print2();
}
インターフェースのメンバーの機能:

メンバー変数:

接口中成员变量只能是常量
系统会默认加入三个关键字:public static final

工法:

インターフェースにはありません

メンバーの方法:

メンバーメソッド:抽象メソッドのみ、システムはデフォルトで2つのキーワード
public abstract

public class TestInterface {
    
    
    /*
    接口中成员变量只能是常量,系统会默认加入三个关键字
       public static final
     构造方法:接口中没有
     成员方法:只能是抽象方法,系统会默认给两个关键字
     public abstract
     */
    public static void main(String[] args) {
    
    
        System.out.println(Inter.NUM);
    }
}
class InterImpl extends Object implements Inter{
    
    //所有的类默认的父类是Object
    public InterImpl(){
    
    
        super();
    }
    public void method(){
    
    
        //num = 20;
        System.out.println(NUM);
    }

    @Override
    public void show() {
    
    

    }
}
interface Inter  {
    
    
    //接口中的变量是常量,默认会被final,static,public关键字修饰
    public static final int NUM = 10;
    //public Inter(){}
    public abstract void show();
}

JDK8バージョンのインターフェースメンバーの機能:

JDK8バージョンの後:

1.インターフェイスで非抽象メソッドを定義できますが、キーワードdefaultで変更する必要があります。これらのメソッドはデフォルトメソッドです

役割:インターフェースのアップグレードの問題を解決する

2.静的静的メソッドをインターフェースで定義することができます

インターフェースのデフォルトメソッドの定義形式:

形式:パブリックデフォルトの戻り値の型メソッド名(パラメーターリスト)()

例:public default void show()()

インターフェースのデフォルトメソッドに関する注意:

デフォルトのメソッドは抽象メソッドではないため、書き換える必要はありませんが、書き換えることはできます。書き換えるときはデフォルトのキーワードを削除してください

publicは省略でき、デフォルトは省略できません

複数のインターフェースが実装され、同じメソッド宣言が複数のインターフェースに存在する場合、サブクラスはメソッドをオーバーライドする必要があります

インターフェースの静的メソッドに関する注意:

1.静的メソッドは、実装クラス名やオブジェクト名ではなく、インターフェース名でのみ呼び出すことができます

2.publicは省略でき、staticは省略できません

クラスとインターフェースの関係:

クラスとクラスの関係:

継承関係、単一継承のみ、マルチレイヤー継承

クラスとインターフェースの関係:

実現関係は、単一または複数の実装で実装でき、複数のインターフェースは、クラスを継承する同僚で実装できます

//親クラスとインターフェースが同じメソッド宣言を持っている場合、親クラス

インターフェースとインターフェースの関係:

継承関係は、単一継承または多重継承です

ポリモーフィズム:

パラメータを渡すと親クラスを渡す

親クラス参照は子クラスオブジェクトを指します

同じオブジェクトを異なるタイミングで異なる形式で

例:猫

猫は猫であると言える:cat cat = new cat();

猫は動物であるとも言えます:animal = new cat();

ここの猫は、さまざまな瞬間にさまざまな形を示します。これは多型です。

多型の前提と現れ:

継承/実装関係がある

書き直す方法があります

親クラスがサブクラスオブジェクトを参照する

例:

public class Test1Polymorphic {
    
    
    /*
    多态的前提:
    1.要有(继承\实现)关系
    2.要有方法重写
    3.要有父类引用,指向子类对象

     */
    public static void main(String[] args) {
    
    

        //当前事物是一只猫
        Cat c = new Cat();
        //当前事物是一只动物
        Animal a = new Cat();
        a.eat();
    }
}
class Animal{
    
    
    public void eat(){
    
    
        System.out.println("动物吃饭");
    }
}
class Cat extends Animal{
    
    
    @Override
    public void eat() {
    
    
        System.out.println("猫吃鱼");
    }
}

ポリモーフィズムにおけるメンバーアクセスの機能:

構築メソッド:継承と同様に、サブクラスはスーパーを通じて親クラスの構築メソッドにアクセスします

メンバー変数:コンパイルして左側を見て(親クラス)、実行して左側を見て(親クラス)

メンバーメソッド:コンパイルして左側(親クラス)を確認し、実行して右側(親クラス)を確認

public class Test2Polymorphic {
    
    
    /*
    多态成员访问特点:
    成员变量:编译看左边(父类),执行看左边(父类)
    成员方法:编译看左边(父类),执行看右边(父类)
     */
    public static void main(String[] args) {
    
    
        Fu f =new Zi();
        System.out.println(f.num);//10,但必须有父类中的num
        f.method();//Zi...method   父类中必须有method()方法
    }
}
class Fu{
    
    
    int num =10;
    public  void method(){
    
    
        System.out.println("Fu...method");
    }
}
class Zi extends Fu{
    
    
    int num = 20;
    public void method(){
    
    
        System.out.println("Zi...method");
    }
}

メンバー変数とメンバーメソッドのアクセスが異なるのはなぜですか?

1.メンバーメソッドは書き換えられるが、メンバー変数は書き換えられないため

多態性の長所と短所:

利点:コードのスケーラビリティを向上させる

特定の実施形態:パラメータとして親タイプを使用してメソッドを定義する場合、メソッドはこの親クラスの子オブジェクトを受け入れることができます

短所:サブクラス固有の関数を呼び出せない

例:

public class Test3Polymorphic {
    
    
    public static void main(String[] args) {
    
    
        useAnimal(new Dog());
        useAnimal(new Cat());
    }
    public  static  void useAnimal(Animal a){
    
    
        a.eat();
    }
}
abstract class Animal{
    
    
    public abstract void eat();
}
class Dog extends Animal{
    
    

    @Override
    public void eat() {
    
    
        System.out.println("狗吃肉");
    }
}
class  Cat extends Animal{
    
    

    @Override
    public void eat() {
    
    
        System.out.println("猫吃鱼");
    }
}

ポリモーフィズムの変換:

上向きの変化:息子から父親へ

親子クラスオブジェクトへの参照

下方変換:親から子へ

サブクラスオブジェクトへの親クラス参照

例:

public class Test4Polymorpic {
    
    
    public static void main(String[] args) {
    
    
        //1.向上转型:从子到父
        //     父类引用指向子类对象

        Fu f = new Zi();
        f.show();
        //多态的弊端 不能调用子类特有的功能
        //f.method();

        //A.直接创建子类对象
        //B.向下转型
        //2.向下转型:从父到子
        //   父类引用转为子类对象  强制转换
        Zi z = (Zi)f;
        z.method();
    }
}
class Fu{
    
    

    public  void show(){
    
    

        System.out.println("Fu...show");
    }
}
class Zi extends Fu {
    
    
    @Override
    public void show()
    {
    
    
        System.out.println("Zi...show");
    }

    public void method() {
    
    
        System.out.println("我是子类特有的方法,method");
    }
}
多型における変換のリスク

変換された参照型変数、対応する実際の型、ターゲット型が同じ型でない場合、変換時に名前がClassCastExceptionとして表示されます

強制転送の問題を回避する

キーワード:instanceof

形式を使用:

タイプの変数名

一般的な理解:キーワードの左側の変数が右側の型であるかどうかを判別し、ブール型の結果を返します

例:

public class Test3Polymorphic {
    
    
    public static void main(String[] args) {
    
    
        useAnimal(new Dog());
        useAnimal(new Cat());
    }
    public  static  void useAnimal(Animal a){
    
    

        a.eat();
        if(a instanceof  Dog){
    
    
            Dog dog = (Dog) a;
            dog.watchHome();//ClassCastException类型转换异常
        }
       // Dog dog = (Dog) a;
       // dog.watchHome();//ClassCastException类型转换异常
    }
}
abstract class Animal{
    
    
    public abstract void eat();
}
class Dog extends Animal{
    
    

    @Override
    public void eat() {
    
    

        System.out.println("狗吃肉");
    }
    public void watchHome() {
    
    

        System.out.println("看门");
    }

}
class  Cat extends Animal{
    
    

    @Override
    public void eat() {
    
    

        System.out.println("猫吃鱼");
    }
}

おすすめ

転載: blog.csdn.net/qq_42073385/article/details/108039626