ホームページ > Java > &#&チュートリアル > Java の状態クラスと抽象クラスとは何ですか?

Java の状態クラスと抽象クラスとは何ですか?

王林
リリース: 2023-05-26 14:22:46
転載
1542 人が閲覧しました

ポリモーフィズム:

Java の 3 つの主要な機能: カプセル化、継承、ポリモーフィズム 。最初の 2 つは Java 入門 (6) で説明しましたが、ここではポリモーフィズムの機能について説明します。

ポリモーフィズムとは何ですか?

名前が示すように、ポリモーフィズムは 複数の形式意味

Java におけるポリモーフィズムの意味:

1 . オブジェクトにメッセージを送信し、そのメッセージに応じてどの動作を採用するかをオブジェクトに決定させます

2. サブクラス オブジェクトの参照を親クラスの参照変数に割り当てて、動的メソッド呼び出しを実装します

Java におけるポリモーフィズムの前提条件:

1. 継承

2. 親クラス メソッドのオーバーライド

3. 上方変換

私のポリモーフィズムの説明:

たとえば、私たちは人間、学生、若者です。私は人間として、または学生として物事を行うことができます。学生チケットは次のように購入できます。若者として、あるいはあなたが若者として慈善活動を行うこともできます。そうすれば、私たちはさまざまな形でさまざまなことを行うことができます。これはよく理解できたでしょうか?

注:

ポリモーフィックの前提条件: 子と親のクラス関係が存在する必要があります。

多態性の親クラス参照変数を使用してメソッドを呼び出すと、サブクラスのオーバーライドされたメソッドが呼び出されます。

ポリモーフィズムの定義と使用形式:

親クラス型変数名=新しいサブクラス型();

ポリモーフィズムの特徴メンバー:

  • 多態性メンバー変数: コンパイルして実行、左側を見てください。

  • 多態性メンバー メソッド: コンパイルして実行して、左側を見てください。実行して右側を見てください

ポリモーフィック変換:

  • ポリモーフィック変換は上向きに分かれています変換と下方変換の 2 種類

  • 上方変換: ポリモーフィズム自体が上方変換のプロセスである

使用形式: 親クラス型変数名= new subclass Type();

適用可能なシナリオ: サブクラス型に直面する必要がない場合、対応する操作は、スケーラビリティを向上させるか、親クラスの関数を使用することによって完了できます。

  • 下方変換: 上方変換されたサブクラス オブジェクトは、強制型変換の形式を使用して、親クラス参照型をサブクラス参照型に変換できます

  • 使用形式: サブクラス型変数名 = (サブクラス型) 親クラス型変数;

  • ##適用シナリオ: サブクラス独自の機能を使用したい場合。

コードの説明:

public class Person {     //人类,作为父类使用
    public void speak(){
        System.out.println("我们都是一个人");
    }
}
public class Student extends Person{    //继承父类,相当于我们是学生,有人的方法
    @Override
    public void speak(){
        System.out.println("我是人类中的学生");
    }
}
public class Child extends Person{   //继承父类,相当于我们是孩子,有孩子的行为
    @Override
    public void speak(){
        System.out.println("我是人类中的孩子");
    }
}

//测试类
public class TestMain {
    public static void main(String[] args) {
		//父类类型 变量名=new 子类类型();
        Person p = new Student();   //子类对象的引用赋值给父类 
        p.speak(); //多态 相当于这里使用的是Student的方法。输出我是人类中的学生
        //我作为人,我用学生的身份,说出:我是人类中的学生
		Person p = new Child(); 
		p.speak();  //输出:我是人类中的孩子
		//我作为人,用孩子的身份,说出我是人类中的孩子
    }
}
//这段代码,我们用到了 继承,重写,向上转型,因为多态本来就是向上转型的过程
ログイン後にコピー

ポリモーフィズムの役割:

ポリモーフィズムを導入した後、ポリモーフィズムは何に役立ちますか?ポリモーフィズムが Java の 3 つの主要な機能とみなされる理由。理由があるはずです:

#コードの再利用性を向上させる
  • モジュール間の結合を減らす
  • #ここでポリモーフィック機構とは何なのかを紹介したいと思います。 Java 言語はポリモーフィズムをどのように実装するのでしょうか? (少しわかりにくいかもしれませんし、内容もよく分かりませんが、これも面接の質問です)

  • いわゆるポリモーフィズムとは、参照変数が指す特定の型を指します。プログラム内で定義されている変数と、参照が指す特定の型 変数によって発行されるメソッド呼び出しは、プログラミング中には決定されませんが、プログラムの実行中に決定されます。つまり、参照変数がどのクラス インスタンス オブジェクトを指すか、参照変数によって発行されるメソッド呼び出しは、どのクラスに実装されたメソッドであるか、プログラム実行中に決定する必要があります。特定のクラスはプログラムの実行時にのみ決定されるため、ソース プログラム コードを変更せずに参照変数をさまざまなクラス実装にバインドでき、参照によって呼び出される特定のメソッドがそれに応じて変更されます。つまり、参照変数は変更する必要がありません。プログラム コードは、実行中にプログラムにバインドされた特定のコードを変更し、プログラムが複数の実行状態を選択できるようにすることができます。これがポリモーフィズムです。ポリモーフィズムは、コンパイル時ポリモーフィズムと実行時ポリモーフィズムに分けられます。このうち、編集時のポリモーフィズムは静的であり、主にメソッドのオーバーロードを指します。異なるパラメーター リストに基づいて異なる関数を区別します。編集後は 2 つの異なる関数になります。実行時にはポリモーフィズムはありません。ポリモーフィズムは動的バインディングによって実現されるため、実行時のポリモーフィズムは動的です。

