ホームページ  >  記事  >  Java  >  Java の高頻度の基本的な面接の質問

Java の高頻度の基本的な面接の質問

王林
王林転載
2020-08-26 15:38:172234ブラウズ

Java の高頻度の基本的な面接の質問

#1. 静的メソッド内から非静的メソッドの呼び出しを発行することは可能ですか?

(ビデオチュートリアルの推奨: java コース)

いいえ。非静的メソッドはオブジェクトに関連付けられているため、オブジェクトに対してメソッド呼び出しを行う前にオブジェクトを作成する必要がありますが、静的メソッドは呼び出し時にオブジェクトを作成する必要がなく、直接呼び出すことができます。言い換えれば、静的メソッドが呼び出されたとき、インスタンス オブジェクトは作成されていない可能性があります。静的メソッドから非静的メソッドへの呼び出しが発行された場合、非静的メソッドはどのオブジェクトに関連付けられますか?このロジックは確立できないため、静的メソッドは内部的に非静的メソッドへの呼び出しを発行します。

2. Integer と int

int の違いは、Java が提供する 8 つのプリミティブ データ型の 1 つです。 Java ではプリミティブ型ごとにラッパー クラスが提供されており、Integer は Java が int に対して提供するラッパー クラスです。 int のデフォルト値は 0 ですが、Integer のデフォルト値は null です。つまり、Integer は未​​割り当ての値と値 0 の違いを区別できますが、int は未割り当ての値の状況を表現できません。

例: 試験を受けない場合と試験のスコアが 0 点の場合の違いを表現したい場合は、整数のみを使用できます。 JSP 開発では、Integer のデフォルト値は null であるため、el 式を使用してテキスト ボックスに表示すると、値は空の文字列になり、int のデフォルト値は 0 になるため、el 式を使用すると、テキストボックスに表示すると結果は0となるため、Webレイヤーのフォームデータ型としてはint型は適していません。

Hibernate では、OID が Integer 型として定義されている場合、Hibernate は値が null かどうかに基づいてオブジェクトが一時的であるかどうかを判断できます。OID が int 型として定義されている場合は、hbm にもマップする必要があります。ファイル内の unsaved-value 属性を 0 に設定します。

さらに、Integer は文字列を整数に変換するなど、整数に関する複数の演算メソッドを提供し、整数の最大値と最小値を表す定数も定義します。

3. Math.round(11.5) はいくらに等しいですか? Math.round(-11.5) は何に等しいですか?

Math クラスには 3 つのメソッドが用意されています丸めメソッド: ceil、floor、round に関連しており、これらのメソッドの機能は英語名の意味に対応しています。

たとえば、英語の ceil の意味は天井で、このメソッドは切り上げを意味し、Math.ceil(11.3) の結果は 12、Math.ceil(-11.3) の結果は -11 です。英語のfloorの意味 意味は床、この方法は四捨五入を意味します、Math.ceil(11.6)の結果は11、Math.ceil(-11.6)の結果は-12、習得が最も難しいのは四捨五入です「四捨五入」を意味するメソッドの場合、アルゴリズムは Math.floor(x 0.5)、つまり元の数値に 0.5 を加えて切り捨てるため、Math.round(11.5) の結果は 12 となり、結果はMath.round(-11.5) は -11 です。

ここにいくつかタイプミスがあります。フロアの英語の意味はフロアです。このメソッドは切り捨てを意味します。Math.floor(11.6) の結果は 11 で、Math.floor(-11.6) の結果は次のようになります。 -12. ;

(その他の関連する面接の質問に関する推奨事項: java 面接の質問と回答)

4. オーバーロードとオーバーライドの違いは何ですか? Overloaded メソッドは戻り値の型を変更できますか?

Overload は多重定義を意味し、Override は上書き、つまり書き換えを意味します。

オーバーロードとは、同じクラス内に同じ名前のメソッドが複数存在できるが、これらのメソッドのパラメーター リストが異なる (つまり、パラメーターの数または型が異なる) ことを意味します。

