Javaオブジェクト指向の考え方の本質(3)

1.上向きモデリングとは何ですか?

1.上向きモデリング:親クラスはサブクラスのオブジェクトを参照します

1.1。上方モデリングの定義

  • 1)スーパータイプ(親クラス)は、派生クラス(サブクラス)のオブジェクトを参照します。
  • 2)参照変数で指摘できることは、参照タイプによって異なります。
  • 3)注:いくつかのことわざは上向き変換と呼ばれ、同じことを意味します。
  • 次の例を含め、コード栗を見る前に、次の3つの概念を覚えておいてください。
    上方モデリング------親クラスは子クラスのオブジェクト
    オーバーロードを参照します------メソッド名は同じです、パラメータリストが異なる、
    メソッド名が同じ、パラメータリストが同じ、メソッド本体が異なる
public class UploadDemo {
    
    

	public static void main(String[] args) {
    
    
		Aoo o1 = new Aoo();
		o1.a = 1;
		o1.show();
		
		Boo o2 = new Boo();
		o2.a = 1;
		o2.b = 2;
		o2.show();
		
		//超类型引用指向派生类的对象
		Aoo o3 = new Boo(); 
		o3.a = 1;
		o3.show();
		//o3.b = 2; //报错!向上造型:能点出什么,看引用的类型。
		//若要使它不报错,得在父类加不是私有变量b
	}
}


class Aoo{
    
    
	int a;
	void show() {
    
    
		System.out.println("我是超类(父类)");
	}
}
class Boo extends Aoo{
    
    
	int b;
	void show() {
    
    
		System.out.println("我派生类(子类)");//超类方法被重写
	}
}
  • 運用結果ここに写真の説明を挿入

1.2。上向きのモデリングの詳細の補足

  • 一部の本では、それは上部変換オブジェクトと呼ばれています。しかし、定義と理論は同じです。コードを使用して、栗に理解を与えてください。
  • 上位の変換オブジェクトの特性:
    • 1.継承を操作したり、メンバー変数を非表示にしたり、サブクラスの継承を呼び出したり、メソッドをオーバーライドしたりできます。
    • 2.サブクラスの新しいメンバー変数を操作できず、サブクラスの新しいメソッドを呼び出すことができません。
  • コード例は次のとおりです。
  • ここに写真の説明を挿入

2.メソッドの書き換えと従うべき書き換えルール

2.1。メソッドの書き換え

  • 2.1.1親クラスと子クラスで発生し、メソッド名とパラメーターリストは同じであり、メソッド本体は同じです。
  • 2.1.2オーバーライドされたメソッドが呼び出されるとき、それはオブジェクトのタイプに依存します。
  • 栗を見てみましょう:
package oop.day04;

class Dongwu {
    
    		//父类
	protected String name;
	protected int age;
	
	public Dongwu(String name, int age){
    
    
		this.name = name;
		this.age = age;
	}
	public void runing(){
    
    
		System.out.println(name+"今年"+age);
	}
}
class Cat extends Dongwu{
    
    		//子类
	int weight;	//重量
	public Cat(String name, int age, int weight){
    
    
		super(name,age);
		this.weight = weight;
	}
	public void runing(){
    
    
		System.out.println(name+"今年"+age+",重量"+weight+"KG");
	}
}
class Dog extends Dongwu{
    
    		//子类
	int size;	//大小
	public Dog(String name, int age, int size){
    
    
		super(name,age);
		this.size = size;
	}
	public void runing(){
    
    
		System.out.println(name+"今年"+age+",大小"+size+"KG");
	}
}

public class Test3 {
    
    
	public static void main(String[] args) {
    
    
		Dongwu[] dw = new Dongwu[3];
		dw[0] = new Cat("加菲猫",8,50);
		dw[1] = new Dog("阿拉斯加",15,70);
		dw[2] = new Dog("英短猫",13,80);
		for(int i=0; i<dw.length; i++) {
    
    
			System.out.println(dw[i].name);
			dw[i].runing();
		}
	}
}
  • 結果:ここに写真の説明を挿入

2.2。ルールの書き換え

  • 従う:「2つの同じ、2つの小さい、1つの大きい」原則。
  • 2つ同じ:メソッド名は同じで、パラメーターリストも同じです。
  • 2つの小さい:派生クラス(サブクラス)メソッドの戻り値タイプがスーパークラス(親クラス)メソッド以下です。
    • 2番目の小学校は参照します:
    • voidに戻り値がない場合、それは同じでなければなりません。
    • 基本データタイプは同じである必要があります(つまり、戻り値タイプ)。
    • データタイプを参照する場合、それはスーパークラス(親クラス)以下です。
    • 2番目の小学校は参照します:
    • 派生クラス(サブクラス)メソッドによってスローされる例外は、スーパークラス(親クラス)メソッド以下です。
  • 一大:
    • 派生クラス(サブクラス)のメソッドのアクセス権は、スーパークラス(親クラス)のメソッド以上です。
  • 栗を見てください:
package oop.day04;
//重写
public class OverrideDemo {
    
    

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

class Coo{
    
    
	void test() {
    
    
		
	}
	int then() {
    
    
		return 0;		
	}
	double show() {
    
    
		return 0.0;
	}
	Doo say() {
    
    
		return null;
	}
}

class Doo extends Coo{
    
    
	//int test() {return 5;} 	//编译错误,void时必须相同
	//int then() {return 1.1;} 	//编译错误,返回值类型必须小于或等于超类。不能返回double型1.1
	//int show() {return 0;} 	//编译错误,基本数据类型必须相同,即返回值类型相同。show()方法定义了double型了
	//Coo say() {return null;} 	//编译错误,引用类型时必须小于或等于超类
	Doo say() {
    
    return null;} 	//超类大于派生类(这里指代的访问权限即访问修饰符)
	//访问修饰符的讲解,将在下一篇内容提到。感谢阅读者的支持
}

ここに写真の説明を挿入

3.書き換えとオーバーロードの違い

3.1違い

  • 過負荷----------メソッド名は同じですが、パラメーターリストは異なります

  • 書き換え----------メソッド名は同じ、パラメータリストは同じ、メソッド本体が異なる

  • 次のコードの例を見てください。

  • オーバーロードしてパラメータタイプを確認し、書き直してオブジェクトタイプを確認し、新しいオブジェクトを言うこともできます(強調!強調!強調!重要!3回言ってください)

package oop.day04;
//重写与重载
public class OverrideOverloasDemo {
    
    
	public static void main(String[] args) {
    
    
		//重载看参数类型,重写看对象类型,也可以说new出的对象(重点!重点!重点!重要的说三遍)
		Goo goo = new Goo();  
		Eoo o = new Foo();	  //向上造型 ------父类引用指向子类的对象。
		goo.test(o);

		Eoo foo = new Eoo();//当前new对象是Eoo
		foo.show();
	}
}
class Goo{
    
    		//重载-------方法名相同,参数列表不同,方法体不同
	void test(Eoo o) {
    
    
		System.out.println("超类型参数");
		o.show();
	}
	void test(Foo o) {
    
    
		System.out.println("派生类型参数");
		o.show();
	}
}
class Eoo{
    
    
	void show() {
    
    
		System.out.println("超类show");
	}
}
class Foo extends Eoo{
    
    
	void show() {
    
    
		System.out.println("派生类show");//show()方法被重写,若没被重写,则调用超类的方法“超类show”
	}
}
  • 結果は次のことを示しています。ここに写真の説明を挿入

フォローアップの内容をお待ちください。すぐに来てください!書くのは簡単ではありません、3Qのようにしてください
エラーがある場合はコメントしてください

チャプタリストはこちらです:https://blog.csdn.net/qq_41254299/article/details/106638651
再印刷のためのソースを記入してください:https://blog.csdn.net/qq_41254299
この記事はからである[Superclover_のブログ]

おすすめ

転載: blog.csdn.net/qq_41254299/article/details/107168550