やあやあ!現在、Java 開発者の需要は高まっています。もちろん、あなたに欠員を提供することはできませんが、新しい知識を獲得し、ギャップを埋めるお手伝いをしたいと思います。そのため、私たちは Java 開発者向けの250 以上の面接の質問を分析し続けています。分析の前の部分へのリンクは記事の最後にあります。
39. Java のアクセス修飾子とは何ですか? 名前を付けてください。それらは何に使われますか?
以前、Java カプセル化要素に関する質問でアクセス修飾子について説明しました。しかし、とにかく思い出させます。Java のアクセス修飾子は、特定の Java コンポーネントに付与されるアクセスのレベルを記述するキーワードです。アクセス修飾子は次のとおりです。- public - この修飾子を持つ要素はパブリックにアクセス可能になります。それらの。フィールドとメソッド、public 修飾子で宣言されたクラスは、現在のパッケージと外部パッケージの両方から他のクラスから参照できます。
- protected - この修飾子を持つ要素は、現在のパッケージの現在のクラスまたは子孫クラス (他のパッケージ内にある場合でも) のどこからでもアクセスできます。
- default、または修飾子がありません - この修飾子は、アクセス修飾子がまったく指定されていない場合に暗黙的に使用されます。これは、他のパッケージ内の子孫クラスで可視性が許可されることを除いて、前のものと似ています。
- privateはすべての修飾子の中で最もプライベートであり、現在のクラス内でのみ要素へのアクセスを許可します。
40. 静的メソッドと変数メソッドの主な機能に名前を付けます
非常に奇妙な定式化 - 「可変メソッド」。確かに、これは通常の非静的メソッドを指します。したがって、主な違いは、静的メソッドがクラスに属しており、実際、静的メソッドについてはこのクラスのインスタンスを作成する必要がなく、クラス型を使用してのみ呼び出すことができるということです。たとえば、猫を撫でる静的メソッドがあります。public class CatService {
public static void petTheCat(Cat cat) {
System.out.println("Погладить кота - " + cat.getName());
}
CatService クラスのインスタンスを呼び出す必要はありません。
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
通常のメソッドはオブジェクトにバインドされている (属している) ため、メソッドを呼び出すにはメソッドが呼び出されるインスタンス (オブジェクト) が必要です。たとえば、猫には非静的メソッド、つまり鳴き声があります。
class Cat {
public void mew() {
System.out.println("Meow! Meow! Meow!");
}
このメソッドを呼び出すには、猫の特定のインスタンスが必要です。
Cat cat = new Cat(7, "Bobi");
cat.mew();
41. 静的メソッドと「変数」メソッドに対する主な制限は何ですか?
前に述べたように、通常のメソッドの主な制限は、メソッドが呼び出されるインスタンスが常に存在する必要があることです。しかし、静的メソッドはこれを必要としませんが、現在のオブジェクトが存在しないため、現在のオブジェクトの要素へのthis参照を参照することはできません。42. static キーワードは何を意味しますか? 静的メソッドはオーバーライドまたはオーバーロードできますか?
staticキーワードで指定された要素は、クラスのオブジェクトではなくクラスに属し、クラス自体がロードされるときにロードされます。静的要素はプログラム全体の唯一の要素であり、通常の要素は特定のオブジェクトの唯一の要素です。静的なものは次のとおりです。- クラスフィールド。
- クラス初期化ブロック。
- クラスメソッド;
- クラスの内部クラス (ただし、それでもトートロジーです)。
43. メソッドは静的であると同時に抽象的であることはできますか?
これについては、前の記事ですでに述べました。メソッドは、同時に抽象的であることと静的であることはできません。メソッドの抽象性は、後続メソッドでオーバーライドする必要があることを意味します。同時に、静的メソッドはクラスに属しており、オーバーライドできません。これにより矛盾が発生し、コンパイラはそれを認識して罵り始めます。このような状況に陥った場合は、アプリケーションのアーキテクチャが正しいかどうか真剣に検討する必要があります (結局のところ、アプリケーションには明らかに何か問題があります)。44. 通常のメソッドの途中で静的メソッドを使用することはできますか? 逆に?なぜ?
これを妨げるものがないため、静的メソッドは通常のメソッドでも使用できます。同時に、その逆の状況は不可能です。静的メソッドは、このクラスの特定のインスタンスへの参照がなければ、通常のメソッドを使用できません。そして、覚えているように、this参照は静的クラス メンバーには使用できません。クラスの特定のオブジェクトは必要なだけ存在でき、それぞれが内部にそれ自体への参照 ( this )を持ちます。それでは、どの特定のリンクをたどる必要があるのかをどのように理解すればよいでしょうか? しかし、それは無理です。したがって、静的要素は、特定のオブジェクトへの参照なしに、非静的要素を参照することはできません。実際には、静的メソッドは、特定のオブジェクトへの参照がある場合にのみ、非静的メソッドを使用できます。たとえば、引数として来たものは次のとおりです。public static void petTheCat(Cat cat) {
System.out.println("Погладить кота - " + cat.getName());
}
ここでは、静的メソッドpetTheCat がCatオブジェクトの通常の非静的メソッドgetNameを呼び出していることがわかります。
45. インターフェースとは何ですか? 最終的なインターフェースは存在するのでしょうか?
ご存知のとおり、Java には多重継承はありません。インターフェースはそれに代わるものです。インターフェイスは非常に無駄を省いたクラスのように見えます。これらは、特定の実装を使用せずに機能を定義します。実装は、これらのインターフェイスを実装 (実装) するクラスによって実装されます。インターフェースの例:public interface Animal {
void voice();
}
クラスによるインターフェース実装の例:
class Cat implements Animal {
@Override
public void voice() {
System.out.println("Meow! Meow! Meow!");
}
}
インターフェイスの使用について知っておく必要がある主な事項は次のとおりです。
- インターフェイス メソッドには、特定のメソッド本体を含めずに、ヘッダーのみを含める必要があります。抽象的でなければなりません (ただし、 abstractキーワードは使用しません)。例外は静的メソッドとデフォルト メソッドであり、メソッド本体が必要です。
- クラスは多くのインターフェイスを実装できます (前述したように、これは多重継承の代替手段です)。これらのインターフェイスはカンマで区切って記述します。class Lion は Animal, Wild を実装します。
- インターフェイスは、キーワード-interfaceを使用して作成されます。
- クラスによってインターフェイスを実装する場合、キーワードはimplementsです。
- 特定のインターフェイスを実装するクラスは、その抽象メソッドをすべて実装するか、それ自体を抽象メソッドとして宣言する必要があります。
- インターフェイスを使用する主な目的は、ポリモーフィズム (オブジェクトがさまざまな形式を取る能力) を実装することです。
- 原則として、メソッドのアクセス修飾子はインターフェイスには記述されません。アクセス修飾子はデフォルトでpublicであり、 public以外の修飾子は指定できません。Java 9 以降、メソッドにプライベート修飾子を使用できるようになりました。
- インターフェイス変数はデフォルトでは静的 Final、つまり定数です。これらは常にインターフェイス内で直接初期化する必要があります。
- インターフェイス オブジェクトを作成することはできません。
46. 静的フィールドはどこで初期化できますか?
静的フィールドは初期化できます。- 宣言時に直接、等号= ;を使用します。
- 静的初期化ブロック内。
- 非静的初期化ブロック内にありますが、オブジェクトが作成されるたびに、このフィールドはこの初期化ブロックによって上書きされることを理解しておく必要があります。
- クラスコンストラクター内で。このコンストラクターが呼び出されるたび (つまり、このコンストラクターを通じてオブジェクトが作成されるとき)、このフィールドは上書きされます。
- 静的メソッドの場合。
- 非静的メソッドの場合。
- 内部静的クラスと非静的クラス、ローカルクラスと匿名クラス。
47. 匿名クラスとは何ですか?
匿名クラスは、独自の型を持たないクラスです。私は何を話しているのでしょうか?インターフェイスについて話したときに、インターフェイス オブジェクトを作成できないと述べました。作成できるのは、インターフェイスを実装するクラスのオブジェクトのみです。クラスにインターフェイスを実装したくないが、それでもインターフェイス型のオブジェクトが必要な場合はどうすればよいでしょうか? そしておそらく、これはこのオブジェクトを使用する 1 つのケースになるでしょう。また、本格的な実装クラスを作成する必要もありません。どうやってやりますか?右!匿名クラスで!Animalインターフェースがあるとします。public final interface Animal {
public void voice();
}
匿名クラスを通じてこのインターフェースをインスタンス化したい場合:
Animal cat = new Animal() {
@Override
public void voice() {
System.out.println("Meow! Meow! Meow!");
}
};
これで、このオブジェクトとその実装されたメソッドvoiceを安全に使用できるようになります。つまり、匿名クラスがこのインターフェイスとそのすべての抽象メソッドを今ここで実装します。そうしないと、実装されていない/抽象メソッドが存在するため、インターフェイス/抽象クラス オブジェクトを作成できません。先ほど述べたように、匿名クラスはインターフェイスの抽象メソッドを実装するためだけでなく、抽象クラスの抽象メソッドを実装するためにも使用されます。このアプローチは、オブジェクトが 1 回だけ使用される場合、またはメソッドの特定の実装が 1 回だけ必要な場合に適しており、必要な抽象クラス/インターフェイスを実装する別のクラスを作成する必要がありません。ただし、仕事において匿名クラスが使用されることはまれであることにも注意してください。原則として、依然として通常のクラスが優先されます。匿名クラスの詳細については、この記事を参照してください。。
48. プリミティブクラスとは何ですか?
私にとって、これは非常に奇妙な質問であり、おそらくこれは罠の質問です。なぜなら、Java にはプリミティブ クラスのようなものが存在しないからです。おそらく、以前にすでに検討したプリミティブ型の概念を除いてです。覚えているとおり、Java にはbyte、short、int、long、float、double、char、booleanの 8 つのプリミティブ型があります。49.「ラッパー」クラスとは何ですか?
Java でプリミティブ型を使用する場合の主な問題は、プリミティブ型が依然としてクラスではなく、Java が依然として OOP 言語であることです。つまり、この言語で書かれたプログラムはオブジェクト間の対話に還元されます。まあ、プリミティブはオブジェクトではありません。これらにはメソッドがなく、Objectクラスの標準メソッドさえありません。では、 Mapでプリミティブをキーとして使用する必要がある場合はどうなるでしょうか? 次に、 hashCodeメソッドを呼び出す必要があります。そこで、 equalsメソッドを呼び出すこともできます。じゃあ何?プリミティブではなくクラスが存在する必要がある瞬間が非常に多く発生する可能性があり、その場合、プリミティブはプログラム内で使用されず、望ましくない要素になります。これは、OOP の概念そのものを破壊するためです。しかし、すべてが思ったほど悪いわけではありません。結局のところ、Java にはプリミティブ ラッパーの概念があります。各プリミティブ型にはアナログ クラスがあります。- バイト-> Byte.class
- short -> Short.class
- int -> Integer.class
- ロング-> Long.class
- float -> Float.class
- double -> Double.class
- 文字->文字.クラス
- ブール値-> Boolean.class
50. ネストされたクラスとは何ですか? いつ使用されますか?
ネストされたクラスは、別のクラスのメンバーである内部クラスです。Java には、このような内部クラスが 4 種類あります。 1. 内部クラス このタイプのクラスは、別のクラスの本体内で直接宣言されます。ネストされた内部クラスは、外部クラスのインスタンスのプライベート フィールドまたはメソッドにアクセスできます。例として、シマウマという動物を飼う動物園を作成してみましょう。public class Zoo {
class Zebra {
public void toFeed(String food) {
System.out.println("Дать зебре - " + food);
}
}
}
何も複雑なことはありませんよね?内部クラス オブジェクトの作成例を見てみましょう。
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
すでに見たように、内部クラスのオブジェクトを作成できる参照に基づいて、フレーミング クラスのオブジェクトを作成することが不可欠です。また、入れ子になった内部クラスには静的メソッドや静的フィールドを含めることはできないことにも注意してください。これは、内部クラスがその外部クラスのオブジェクトに暗黙的に関連付けられており、内部クラス内で静的メソッドを宣言できないためです。 2. 静的ネストされたクラスこのクラスは前のクラスと似ていますが、クラス宣言の近くに静的アクセス修飾子 がある点が異なります。この種のクラスは外部クラスの非静的フィールドにアクセスできないため、内部クラスというよりも外部クラスの静的部分に似ています。この場合、クラス データは、プライベート メンバーも含め、外部クラスのすべての静的メンバーにアクセスできます。静的ネストされたクラスの例:
public class Zoo {
static class Zebra {
public void toFeed(String food) {
System.out.println("Дать зебре - " + food);
}
}
}
作成方法は以前のものとは少し異なります。
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
ここでは、ネストされた静的クラスのオブジェクトを作成するために外部クラスのオブジェクトは必要ありません。外部クラスからは、入れ子になったクラスの場所を見つけるためにその型のみが必要です。 3. ローカルクラス ローカルクラスはメソッド本体内で宣言されたクラスであり、ローカルクラスのオブジェクトの作成や利用はこのメソッド内でのみ可能です。例:
public class Zoo {
public void toFeed(String animal, String food) {
switch(animal){
case "зебра":
class Zebra {
void toFeedZebra(String food) {
System.out.println("Дать зебре - " + food);
}
}
Zebra zebra = new Zebra();
zebra.toFeedZebra(food);
...
使用例:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
toFeedメソッド のコードを見なければ、ローカル クラスの存在を疑うことすらできないでしょう。ローカル クラスをstaticまたはtransientにすることはできませんが、 abstractまたはFinalとしてマークすることはできます(これら 2 つの修飾子を使用すると競合が発生するため、OR のみ)。 4. 匿名クラス 匿名クラスについては上ですでに説明しましたが、覚えているとおり、匿名クラスはインターフェイスとクラスという 2 つのソースから作成できます。 内部静的クラスと非静的クラスを使用する理由 は、場合によっては、大きなクラスの中に小さなクラスを埋め込んでまとめておく方がよいためです。こうすることで、クラスの凝集性が高まり、共通の目的が得られます。実際、ネストされたクラスを使用すると、コードのカプセル化が増加します。ローカル クラスを選択する理由は、特定のクラスが単一のメソッド内で排他的に使用されるためである可能性があります。この場合、コードをアプリケーション全体に分散させる必要があるでしょうか? いいえ。しかし同時に、私の実践ではローカル クラスの使用を一度も見たことがないことも付け加えておきます。それらの必要性については非常に議論の余地があります。匿名クラスを使用する理由は、インターフェイスまたは抽象クラスの特定の実装が一度だけ必要となるため、その実装を備えた別の本格的なクラスを作成する必要がないためである可能性があります。代わりに、簡単な方法で、匿名クラスを通じて必要なメソッドを実装し、このオブジェクトを使用して、それを忘れました (ガーベジ コレクターはそれを覚えていました)。この記事とこの記事は、内部クラスをさらに詳しく学習するのに役立ちます。
51. クラスにはどのようなアクセス修飾子を含めることができますか?
覚えているとおり、クラスにはさまざまなタイプがあり、さまざまなアクセス修飾子がそれらに適用されます。- 外部クラスには、アクセス修飾子public を指定することも、修飾子なし (デフォルト修飾子) を指定することもできます。
- 内部クラスは4 つのアクセス修飾子をすべてサポートします。
- ネストされた静的クラスは、protectedを除くすべてのアクセス修飾子をサポートします。この修飾子は継承を意味し、クラスの静的メンバーと矛盾します (静的要素は継承されません)。
- ローカル クラスはデフォルトの修飾子のみを持つことができます (つまり、修飾子はまったくありません)。
- anonymous class : クラス型宣言がない場合、アクセス修飾子はまったくありません。
GO TO FULL VERSION