オーバーライド オーバーライドとは、サブクラスのメソッドが親クラスのメソッドと同じ名前とパラメーターを持つことができることを意味します。このメソッドがサブクラスによって作成されたインスタンス オブジェクトを通じて呼び出されるとき、サブクラスの定義はこれは、親クラスで定義されているまったく同じメソッドを上書きすることと同じであり、これはオブジェクト指向プログラミングにおけるポリモーフィズムの現れで​​もあります。サブクラスが親クラスのメソッドをオーバーライドする場合、サブクラスは親クラスよりも少ない例外をスローするか、親クラスによってスローされた例外のサブ例外をスローすることしかできません。これは、サブクラスは親クラスの問題の一部を解決できますが、解決できないためです。親クラスよりも優れています。さらに質問があります。サブクラス メソッドのアクセス権は、親クラスのアクセス権よりも大きくすることはできますが、それより大きくすることはできません。親クラスのメソッドがプライベート タイプの場合、サブクラスにはオーバーライドの制限はありません。これは、新しいメソッドをサブクラスに追加するのと同じです。

オーバーロードされたメソッドが戻り値の型を変更できるかどうかという質問については、何を質問したいかによって異なります。このテーマは非常に曖昧です。いくつかのオーバーロードされたメソッドのパラメーター リストが異なる場合、当然、戻り値の型も異なる可能性があります。しかし、あなたが聞きたい質問は、2 つのメソッドのパラメータ リストがまったく同じである場合、オーバーロードを実装するために異なる戻り値を設定できるかということだと思います。これは不可能ですが、メソッドを呼び出すときに戻り結果変数を定義する必要がない場合があるため、矛盾による証明を使用してこの問題を説明できます。

たとえば、map.remove(key) メソッドを呼び出した場合、remove メソッドには戻り値がありますが、通常は戻り値を受け取る変数を定義しません。このとき、クラスはには 2 つの名前と完全なパラメータ リストがあります。同じメソッドでも、戻り値の型が異なるだけで、Java は戻り値の型によって判断できないため、プログラマがどのメソッドを呼び出したいかを判断できません。

Override はオーバーライドと訳せますが、文字通りの意味では、メソッドをカバーし、それを書き換えてさまざまな機能を実現します。私たちにとって最も身近な対象は、インターフェイス メソッドの実装です。通常、インターフェイス内で宣言されるのはメソッドのみであり、それらを実装する場合は、インターフェイスで宣言されたすべてのメソッドを実装する必要があります。この一般的な使用法に加えて、継承中にサブクラスの親クラスのメソッドをオーバーライドすることもできます。カバーするときは、次の点に注意する必要があります:

1. 上書き効果を実現するには、オーバーライドされたメソッドのフラグが、オーバーライドされたメソッドのフラグと完全に一致する必要があります。メソッドの戻り値は、オーバーライドされたメソッドの戻り値と一致している必要があります;

3. オーバーライドされたメソッドによってスローされた例外は、オーバーライドされたメソッドまたはそのサブクラスによってスローされた例外と一致している必要があります;

4. オーバーライドされたメソッドをプライベートにすることはできません。そうでない場合は、オーバーライドせずに新しいメソッドのみがそのサブクラスで定義されます。

オーバーロードは私たちにとってよく知られており、オーバーロードとして翻訳できます。これは、同じ名前でいくつかのメソッドを定義し、異なる入力パラメータを定義することでこれらのメソッドを区別し、その後 VM を呼び出すことができることを意味します。適切なメソッドはさまざまなパラメータ スタイルに基づいて実行用に選択されます。オーバーロードを使用する場合は、次の点に注意する必要があります:

1. オーバーロードを使用する場合、使用できるのは異なるパラメーター スタイルのみです。たとえば、異なるパラメータの型、異なるパラメータの数、異なるパラメータの順序 (もちろん、同じメソッド内の複数のパラメータの型は異なる必要があります。たとえば、fun(int, float) にすることはできますが、fun(int) にすることはできません。 , int) ));

2. アクセス許可、戻り値の型、スローされた例外によってオーバーロードすることはできません;

3. 例外のタイプとメソッドの数はオーバーロードに影響しません;

4. 継承の場合、親クラスでメソッドに特権アクセスがある場合、サブクラスでオーバーロードすることはできません。定義されている場合は、新しいメソッドが定義されるだけであり、オーバーロードの効果は得られません。 。

