JAVAマルチステート——オブジェクトのタイプ変換


この章では、JAVAの多態性、オブジェクトのタイプ変換の例について説明します.
実験テーマ:会社が支出した総給料:
要件:
  • にはabstractクラスがあり、クラス名はEmployeeです.EmployeeのサブクラスにはYearWorker,MonthWorker,WeekWorkerがある.YearWorkerの対象者は年給、MonthWorkerは月給、WeekWorkerは週給です.
  • Employeeクラスにはabstractメソッドがあります.public abstract earnings()です.子クラスは親クラスのearnings()メソッドを書き換え,それぞれの報酬を受け取る具体的な方法を与えなければならない.
  • には、メンバーとしてEmployeeオブジェクト配列を使用するCompanyクラスがあり、Employeeオブジェクト配列の単位は、YearWorkerオブジェクトのアップコンバートオブジェクト、MonthWorkerオブジェクトのアップコンバートオブジェクト、またはWeekWorkerオブジェクトのアップコンバートオブジェクトであってもよい.プログラムはCompanyオブジェクトが年間支払う給与総額を出力できます.ソース:
  • package salaries;
    
    abstract class Employee {
         
    
    	public abstract double earnings();
    }
    
    //YearWorker        ,
    class YearWorker extends Employee {
         
    
    	int n;
    	double ns; //        
    
    	YearWorker(int a, double b) //     
    	{
         
    		n = a;
    		ns = b;
    
    	}
    
    	public double earnings() {
         
    
    		return n * ns;
    	}
    }
    
    //MonthWorker      ,
    class MonthWorker extends Employee {
         
    	int m;
    	double ms; //        
    
    	MonthWorker(int a, int b) {
         
    		m = a;
    		ms = b;
    	}
    
    	public double earnings() {
         
    
    		return m * ms;
    
    	}
    }
    
    // WeekWorker      
    class WeekWorker extends Employee {
         
    	int w;
    	double ws; //        
    
    	WeekWorker(int a, double b) {
         
    		w = a;
    		ws = b;
    	}
    
    	public double earnings() {
         
    
    		return w * ws;
    	}
    }
    
    class Company {
         
    	double sum;
    	Employee[] employee;
    
    	Company(Employee[] employee) {
         
    		this.employee = employee;
    	}
    
    	double pay() {
         
    
    		for (int i = 0; i < 30; i++) {
         
    			sum += employee[i].earnings();
    		}
    		return sum;
    	}
    
    }
    
    public class CompanySalary {
         
    
    	public static void main(String[] args) {
         
    
    		Employee[] employee = new Employee[30]; //     30   
    		//        、  、    
    		for (int i = 0; i < employee.length; i++) {
         
    			if (i % 3 == 0)
    				employee[i] = new WeekWorker(1, 1000); //      
    			if (i % 3 == 1)
    				employee[i] = new MonthWorker(1, 10000);
    			if (i % 3 == 2)
    				employee[i] = new YearWorker(1, 200000);
    		}
    
    		Company company = new Company(employee);
    		System.out.println("         " + company.pay() + " ");
    	}
    }
    
    

    JAVAのオブジェクト変換タイプはアップとダウンに分けられます
  • 子オブジェクトを親タイプとして使用し、親クラスで定義され、子クラスで実装される方法を呼び出す.

  • フォーマット:親オブジェクト名1=newサブクラス()例:Animal an 1=new Dog()
    上記の例:
    employee[i] = new WeekWorker(1, 1000);
    ここでemployee[i]は親クラスで定義オブジェクト配列であり、WeekWorkerは子クラスであり、WeekWorker(1,1000)は子クラスWeekWorkerにおけるコンストラクション関数である、これは親クラスで定義を呼び出し、子クラスで実現する方法、いわゆるアップシフトである.
  • を下に移動サブクラス特有のメソッドを呼び出すには、親タイプのオブジェクトを強制的にサブクラスタイプに変換する必要があります.
  • フォーマット:サブクラスオブジェクト名2=(サブクラス)オブジェクト名1注記:オブジェクト名1はアップシフト時の親のオブジェクト名を指し、オブジェクト名2はこのとき定義されたサブクラスオブジェクト名の例を指す:Animal an 1=new Dog()Dog an2 = (Dog) an1;
    発生する可能性のあるエラー
    1.The methodメソッド名()is undefined for the type親クラス名このようなエラーが発生した場合、つまりダウンシフト時に親クラスで定義されていません.×××方法
    解決方法:親で定義
    2.最初にA子オブジェクトを親タイプとして使用したが、このときの親タイプを強制的にB子タイプに変換し、子クラス特有のメソッドを呼び出すとエラーが発生します.
    简単に言えば、あなたはあなたの息子Aの身分と交换して、この时あなたはAで、Aは彼の妻と一绪に食事をして、これはとても正常で、しかしあなたはあなたの兄Bの妻と食事をしたいと思って、あなたは何をしたいですか?今あなたがAであることを覚えています!!ご飯を食べたいなら、A弟の身分をB兄に変えなければなりません.
    解決方法:キーワードinstanceofは、オブジェクトが(クラスまたはインタフェース)のインスタンスまたはサブクラスのインスタンスであるか否かを判断することができる.
    構文フォーマット:オブジェクト名A instanceofクラス名A//オブジェクト名Aがクラス名Aタイプであるか否かを判断するif文で判定出力例:
    if(an1 instanceof Dog)
    {
         
     Dog an2 = (Dog)  an1;
     an2.shout();
    }
    else
    {
         Systrm.out.println("        Dog  !");}