今日Java Silverの試験日なのでまとめてみた。
equalsメソッド
- equalsメソッドはObjectクラスに定義されている同値性を確かめるためのメソッド
- ただ、OBjectクラスに定義されているequalsメソッドは下記の通りthisを使用し同値性を確認している
public boolean equals(Object obj) {
return (this==obj);
}
そのため、Mainクラスなどでequalsメソッドをオーバーロードする場合には注意が必要です。
public class Main {
private int sum;
public static void main(String[] args) {
Object a = new Main(10);
Object b = new Main(10);
System.out.println(a.equals(b)); → falseになる
}
public boolean equals(Main obj) {
return this.sum == obj.sum;
}
public Main(int num){
this.sum = num;
}
}
6行目のequalsメソッドではobject型で呼んでいるため、9行目からのequalsメソッドではなく、
Objectクラスにもともと用意されているequalsメソッドを呼び出す。
Objectクラスにあるequalsメソッドは同一性を返すので、falseになる。
例外処理
- try-catchの下にあるブロックはcatchされた場合呼び出されない
public class Main {
public static void main(String[] args) {
System.out.println(test(null));
}
public static String test(Object obj) {
try {
System.out.println(obj.toString());
}catch (NullPointerException e) {
return "A";
}finally {
System.out.println("B");
}
return "C"; → もしぬるぽになったらこの行は呼び出されない
}
}
- catchとfinallyでreturnの記述があれば、finallyが優先される
public class Main {
public static void main(String[] args) {
System.out.println(test(null));
}
public static String test(Object obj) {
try {
System.out.println(obj.toString());
}catch (NullPointerException e) {
return "A";
}finally {
return "C"; → もしぬるぽになったら最終的にfinallyのCがreturnされる
}
}
}
- tryとfinallyは一つずつしか書けない
public class Main {
public static void main(String[] args) {
test(null);
}
public static void test(Object obj) {
try {
System.out.println(obj.toString());
}finally {
System.out.println("A");
}finally {
System.out.println("B"); → コンパイルエラーになる
}
}
}
- 継承関係にないクラスにキャストしたらClassCastExcptionが発生する
- キャストの記述(クラス名)を書いていればコンパイル時に検出はされないので例外が発生する
public class Sample {
private int sum;
public Sample(int num) {
this.sum = num;
}
public boolean equals(Object obj) {
Sample a = (Sample) obj; → キャストしていると例外が発生する
return a.sum == this.sum;
}
}
- キャストしていないとコンパイルエラーになる
public class Sample {
private int sum;
public Sample(int num) {
this.sum = num;
}
public boolean equals(Object obj) {
Sample a = obj; → コンパイルエラー
return a.sum == this.sum;
}
}
デフォルトパッケージ(無名パッケージ)
- デフォルトパッケージから他のパッケージに属するクラスにはアクセスできない
- デフォルトパッケージ内のクラスは同じデフォルトパッケージに属するクラスのみアクセス可能
// デフォルトパッケージに属するクラス
public class Sample {
public static final int sum = 30;
}
package ex6;
public class Sample2 {
public static final int sum = 30;
}
package ex6;
public class Main {
public static void main(String[] args) {
System.out.println(Sample2.sum); → 同じパッケージなのでアクセス可能
System.out.println(Sample.sum); → 無名パッケージに属するクラスなのでアクセス不可
}
}