23強.継承と多形性(2)

16677 ワード

  • Do it! Javaプログラミング入門オンラインコースに参加し、作成しました.
  • Section 1. Javaコア-オブジェクト向けプログラミング
  • 23強「継承と多形性(2)」
  • アクセス制限者可視性>継承からクラス作成プロセス>継承からメモリ状態>スーパーリザーブ>上位クラスへの暗黙的な変換(アップリンク)
  • .
    前回のレッスンで使用したCustomerクラスとVIPCCustomerクラスを変更して授業を行います.
    public class Customer {
    	protected int customerID;
    	protected String customerName;
    	protected String customerGrade;
    	int bonusPoint;
    	double bonusRatio;
    	
    	public Customer() {
    		customerGrade = "SILVER";
    		bonusRatio = 0.01;
    	}
    	
    	public int calcPrice(int price) {
    		bonusPoint += price * bonusPoint;
    		return price;
    	}
    	public void showCustomerInfo() {
    		System.out.println(customerName + "님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.");
    	}
    
    	public int getCustomerID() {
    		return customerID;
    	}
    
    	public void setCustomerID(int customerID) {
    		this.customerID = customerID;
    	}
    
    	public String getCustomerName() {
    		return customerName;
    	}
    
    	public void setCustomerName(String customerName) {
    		this.customerName = customerName;
    	}
    
    	public String getCustomerGrade() {
    		return customerGrade;
    	}
    
    	public void setCustomerGrade(String customerGrade) {
    		this.customerGrade = customerGrade;
    	}
    }
    public class VIPCustomer extends Customer{
    	private int agentID;
    	private double saleRatio;
    	
    	public VIPCustomer() {
    		customerGrade = "VIP";
    		bonusRatio = 0.05;
    		saleRatio = 0.1;
    	}
    	
    	public int getAgentID() {
    		return agentID;
    	}
    }
    
    アクセス制限者の表示
    外部クラスサブクラス同一パッケージ内部クラスpublicOOprotectedXOOO未宣言(デフォルト)XXXXOOprivateXXXXXXXO
    継承からクラスを作成するプロセス
  • 子クラスが生成されると、まず親クラスが生成されます.
  • 親クラスのジェネレータを呼び出し、子クラスのジェネレータを呼び出します.
  • 出力文をCustomerクラスのデフォルトジェネレータとVIPCustomerクラスのデフォルトジェネレータに追加して検証します.
    public class Customer {
    	Customer(){
    		System.out.println("Customer() 호출");
        }
    }
    
    public class VIPCustomer extends Customer{
    	public VIPCustomer() {
    		System.out.println("VIPCustomer() 호출");
    	}
    }
    main関数を含むCustomerTestクラスでVIPCCustomerオブジェクトを作成して出力し、親クラスCustomerクラスの作成者が最初に呼び出されたと判断します.
    public class CustomerTest {
    	public static void main(String[] args) {
    		VIPCustomer customerKim = new VIPCustomer();
    	}
    }
  • サブクラスの作成者では、親クラスの作成者を呼び出す必要があります.
  • に何もない場合、コンパイラはsuper()をコードに入れて親デフォルトジェネレータを呼び出します.
  • super()は、親のデフォルトジェネレータです.
  • つまり、上記のコードでは、VIPCustomerクラスのジェネレータがsuper()を自動的に呼び出します.
    Customerクラスの作成者もsuper()を自動的に呼び出します.これはjavaのトップクラスObjectクラスの作成者によって呼び出されます.
    public class VIPCustomer extends Customer{
    	public VIPCustomer() {
        	super();
    		System.out.println("VIPCustomer() 호출");
    	}
    }
  • 親クラスのデフォルトジェネレータ(パラメータのみのジェネレータ)がない場合、子クラスは親クラスを明示的に呼び出す必要があります.
  • Customerクラスのデフォルトジェネレータを削除し、パラメータを受け入れるコンストラクション関数を作成した場合、VIPCustomerクラスのコンストラクション関数はSuper(パラメータ)を介してコンストラクション関数を呼び出す必要があります.
    public class Customer {
    	Customer(int customerID, String customerName){
        	this.customerID = customerID;
            this.customerName = customerName;
    		System.out.println("Customer(int, String) 호출");
        }
    }
    
    public class VIPCustomer extends Customer{
    	public VIPCustomer() {
        	super(1001, "이순신");
    		System.out.println("VIPCustomer() 호출");
    	}
        public VIPCustomer(int customerID, String customerName) {
        	super(customerID, customerName);
    		System.out.println("VIPCustomer(int, String) 호출");
    	}
    }
    継承中のメモリステータス
    まず
  • 親クラスのインスタンスを作成し、次に子クラスのインスタンスを作成します.
  • プライベート変数は、親(メモリで作成)で作成されますが、サブクラスでは表示されません.

  • 超定語
  • thisが独自のインスタンスのアドレスを持っているように、superはサブクラス対親のアドレスを持っている.
  • サブクラスは、親にアクセスするために使用できます.

  • 親への暗黙的な変換(エスカレーション)
    変数は
  • の親として宣言され、サブクラスインスタンスとして生成されます.
  • 子クラスには親のタイプが含まれているため、暗黙的に親に変換できます.

  • 上記のコードでは、vcがVIPCustomer()ジェネレータを呼び出すため、インスタンスが生成されます.
    ただし、タイプはCustomerなのでアクセスできる変数またはメソッドはCustomerクラスの変数とメソッドです.