ポリモーフィズムを理解するには、コードの一部を参照することもできます:

class People{     //父类
    public void eat(){
        System.out.println("我们会吃饭");
    }
}

class Student extends People{  //继承父类
    @Override
    public void eat(){
        System.out.println("我会吃肉");
    }
    public void study(){
        System.out.println("我们要好好学习");
    }
}

class Teacher extends People{     //继承父类
    @Override
    public void eat(){
        System.out.println("老师会吃蔬菜");
    }
    public void teach(){
        System.out.println("老师要认真上课");
    }
}
//测试类:
public class TestMain {
    public static void main(String[] args) {
        People p=new Stu();      //子类对象的引用赋值给父类 
        p.eat();       //输出: 我会吃肉
    }
}
ログイン後にコピー

抽象クラス:

抽象クラスとは何ですか?

共通クラスは、インスタンス化されたオブジェクトを直接生成できる完全な関数クラスであり、コンストラクター、共通メソッド、静的メソッド、定数、変数などを共通クラスに含めることができます。抽象クラスは、通常のクラスの構造に抽象メソッドを追加するコンポーネントを指します。

抽象メソッド:

メソッド本体を持つすべての通常のメソッドは、メソッド本体を表す「{}」があるため、オブジェクトによって直接使用されます。 。抽象メソッドは、実装コードを持たないメソッドを指し、abstract キーワードを使用して変更する必要があります。別の言い方をすると、抽象クラスの抽象メソッドは、後続の実装の継承子によってオーバーライドでき、必ずしも抽象クラスに実装する必要はありません。

抽象クラス宣言キーワード:

abstracat

抽象クラスを定義します:

public abstract class studnet{//定义一个抽象类
	public void study(){                         //普通方法
		System.out.println("我会学习");
	}
	public abstract void eat();         //抽象方法,没有方法体,有abstract关键字做修饰
}
//注意: 有抽象方法,这个类必须是抽象的!!!
ログイン後にコピー

举例解释:形状类Shape需要提供用于计算面积和周长的方法,但是形状本身没有被确定,那么计算周长和面积的方法就无法确定,此时我们就需要使用抽象类和抽象方法。

由于Shape类计算周长和面积的方法无法确定,那么就可以将这样的方法声明为抽象的,以便在具体的子类中进行实现。

//定义一个shape类,但是没有具体的形状,所以我们定义成抽象类
public abstract class Shape {
    private int a;
    public abstract void area(){}     //求面积的方法
    public abstract void perimeter();   //求周长的方法
    public Shape() {    //无参构造
    }
    public Shape(int a) {
        this.a = a;
    }
}
ログイン後にコピー
//计算圆形面积的子类
public  abstract class shape {    //有抽象方法的类,则一定是抽象类,需要关键字abstract修饰
        private int a;
        public abstract void area();     //求面积的方法,没有方法体的方法,需要关键字abstract修饰
        public abstract void perimeter();   //求周长的方法
}

//创建计算圆面积和周长的子类,并继承抽象类shape,并重写shape内的方法
public class Circle extends shape{
    public static double pi = 3.14;
    private double r;  //半径

    @Override
    public void area() {
        System.out.println("圆的面积:"+Circle.pi*this.r*this.r);
    }
    @Override
    public void perimeter() {
        System.out.println("圆的周长为:"+2*Circle.pi*this.r);
    }
    public Circle() {
    }
    public Circle(double r) {  //
        this.r = r;
    }
}

//测试类:
public class TestMain {
    public static void main(String[] args) {
        Circle c = new Circle(5);        //传入半径为:5
        c.area();
        c.perimeter();
    }
}
//输出结果: 圆的面积:78.5
//			圆的周长为:31.400000000000002
ログイン後にコピー

抽象方法和抽象类的注意事项:

  • 抽象类中是可以有构造函数的,并且构造函数的写法和其它类没有区别,只不过它真正跑起来是因为子类构造函数的super调用,毕竟我们没办法new一个抽象类对象出来,只能把抽象类的构造函数交给子类的构造函数去使用。

  • 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。

  • 抽象类的子类,必须重写父类中所有的抽象方法,如果有一个抽象方法没有重写,都会出现编译错误不给过,这时也可以把子类也声明为抽象类,报错就会消失。

简洁总结:

  • 抽象方法:没有方法体的方法,需要关键字abstract修饰

  • 有抽象方法的类,则一定是抽象类,需要关键字abstract修饰

  • 抽象方法不能使用private和static修饰

  • 抽象类,不一定有抽象方法的类

  • 抽象类,不一定有抽象方法的类

  • 抽象类可以有构造函数

普通类和抽象类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法

  • 抽象类不能直接实例化,普通类可以直接实例化。

以上がJava の状態クラスと抽象クラスとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート