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 言語はポリモーフィズムをどのように実装するのでしょうか? (少しわかりにくいかもしれませんし、内容もよく分かりませんが、これも面接の質問です)
ポリモーフィズムを理解するには、コードの一部を参照することもできます:
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
抽象クラスを定義します: 举例解释:形状类Shape需要提供用于计算面积和周长的方法,但是形状本身没有被确定,那么计算周长和面积的方法就无法确定,此时我们就需要使用抽象类和抽象方法。 由于Shape类计算周长和面积的方法无法确定,那么就可以将这样的方法声明为抽象的,以便在具体的子类中进行实现。 抽象方法和抽象类的注意事项: 抽象类中是可以有构造函数的,并且构造函数的写法和其它类没有区别,只不过它真正跑起来是因为子类构造函数的super调用,毕竟我们没办法new一个抽象类对象出来,只能把抽象类的构造函数交给子类的构造函数去使用。 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。 抽象类的子类,必须重写父类中所有的抽象方法,如果有一个抽象方法没有重写,都会出现编译错误不给过,这时也可以把子类也声明为抽象类,报错就会消失。 简洁总结: 抽象方法:没有方法体的方法,需要关键字abstract修饰 有抽象方法的类,则一定是抽象类,需要关键字abstract修饰 抽象方法不能使用private和static修饰 抽象类,不一定有抽象方法的类 抽象类,不一定有抽象方法的类 抽象类可以有构造函数 普通类和抽象类有哪些区别? 普通类不能包含抽象方法,抽象类可以包含抽象方法 抽象类不能直接实例化,普通类可以直接实例化。public abstract class studnet{//定义一个抽象类
public void study(){ //普通方法
System.out.println("我会学习");
}
public abstract void eat(); //抽象方法,没有方法体,有abstract关键字做修饰
}
//注意: 有抽象方法,这个类必须是抽象的!!!
//定义一个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
以上がJava の状態クラスと抽象クラスとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。