mk-toolブログ

エンジニアと家のことをごちゃごちゃと書いてます

【Java】JavaSilver1総合問題の復習03

問題43

for文と拡張for文のできることに関して
for文は要素を順番に取り出す(i++)、要素を逆順に取り出す(i--)、要素をひとつ飛ばし(i += 2)が可能だが
拡張for文は順番に取り出すことしかできない


問題44

修飾子の範囲について再確認をすることができた問題。
private...自分自身が含まれるクラス内からしかアクセスできない
protected...同じパッケージ及び継承するサブクラスからしかアクセスできない。
public...全ての場所からアクセス可能。
デフォルト・アクセス...以上の何れも指定しない場合。パッケージ・アクセスとも言われる。同じパッケージに属するクラス内からしかアクセスできない。
public>protected>デフォルト>private


問題45

これは試験前に一度確認しておきたい問題。

public class Test {
    int num;
    static void foo(int x){
        num++; //1番
        System.out.println(“x   :” + x );
        System.out.println(“num   :” + num );
    }
}

というコードがあった時に、どこでコンパイルエラーが発生するかという問題。
自分は全部問題なし、と思ったがそれはfooメソッドがstaticでない場合ならOKだが
staticメソッドの場合はインスタンス化されてようやく使用できる変数にはアクセスできない
よく考えれば当たり前だが、間違ってしまったので記録。


問題47

この問題、えっ、てなった。
static変数の呼び出しはクラス名.変数名だったじゃん!
でもクラス変数の呼び出しはインスタンス名.変数名でも
クラス名.変数名でも
どちらでもいけるみたいだ。


問題48

コンストラクタを宣言した場合は、デフォルトコンストラクタは作成されない。
つまり、以下のコードだとよくない。

class Foo {
    int id, String name;
    Foo(int id) {
        this();
    }
}

デフォルトコンストラクタは作成されないため、this()問いう呼び出しでは
コンパイルエラーになってしまう。


問題49
メソッドの変数にアクセス修飾子をつけるとコンパイルエラーになってしまう。
これダメ

class B {
    public int x() {
        private int num = 10;
        return num;
    }
}

privateってのは付けてはいけませーん!


問題55

インポートに関して、見落としがちなのでメモ。
パッケージxにクラスFooが入っている場合には、どうやってインポートするか。
import x だけでは不十分です。やるなら、
import x.Fooもしくはimport x.*とする。xで止まってはいけない。


問題58

abstract修飾子がついたクラスのメソッドの扱いかた。

abstract class Test {
    //NG
    void a();
    //OK
    abstract a();
    //OK
    void a(){};
    //NG
    private abstract void a(); //privateとabstractは同時に使用することはできない
}


問題60

super()やthis()はコンストラクタの先頭に記述する必要がある。
そのため、両方を書くとかはもってのほか。


問題61

class A {
    A(String s,int i) {}
}
class B extends A {
    double d;
    B(String s, int i, double d) {
        super(s, i);
        this.d = d;
    }
}

上記のように一致するコンストラクタがあった場合は、
デフォルトコンストラクタを宣言する必要はない。


問題65

class Test {
    private int a, b;
    public Test(int a, int b) {
        this.a = a;
        this.b = b;
    }
    //NG
    public Test(){
        Test(0,0);
    }
    //OK
    public Test(){
        this(0,0);
    }
}

自分のコンストラクタを呼び出す際は、クラス名の指定では呼び出せない
thisを使用して呼び出す必要がある。


問題67 問題68

日付の関数に関して、どういうところまで抑えたらいいのかわからないけど、このくらいでいいかな。

LocalDate date = LocalDate.of(2015,1,30);
System.out.println(date.format(DateTimeFormatter.ISO_DATE));

of()メソッドに年月日をカンマ区切りで入れると日付型になる。
ISO_DATEというオプションで整形すると、ハイフン区切り(時刻は:区切りになってくれる)


問題69

後回し!


問題70

後回し!


問題71

後回し!


問題72

後回し!


問題76

public class Test {
    public static void main(String[] args) {
        try {
            new A().bar(); //ここ
        } catch(MyException ex){
            System.out.println(“C ”);
        }
    }
}

上記のコメントアウトしている関数で例外が発生した際に、
正しくキャッチ等の処理がなされていた場合は、以下のcatch処理が行われないから
cという文字列は出力されない。


問題77

無限ループによりメモリオーバーが発生した際に起きるエラーは
OutOfMemoryErrorで、これはErrorクラスのサブクラスであるため、
ExceptionやRuntimeExceptionでのキャッチは効かない