5. インターフェイスはインターフェイスを継承できますか? 抽象クラスはインターフェイスを実装できますか? 抽象クラスは具象クラスを継承できますか? 抽象クラスに静的な main メソッドは存在できますか?

インターフェイスはインターフェイスを継承できます。抽象クラスはインターフェイスを実装でき、抽象クラスは具象クラスを継承できます。抽象クラスは静的な main メソッドを持つことができます。

注: インターフェイスと抽象クラスの性質と役割を理解していれば、これらの質問には簡単に答えることができます。考えてみてください。もしあなたが Java 言語の設計者だったら、そのようなサポートを提供しますか?そうでない場合、そうである場合、何か理由がありますか?提供しない理由がない場合、答えは「はい」です。

抽象クラスと通常のクラスの唯一の違いは、インスタンス オブジェクトは作成できないことと、抽象メソッドが許可されることであることに注意してください。

6. Java でポリモーフィズムを実装するメカニズムは何ですか?

は、親クラスまたはインターフェイスによって定義された参照変数がサブクラスまたは特定の実装クラスのインスタンス オブジェクトを指すことができ、プログラムによって呼び出されるメソッドが実行時に動的にバインドされるという事実に依存しています。特定のインスタンス オブジェクトのメソッドは、参照変数の型で定義されたメソッドではなく、メモリ内で実行されているオブジェクトのメソッドです。

7. 抽象クラスとインターフェイスの構文の違いは何ですか?

1. 抽象クラスはコンストラクターを持つことができますが、インターフェイスはコンストラクターを持つことができません。

2. 抽象クラスには通常のメンバー変数を含めることができますが、インターフェイスには通常のメンバー変数はありません。

3. 抽象クラスには、非抽象の通常のメソッドを含めることができます。インターフェイス内のすべてのメソッドは抽象メソッドである必要があり、非抽象メソッドを持つことはできません。

4. 抽象クラスの抽象メソッドのアクセス タイプは、public、protected、および (デフォルトのタイプ、

Eclipse はエラーを報告しませんが、動作しないはずです) にすることができますが、インターフェイスの抽象化 メソッドはパブリック型のみにすることができ、デフォルトはパブリック抽象型です。

5. 抽象クラスには静的メソッドを含めることができますが、インターフェイスには静的メソッドを含めることはできません。

6. 抽象クラスとインターフェイスの両方に静的メンバー変数を含めることができます。抽象クラスの静的メンバー変数は次のとおりです。アクセス タイプは任意ですが、インターフェイスで定義される変数は publicstatic Final タイプのみにすることができ、デフォルトは publicstatic Final タイプです。

7. クラスは複数のインターフェイスを実装できますが、継承できる抽象クラスは 1 つだけです。

(推奨される関連チュートリアル:

java 入門チュートリアル

)

8. 抽象メソッドを同時に静的にできるかどうか、同時にネイティブにできるかどうか同時に、同時にできるかどうか 同期されていますか?

抽象メソッドはサブクラスによって実装される必要があり、静的はサブクラスとは関係がないため、抽象メソッドを静的にすることはできません。

ネイティブメソッドとは、プラットフォームに依存する別のプログラミング言語で実装するメソッドであり、サブクラスで実装しても問題ないため、抽象化できず、抽象化と混合することもできません。たとえば、FileOutputSteam クラスはハードウェアを扱う必要があり、その基盤となる実装は Windows では C 言語で実装されるなど、オペレーティング システムに関連する API 実装を使用するため、jdk のソース コードを見ると、 FileOutputStream の open メソッドが次のように定義されていることを確認します。

privateative void open(Stringname) throwsFileNotFoundException;

Java を使用して、他の人が作成した C 言語関数を呼び出したい場合、それはできません。 Java 関数の要件に従って C 言語関数を記述する必要があり、その C 言語関数は他の人の C 言語関数を呼び出します。 C 言語関数は Java の要件に従って記述されているため、C 言語関数を Java に接続することができます。Java 側のドッキング メソッドは、C 関数に対応するメソッドを定義します。Java の対応するメソッドはメソッドを実行します。特定のコードを記述する必要はありませんが、事前にネイティブとして宣言する必要があります。

synchronized と abstract を一緒に使用する問題については、私は不可能だと思います。なぜなら、私の数年間の研究と開発の中で、このような状況を一度も見たことがないからです。そして、synchronized は次のような場合に使用されるべきだと思います。特定の方法という点でのみ意味を持ちます。また、メソッド上の同期に使用される同期ロックオブジェクトはこれであり、抽象メソッド上ではこれが何であるかを判断することはできません。

9. 内部クラスは、そのクラスを含むクラスのメンバーを参照できますか?制限はありますか?

全然大丈夫です。静的内部クラスでなければ、制限はありません。

静的ネストされたクラスを内部クラスの特殊なケースとして扱う場合、この場合、外部クラスの通常のメンバー変数にはアクセスできませんが、外部クラスの静的メンバーのみにアクセスできます。たとえば、次のコード:

class Outer
{
static int x;
static class Inner
    {
        voidtest()
        {
              syso(x);
        }
    }
}

10. String s = "Hello"; s = s "world!"; これらの 2 行のコードが実行されると、内容は元のコードになります。文字列オブジェクトが変更されました?? ############いいえ。 String は不変クラスとして設計されているため、そのすべてのオブジェクトは不変オブジェクトです。このコードでは、s はもともとコンテンツ「Hello」を持つ String オブジェクトを指しており、その後 s を操作しました。s が指すオブジェクトは変更されましたか?答えはいいえだ。この時点では、 s は元のオブジェクトを指していませんが、コンテンツ "Hello world!" を持つ別の String オブジェクトを指しています。元のオブジェクトはメモリ内にまだ存在しますが、参照変数 s はそれを指していません。
上記の説明から、別の結論を簡単に得ることができますが、文字列がさまざまな方法で頻繁に変更される場合、つまり予期しない変更が行われる場合、文字列を表すために String を使用すると、大量のメモリ オーバーヘッドが発生します。 String オブジェクトは作成後に変更できないため、異なる文字列をそれぞれ表すには String オブジェクトが必要です。現時点では、異なる文字列ごとに新しいオブジェクトを生成するのではなく、変更が可能な StringBuffer クラスの使用を検討する必要があります。さらに、これら 2 種類のオブジェクトを変換するのは非常に簡単です。

同時に、同じ内容の文字列を使用したい場合、毎回新しい文字列を作成する必要がないこともわかります。たとえば、コンストラクターで s という名前の String 参照変数を初期化し、それを初期値として設定する場合は、次のようにする必要があります:

public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
# ではなく

s = new String("Initial Value");

##後者は、新しいオブジェクトを生成するたびにコンストラクターを呼び出しますが、パフォーマンスが低く、メモリのオーバーヘッドが高くなります。また、String オブジェクトは変更できないため意味がありません。そのため、同じ内容の文字列の場合、必要な String オブジェクトは 1 つだけです。彼らを代表するために。つまり、上記のコンストラクターを複数回呼び出して複数のオブジェクトを作成すると、それらの String 型属性はすべて同じオブジェクトを指します。

上記の結論は、文字列定数の場合、内容が同じであれば、Java はそれらを同じ String オブジェクトを表すものとみなすという事実にも基づいています。 new キーワードを指定してコンストラクターを呼び出すと、内容が同じかどうかに関係なく、常に新しいオブジェクトが作成されます。

String クラスを不変クラスとして設計する必要がある理由については、その目的によって決まります。実際、String だけでなく、Java 標準クラス ライブラリの多くのクラスも不変です。システムを開発するとき、関連する値のセットを渡すために不変クラスを設計する必要があることがあります。これもオブジェクト指向の考え方の表れです。不変クラスには、オブジェクトが読み取り専用であるため、複数のスレッドによる同時アクセスに問題がないなど、いくつかの利点があります。もちろん、いくつかの欠点もあります。たとえば、異なる状態ごとにそれを表すオブジェクトが必要になるため、パフォーマンス上の問題が発生する可能性があります。したがって、Java 標準クラス ライブラリには、変数バージョンの StringBuffer も提供されています。

以上がJava の高頻度の基本的な面接の質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。