Java の基本的な面接の質問 (2)

(*-*)浩
リリース: 2019-11-30 15:28:33
オリジナル
1543 人が閲覧しました

Java の基本的な面接の質問 (2)

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

#無理です。非静的メソッドはオブジェクトに関連付けられているため、オブジェクトに対してメソッド呼び出しを行う前にオブジェクトを作成する必要がありますが、静的メソッドは呼び出し時にオブジェクトを作成する必要がなく、直接呼び出すことができます。 (推奨される学習: Java インタビューの質問 )

つまり、静的メソッドが呼び出されたときに、インスタンス オブジェクトが作成されていない可能性があります。静的メソッド、メソッドを呼び出すとき、非静的メソッドはどのオブジェクトに関連付けられますか?このロジックは確立できないため、静的メソッドは内部的に非静的メソッドへの呼び出しを発行します。

12. 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 は文字列を整数に変換するなど、整数に関する複数の演算メソッドを提供し、整数の最大値と最小値を表す定数も定義します。

13. Math.round(11.5) はどれくらい等しいですか?Math.round(-11.5) はどれくらい等しいですか?

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

たとえば、ceil の英語の意味は天井であり、このメソッドは切り上げを意味します。Math.ceil(11.3) の結果は 12、Math.ceil(-11.3) の結果は -11 になります。 ;

フロアの英語の意味はフロアです。この方法は切り捨てを意味します。Math.ceil(11.6) の結果は 11、Math.ceil(-11.6) の結果は -12;

most 習得するのが難しいのは「四捨五入」を意味するround法です。アルゴリズムはMath.floor(x 0.5)、つまり元の数値に0.5を足して切り捨てるというものです。 Math.round(11.5) は 12、Math.round(-11.5) の結果は -11 です。

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

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

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

オーバーライド オーバーライドとは、サブクラスのメソッドが親クラスのメソッドと同じ名前とパラメーターを持つことができることを意味します。このメソッドがサブクラスによって作成されたインスタンス オブジェクトを通じて呼び出されるとき、サブクラスの定義はこれは、親クラスで定義されているまったく同じメソッドを上書きすることと同じであり、これはオブジェクト指向プログラミングにおけるポリモーフィズムの現れで​​もあります。

サブクラスが親クラスのメソッドをオーバーライドする場合、サブクラスは問題の一部を解決できるため、親クラスよりも少ない例外をスローするか、親クラスによってスローされた例外のサブ例外をスローすることしかできません。親クラスの問題。問題には、親クラスより多くの問題を含めることはできません。

サブクラス メソッドのアクセス権は、親クラスのアクセス権より大きくすることのみ可能であり、それより大きくすることはできません。親クラスのメソッドがプライベート タイプの場合、サブクラスにはオーバーライドの制限はありません。これは、新しいメソッドをサブクラスに追加するのと同じです。

オーバーロードされたメソッドが戻り値の型を変更できるかどうかという質問については、何を質問したいかによって異なります。

この質問は非常に曖昧です。いくつかのオーバーロードされたメソッドのパラメーター リストが異なる場合、当然、戻り値の型も異なる可能性があります。

しかし、あなたが聞きたい質問は、2 つのメソッドのパラメーター リストがまったく同じである場合、オーバーロードを実装するためにそれらの戻り値が異なる可能性があるということだと思います。

これは不可能です。メソッド呼び出し時に戻り結果変数を定義する必要がない場合があるため、矛盾による証明を使用してこの問題を説明できます。つまり、メソッドの戻り結果を気にしないからです。 。

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

オーバーライドはカバレッジと訳せますが、文字通りの意味では、メソッドをカバーし、それを書き換えてさまざまな機能を実現します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. 抽象クラスの抽象メソッドのアクセス タイプは、パブリック、プロテクト、および (デフォルトのタイプ。Eclipse ではエラーは報告されませんが、動作しないはずです) にすることができますが、インターフェイスの抽象メソッドは、パブリック型。デフォルトはパブリック抽象型です。

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

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

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

18. 抽象メソッドは静的、ネイティブ、同期化を同時に行うことができますか?

抽象メソッドは静的であることはできません。抽象メソッドは次の方法で実装する必要があるためです。静的はサブクラスとは何の関係もありません。

ネイティブメソッドとは、プラットフォームに依存する別のプログラミング言語で実装するメソッドであり、サブクラスで実装しても問題ないため、抽象化できず、抽象化と混合することもできません。

たとえば、FileOutputSteam クラスはハードウェアを処理する必要があり、基盤となる実装はオペレーティング システム関連の API 実装を使用します。たとえば、Windows では C 言語で実装されているため、ソース コードを見ると、 jdk の FileOutputStream のオープンを見つけることができます。メソッドは次のように定義されています。

private native void open(Stringname) throwsFileNotFoundException;
ログイン後にコピー

Java を使用して他の人が書いた C 言語関数を呼び出したい場合、それを直接呼び出すことはできません。Java の要件に従って C 言語関数を記述する必要があり、その後、私たちの C 言語関数は他の人の関数を呼び出します。 C言語関数.関数.

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

synchronized と abstract を一緒に使用する問題については、私は不可能だと思います。なぜなら、私の数年間の研究と開発の中で、このような状況を一度も見たことがないからです。そして、synchronized は次のような場合に使用されるべきだと思います。特定の方法という点でのみ意味を持ちます。

また、メソッド上の同期で使用する同期ロックオブジェクトはこれであり、抽象メソッド上ではこれが何であるかを判断することはできません。

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

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

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

class Outer
{
    static int x;
    static class Inner
    {
        voidtest(){
          syso(x);
        }
    }
}
ログイン後にコピー

20. 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 の基本的な面接の質問 (2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート