私たちは Java の 3 つの主要な機能、カプセル化、継承、ポリモーフィズムを知っています。最初の 2 つは Java 入門 (6) で説明しましたが、ここではポリモーフィズムの機能について説明します。
ポリモーフィズムは、その名前が示すように、複数の形式を意味します
Java におけるポリモーフィズムの意味:
オブジェクトにメッセージを送信します。オブジェクトは、このメッセージに応じてどの動作を採用するかを独自に決定します
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 つの主要な機能とみなされる理由。理由があるはずです:
#コードの再利用性を向上させる
モジュール間の結合を減らす
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 を提供する必要があります。と sum Perimeter メソッドを使いますが、形状自体が決まっていない場合、周囲長と面積の計算方法が決まりませんので、このときは抽象クラスと抽象メソッドを使用する必要があります。
由于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一个抽象类对象出来,只能把抽象类的构造函数交给子类的构造函数去使用。
抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。
抽象类的子类,必须重写父类中所有的抽象方法,如果有一个抽象方法没有重写,都会出现编译错误不给过,这时也可以把子类也声明为抽象类,报错就会消失。
以上がJava ポリモーフィズムと抽象クラスの用途と原則は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。