大変お世話になっております。
反逆する武士
uematu tubasaです。
初回投稿日時:2023年8月13日(令和5年8月13日)
varを利用しつつ、引数の型が一致していない問題
【問題】以下のソースコードを実行した場合、コンソール出力される結果を答えなさい。
public class Test {
private int var;
private Test(int tVar) {
var var = tVar++;
this.var = ++var;
var -= 1;
System.out.println(var + " ");
}
public int getValue() {
return var;
}
public static void main(String[] args) {
var var = 'a';
Test t = new Test(var);
System.out.println(t.getValue() + " ");
}
}
【回答】97 98がコンソール出力される。
【解説】
まず、mainメソッドにおいて、var varというローカル変数の宣言はコンパイルエラーにはならない。
さらに言えば、'a'という値がvar varに格納されるが、それがTestクラスのコンストラクタの引数として渡される。
ただ、その引数がint型なのだが、型が不一致でもコンパイルエラーにはならない。
※暗黙的に変換される。
tVarは97という値になる。
その上で、Testのコンストラクタ内部で計算されて、コンソール出力される。
したがって、97と98が出力される。
※ちなみに、varという型推論はローカル変数としては使用可能だが、フィールドとしては使用不可(コンパイルエラーとなる)
明示的コンストラクターを定義する問題
【問題】以下のソースコードを実行した場合、コンソール出力される結果を答えなさい。
abstract class Super {
int num;
Super(int num){
this.num = num;
}
void method() {
System.out.println("Super#method");
}
}
class Sub extends Super {
protected void method() {
System.out.println("Sub#method()");
}
}
【回答】コンパイルエラーになる。
【解説】
暗黙的スーパー・コンストラクター Super() は、デフォルト・コンストラクターについては未定義です。
明示的コンストラクターを定義する必要があります。
したがって、Subクラスにて明示的にコンストラクタを定義するか、Superクラスにて引数無しのコンストラクタを定義するかの2択になります。
なぜならば、Subをインスタンス化する際に、そのスーパークラスであるSuperクラスもインスタンス化する必要があります。
その場合、実行されるのは引数無しのSuperクラスのコンストラクタです。
しかしながら、Superクラスにおいてはint型の引数が設定されているコンストラクタしかありません。
したがって、実行されるべきコンストラクタが存在しないという状態になります。
その結果、コンパイルエラーとなっています。
以上です。