オブジェクト指向の機能-多態性

オブジェクト指向の機能-多態性

同じものが異なる瞬間に異なる状態を示します

存在するための3つの必要条件

継承(インターフェースの実現を含む)を持つため(前提条件)

書き換え(前提条件)

親クラス参照はサブクラスオブジェクトを指します(タイプがコンパイル時に親である場合、タイプは実行時にサブクラスになります)

package day5.demo3;
/**
  继承:
     在已有类的基础上,派生出新的类,新类可以拥有父类非私有的属性,方法
     提高代码可重用性,可扩展性

     是一种is-a关系   猫是动物,狗是动物
 Animal  称为  父类/基类
 */
public abstract class Animal {
    
    
        int ss=10;
      private String name;
       private  int age;
       public abstract void eat();
     public static void sleep(){
    
    
         System.out.println("睡觉");
     }
    public void setName(String name){
    
    
        this.name=name;
    }
    public String getName(){
    
    
        return this.name ;
     }

    public int getAge() {
    
    
        return this.age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }
}

package day5.demo3;

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

package day5.demo3;

/*
  在Animal的基础上派生出  狗类
       Java中一个类只能直接继承一个父类
 */
public class Dog extends Animal {
       private String type;
        int  ss=5;
    @Override
    public void eat() {
        System.out.println("吃骨头");
    }
    public void play(){
        System.out.println("狗会玩");
    }
    public void setType(String type){
           this.type=type;
       }
       public String getType(){
           return type;
       }

}

package day5.demo3;

public class Text {
    /*
      多态:
         同一个事物  在不同时刻表现的不同状态

         前提条件:
            继承    只有继承   父类才可以表示子类
            方法重写   在顶层父类中会定义一些抽象方法(没有方法实现) 只是作一些功能定义
                       子类继承后     重写父类中没有实现的方法

            父类引用指向子类对象
     */
    //编译看左边,运行看右边       针对成员方法
    public static void main(String[] args) {
        Animal dog=new Dog();
               dog.eat();
               //编译运行都看左边     静态方法
               dog.sleep();
        //编译运行都看左边     成员变量
        System.out.println(dog.ss);
        Animal cat=new Cat();
               cat.eat();
    }
}

メソッドパラメータは多形です

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

package day5.demo3;

public class Text1 {
    public static void main(String[] args) {
        //方法参数多态性的好处:提高代码的扩展性
        Animal dog=new Dog();
        Animal cat=new Cat();
        Text1 t=new Text1();
        t.feedAnimal(cat);
        t.feedAnimal(dog);
    }
    public void feedAnimal(Animal animal){
        animal.eat();
    }
    //非多态方法
   /*public static void main(String[] args) {
       Dog dog=new Dog();
       Cat cat=new Cat();
       Text1 t=new Text1();
       t.feedCat(cat);
       t.feedDog(dog);}
       public void feedCat(Cat cat){
           cat.eat();
       }
       public void feedDog(Dog dog){
           dog.eat();
       }*/

}

上向きの変換:

役割:プログラムのスケーラビリティを向上させます。

ダウンキャスト:

役割:サブクラスで一意のメソッドを使用するため。

package day5.demo3;

public class Text2 {
    public static void main(String[] args) {
        Animal animal = new Dog();//向上转型
        //多态问题:  父类类型不能访问子类特有的方法
        //解决办法:  向下转型

        Dog dog=(Dog)animal;// 目的是想要使用子类中的特有的方法
            dog.play();

        String s="sa";
        Object obj=s;    //object中包含String类型的方法
        if(obj instanceof Dog){     //instanceof   大类型   instanceof 小类型  判断俩边对象类型是否相同
            Dog d=(Dog)obj;       //Dog类中没有String类型
        }else {
            System.out.println("不是dog类型");
        }

    }
}

最終キーワード

プロパティ、メソッド、およびクラスを宣言するために使用されます

属性:定義は直接またはコンストラクターで割り当てる必要があり、後で変更することはできません。

メソッド:サブクラスで上書き(上書き)することはできません。

クラス:抽象クラスまたはインターフェースとして定義することはできず、継承することもできません。

最終的な属性の割り当て

宣言時に値を割り当てます。通常、静的で使用されます

宣言時に値を割り当てない場合は、コンストラクターで値を1つずつ割り当てる必要があります

一般的に:各オブジェクトが作成されるときに、final属性の値が決定されることを確認してください。

package day5.demo4;

/*
  final修饰类,方法,属性

   final 修饰的类不能被其他类继承
public final class  Father {
}
*/
public class Father{
    /*
    * final修饰的属性为常量,值不可改变,将其修饰为static,节省内存空间,所以对象关享一份。
    * */
    final static int NUM=2;//所以对象共享一份
    final int count;//每个对象都有一个常量

    public Father() {
        this.count = 5;
    }
    public void test(){

    }
    /*
    final修饰的方法不能被重写
    public final void test(){

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

        new Father();
        testFinal(1);
        testFinal(2);
    }
    public static void testFinal(final int a){
        //a=10;
        System.out.println(a);
    }

}
package day5.demo4;

public class Son  extends Father{
    public Son(int count) {
        super();
    }
}

抽象クラス

クラスには、特定のオブジェクトを説明するのに十分な情報が含まれていません

抽象クラスがオブジェクトをインスタンス化できないことに加えて、クラスの他の関数がまだ存在します。メンバー変数、メンバーメソッド、および構築メソッドのアクセスメソッドは、通常のクラスのものと同じです。

抽象で装飾されたクラスは抽象クラスでなければなりません

クラスに抽象メソッドが含まれている場合、このクラスは抽象クラスである必要があります

クラスが抽象である場合、抽象メソッドを持つことはできません

抽象的方法

特別なメソッドです。宣言のみがあり、特定の実装はありません。

抽象キーワードで変更する必要があります

package day5.demo5;
/*
 抽象类中有没有未实现功能的方法
    被abstract修饰的类


      如果一个类中有抽象方法(没有实现的方法),那么这个类一定是抽象类
      如果一个类是抽象类  不一定有抽象方法
 */

public abstract class Animal {
    int num;//成员变量
    //构造方法
    public Animal(){

    }
    //抽象方法
    public abstract void eat();

    //成员方法
    public void sleep(){

    }
    //静态方法
    public static void drink(){

    }
}

package day5.demo5;

//public abstract class Dog extends Animal{
/*
     如果一个类继承了抽象类:
          要么重写抽象类中所以抽象方法
          要么将当前类也声明成抽象类

 */
public abstract class Dog extends Animal{

}

ソフトウェア開発プロセスにおける抽象的なクラス、抽象的なメソッド、および設計概念。

おすすめ

転載: blog.csdn.net/ZJ_1011487813/article/details/109317069