目次
1.String s=new String("xyz") オブジェクトはいくつ作成されますか?
2. Java の switch ステートメントは int、列挙型のみにできますか?
3. オーバーロードとオーバーライドの違い。オーバーロードされたメソッドは戻り値の型を変更できますか?
4. 間違った質問 1: コンパイル エラーが発生しない質問は次のとおりです。
7. 新しいオブジェクトが親クラス型に渡されるとき、サブクラスの静的メソッドが呼び出されるとき、なぜ親クラスの静的メソッドが呼び出されるのですか?
1.String s=new String("xyz") オブジェクトはいくつ作成されますか?
文字列プールで xyz を見つけます。オブジェクトを作成しないでください。それ以外の場合は、オブジェクトを作成します。
new キーワードは String クラス オブジェクトを作成します。
私自身の理解といくつかの情報へのアクセス (正しいかどうかはわかりません。間違っている場合は修正してください)。
2. Java の switch ステートメントは int 型と列挙型にのみ適用できますか?
2.1 スイッチの使用:
switch ステートメントは、条件分岐制御を実現するために、複数の整数値 (負の数を含む) を照合して判定するのに適しています。
判定が真の場合、対応するケース値を見つけて、対応するコードを実行します。
if ステートメントとの違いは次のとおりです。
1. if文は以下の式に従って判定されるため、この判定は任意に記述できます。
2. switch 文は単なる「式 == 値」の判定であり、単なる整数の判定です。
2.2 スイッチの実装原理:
プログラムは最終的にはステートメントです。CPU には命令インジケータがあります。CPU は、命令デバイスに従って命令をロードして実行します。命令が完了すると、命令デバイスは自動的に次の命令を指します。一部の命令は、命令を変更します。命令インジケーターの値を利用して CPU を他の場所にジャンプさせて実行する命令のことをジャンプ命令と呼びます。ジャンプ命令には 2 種類があります。1 つは条件付きジャンプ文で、ジャンプ条件が満たされた場合にジャンプします。もう 1 つは無条件ジャンプで、直接ジャンプして命令を実行します。
これを switch ステートメントに同様に記述します。
switch文はクラスファイルにコンパイルされており、分岐文が少ない場合は条件ジャンプ文をそのまま使用し、条件が成立した場合にcase文が実行されます。分岐文が多い場合、非効率を避けるため、ジャンプテーブルマッピングテーブルを使用して、対応する値に対応するアドレスを格納します。この値に基づいてジャンプアドレスを見つけます。
2.3 解決策:
Short、byte、char は自動的に int に変換されるためすべて使用できますが、long はジャンプ テーブルの範囲を超えるためできません。String 型はハッシュコードを使用して対応する整数に変換できます。
つまり、 Byte、Short、Character、Integer、および列挙型は Java5 からサポートされ、String クラスは Java7 からサポートされます。どちらも switch ステートメントに適用されます。
3. オーバーロードとオーバーライドの違い。オーバーロードされたメソッドは戻り値の型を変更できますか?
オーバーロード (オーバーロード): オーバーロードとはメソッドレベルでのポリモーフィズムであり、同じクラス内でメソッド名が同じであればパラメータリスト(パラメータの順序、パラメータの数、パラメータの型)が異なるものをオーバーロードとします。 。
オーバーライド (override): オーバーライドは、親クラスと子クラスのレベルでのポリモーフィズムです。サブクラスの実行文を書き換えます。メソッド宣言は親クラスと同じにする必要があります。
オーバーロードは戻り値の型の変更とは関係がなく、変更することができます。
4. 間違った質問 1:
次のオプションは、コンパイル エラー (AD) を生成せずに、 // ここにコードをタイトルに追加して置き換えることができます。(2つ選択してください)
パブリック 抽象 クラス MyClass{
public int constInt=5;
//ここにコードを追加します
パブリック void メソッド( ){
}
}
あ |
パブリック 抽象 void メソッド( int a); |
B. |
constInt =constInt+5; |
C. |
パブリック int メソッド(); |
D. |
public abstract void anotherMethod(); |
分析します:
1. メソッドのオーバーロードはパラメータリスト(パラメータ番号、パラメータの型、パラメータの順序)が異なるだけでよく、戻り値の型やabstractなどのキーワードを追加するかどうかは関係ありません。
2. 属性の定義と代入はメソッド外に記述できますが、属性操作などその他の操作はメソッド内に記述してください。
class MyClass { int[] a=new int[10]; a[2]=a[2]+2; public void eat(){ int constInt=5; constInt =constInt+5; } public void method( ){ }
メソッドの外側のコード層ではエラーが報告されますが、内部ではエラーが報告されません。
5. 間違った質問 2:
既知のクラス A、B、C およびインターフェイス D は次のように定義されています。
パブリック クラス A{…}
パブリック クラス B を拡張 A を実装 D {…}
パブリック クラス C は A を拡張します {…}
パブリック インターフェイス D {…}
変数 a、b、c、d は次のように定義されます。
A a = 新しい A(); B b = 新しい B();
C c = 新しい C(); D d = null;
この場合、次のステートメントではコンパイル エラー (D) が発生します。
A.
a = b;
B.
d = b;
C.
d = (D)a;
D.
c = (C)b; (猫を犬に変えることはできません)
私たちが調べているのは 3 つの主要な特性の 1 つであるポリモーフィズムです。ポリモーフィズムに関しては、次の重要な部分を覚えておく必要があります。
1. 上方変換、下方変換
2. サブクラス オブジェクトは、ポリモーフィックな親クラス型に渡されます。
3.キーワードのインスタンス
この質問では、同じレベルのオブジェクトを強制的に転送することはできません - 猫を犬に変換することはできません
6. カスタム タイプの要素を格納するときに、要素が一意であることを確認するために、Hashse がオブジェクト内の hashCode メソッドとquals メソッドを書き直す必要があるのはなぜですか。
Hashset は要素が同じであるとどのように判断するのでしょうか?
1. まずハッシュコードから要素のハッシュ値を計算し、それと同じハッシュコードが存在する場合は同じ要素とみなし、2番目のステップを実行します。それらが同じでない場合は、要素が異なっており、コレクションに追加されていることを意味します。
2. ハッシュ値が同じ場合は、equals メソッドを呼び出して 2 つの要素の属性が同じかどうかを比較し、同じ場合は要素を追加せず、異なる場合は要素を追加します。コレクションに追加されました。
この例を見てください。
public class HashsetTest {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(new Student("小李"));
hashSet.add(new Student("小李"));
int a=hashSet.size();
System.out.println("元素个数为:"+a);
}
}
class Student{
int id;
String name;
}
出力結果:
両方の要素が追加されることを示します。なぜ?
ハッシュセットが要素が同じであると判断する方法に戻ります。まず、同じ属性を持つ 2 つのオブジェクトを渡します。オブジェクトは同じですが、アドレス値が異なります。したがって、ハッシュコードが異なり、判定機構は両者が異なると判断して false を返し、同じ型の同一オブジェクトが 2 つコレクションに格納されます。そこで、ハッシュコードメソッドを書き換えて、その属性(名前)に判定を向ける必要がありますが、このときアドレス値のハッシュコードではなく、属性値の名前に対応するハッシュコードを取得します。
@Override public int hashCode() { return this.hash(name); }
戻り値が true なので、equals メソッドを呼び出す 2 番目のステップに入ります。カスタム クラスには、equals メソッドがありません。Objects クラスの equals メソッドが呼び出され、アドレス値が比較されるため、equals メソッドを書き直す必要があります。 。
@Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Student)) return false; Student student = (Student) o; return name.equals(student.name); }
書き換え後、対応する属性の内容を比較します。最後に同じ要素かどうかを判断します。
注意点:
Object のイコールはオブジェクトのアドレスを比較し、ハッシュコードもアドレスに基づいて計算されます。書き換え後、hashcode は属性を比較し、equals は属性を比較します。
7. 新しいオブジェクトが親クラス型に渡されるとき、サブクラスの静的メソッドが呼び出されるとき、なぜ親クラスの静的メソッドが呼び出されるのですか?
まずコードを見てください。
public class Person {
public static void main(String[] args) {
//编译看左边
PersonFather person=new Personson();
person.scrore=100;
person.eat();
person.sleep();
System.out.println(person.scrore+" ,");
}
}
class PersonFather{
String name="父类";
int scrore=1000;
public static void eat(){
System.out.println("我是父类的静态吃方法");
}
public void sleep(){
System.out.println("我是父类的睡觉静态方法");
}
}
class Personson extends PersonFather{
String name="子类";
int score=10;
public static void eat(){
System.out.println("我是子类的静态吃方法");
}
public void sleep(){
System.out.println("我是子类的睡觉静态方法");
}
}
知識ベース:
1. Staticで変更したメンバメソッドや変数をロードする際、クラスのロードと同時にロードされます。彼のライフサイクルはクラスのライフサイクルと同じです。
2. サブクラスは、プライベートなものを除くすべてのプロパティとメソッドを継承します。したがって、サブクラスがロードされるときは、親クラスのプロパティとメソッドが最初にロードされ、次にサブクラスがロードされます。
以前にポリモーフィズムを学習する場合、その方法は左にコンパイルし、右に実行することです。ただし、サブクラスは親クラスの静的メソッドを継承するため、ポリモーフィズムを使用しても親クラスのメソッドを書き換えたり上書きしたりすることはありません。親クラスのロードに続いて親クラスの静的メソッドがロードされるため、サブクラスの静的メソッドの代わりに親クラスの静的メソッドが呼び出されます。
操作結果: