Javaでメソッドを呼び出すときの明示的なパラメータと暗黙的なパラメータ
JavaBeanクラス、BankAccount.java、テストクラス、Test.javaがあります.
BankAccountクラスを作成するオブジェクトごとに、このオブジェクトに対応するインスタンスフィールドbalanceがあることはよく知られています.BankAccountオブジェクトを介してBankAccountクラスの共通メソッドを呼び出してインスタンスフィールドを操作するたびに、Javaコンパイラはオブジェクトとインスタンスフィールドをどのように対応させるのでしょうか.
実はこの中に暗黙的なパラメータの概念があります.メソッドを呼び出すときの表示パラメータは、メソッドカッコのパラメータ値であることを知っています.暗黙的なパラメータは、メソッドを呼び出すオブジェクトです.
私は方法を改造するともっと分かります.
BankAccount bankAccount1 = new BankAccount();
bankAccount1.deposit(1000);
BankAccount bankAccount2 = new BankAccount();
bankAccount2.deposit(1000);
bankAccount 1オブジェクトがdepositメソッドを呼び出すと、depositメソッドは次のようになります.
//預金方法 public void deposit(double nums){ bankAccount1.balance = bankAccount1.balance + nums; }
bankAccount 2オブジェクトがdepositメソッドを呼び出すと、depositメソッドは次のようになります.
//預金方法 public void deposit(double nums){ bankAccount2.balance = bankAccount2.balance + nums; }
したがって、対応するインスタンスフィールドは暗黙的パラメータによって操作され、暗黙的パラメータはメソッドを呼び出すオブジェクトです.
暗黙的なオブジェクトは、直接オブジェクト名で表さなくてもよいし、thisキーワードで次のように表すこともできます.
public void deposit(double nums){ this.balance = this.balance + nums; } これは、メソッドを呼び出す現在のオブジェクトを表します.
もう1つの特殊な現象は、構造方法間で相互に呼び出され、上記の構造方法を以下のように変更することもできる.
public BankAccount(){ this(0); } public BankAccount(double initMoney){ balance = initMoney; } 最初のコンストラクションメソッドのthis(0)は、呼び出された別のコンストラクションメソッドです.コンストラクションメソッドのthis呼び出しは、現在のオブジェクトではなく、コンストラクションメソッド間の相互呼び出しです.
public class BankAccount{
private double balance; //
public BankAccount(){
balance = 0;
}
public BankAccount(double initMoney){
balance = initMoney;
}
//
public void deposit(double nums){
balance = balance + nums;
}
//
public void withdraw(double nums){
if(balance >= nums)
balance = balance - nums;
}
//
public double getBalance(){
return balance;
}
}
public class Test{
public static void main(String[] args){
BankAccount bankAccount = new BankAccount();
bankAccount.deposit(1000);
bankAccount.withdraw(400);
System.out.println(bankAccount.getBalance().toString());
}
}
BankAccountクラスを作成するオブジェクトごとに、このオブジェクトに対応するインスタンスフィールドbalanceがあることはよく知られています.BankAccountオブジェクトを介してBankAccountクラスの共通メソッドを呼び出してインスタンスフィールドを操作するたびに、Javaコンパイラはオブジェクトとインスタンスフィールドをどのように対応させるのでしょうか.
実はこの中に暗黙的なパラメータの概念があります.メソッドを呼び出すときの表示パラメータは、メソッドカッコのパラメータ値であることを知っています.暗黙的なパラメータは、メソッドを呼び出すオブジェクトです.
私は方法を改造するともっと分かります.
BankAccount bankAccount1 = new BankAccount();
bankAccount1.deposit(1000);
BankAccount bankAccount2 = new BankAccount();
bankAccount2.deposit(1000);
bankAccount 1オブジェクトがdepositメソッドを呼び出すと、depositメソッドは次のようになります.
//預金方法 public void deposit(double nums){ bankAccount1.balance = bankAccount1.balance + nums; }
bankAccount 2オブジェクトがdepositメソッドを呼び出すと、depositメソッドは次のようになります.
//預金方法 public void deposit(double nums){ bankAccount2.balance = bankAccount2.balance + nums; }
したがって、対応するインスタンスフィールドは暗黙的パラメータによって操作され、暗黙的パラメータはメソッドを呼び出すオブジェクトです.
暗黙的なオブジェクトは、直接オブジェクト名で表さなくてもよいし、thisキーワードで次のように表すこともできます.
public void deposit(double nums){ this.balance = this.balance + nums; } これは、メソッドを呼び出す現在のオブジェクトを表します.
もう1つの特殊な現象は、構造方法間で相互に呼び出され、上記の構造方法を以下のように変更することもできる.
public BankAccount(){ this(0); } public BankAccount(double initMoney){ balance = initMoney; } 最初のコンストラクションメソッドのthis(0)は、呼び出された別のコンストラクションメソッドです.コンストラクションメソッドのthis呼び出しは、現在のオブジェクトではなく、コンストラクションメソッド間の相互呼び出しです.