出典:ハッケヌーン
コンストラクターとは何ですか?
コンストラクターは、クラス名と同じ名前でクラス内に定義された特別なメソッドです。Java コンストラクターは、戻り値の型を持たないメソッドに似ています。 コンストラクターはオブジェクトの初期化において最も重要な役割を果たします。この記事では、Java のコンストラクターに関する面接の質問の例をリストします。また、Java におけるコンストラクターの重要性についても学び、面接で Java コンストラクターに関する質問に答えるのに役立つコード例やその他の重要な詳細を参照してください。なぜコンストラクターが必要なのでしょうか? 詳しく説明してください
Studentという名前のクラスがあるとします。そして、インスタンス変数名とroll_number があります。class Student{
String name;
int rollNo;
}
ここで、1000 個のオブジェクトを作成すると、JVM はこれらの値をデフォルトのタイプName = nullおよびrollNo = 0で初期化します。これらの個々のオブジェクトを識別することは不可能であり、各オブジェクトに値を割り当てるとコードの量が増加するため、悪いプログラミング手法とみなされます。したがって、これを回避するためにコンストラクターが使用されます。つまり、Java のコンストラクターの目的は、クラス インスタンス変数の値を初期化することです。
Java にはどのような種類のコンストラクターがありますか?
Java には 3 つの異なるタイプのコンストラクターがあります。- デフォルトのコンストラクター
- 引数のないコンストラクター
- パラメータ化されたコンストラクタ
Javaのデフォルトコンストラクタとは何ですか?
デフォルト コンストラクターは、クラスにコンストラクターが定義されていない場合に、実行時に JVM によって作成されるコンストラクターです。デフォルト コンストラクターの主な仕事は、インスタンスの値をデフォルトの型に従って初期化することです。Java のデフォルト コンストラクターの例:class DefaultConstructor{
int id;
String name;
}
このクラスでは、オブジェクトを作成すると、JVM 内にデフォルト値が与えられたデフォルトのコンストラクターが存在します。
DefaultConstructor df= new DefaultConstructor();
ここで値を出力すると、次の結果が得られます。
印刷 = df.id = 0.df.name = null。
引数なしのコンストラクターとは何ですか?
引数のないコンストラクターは、インスタンスの値を初期化するために明示的に定義できるコンストラクターです。例えば:class NoArgConstuctor{ int a; int b;
//No Argument Constructor
NoArgConstuctor(){
a = 10;
b = 20;
}
}
パラメーター化されたコンストラクターとは何ですか?
パラメーター化されたコンストラクターは、インスタンスを初期化するパラメーターを受け入れるコンストラクターです。例えば:class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}
コンストラクターを定義するためのルールは何ですか?
コンストラクターを定義するには、いくつかのルールに従う必要があります。-
コンストラクター名はクラス名と一致する必要があります。
-
Java にはコンストラクターの戻り値の型があってはなりません。
-
コンストラクターに適用できる修飾子は次のとおりです。
- 公共
- デフォルト
- 保護された
- プライベート
-
コンストラクターは任意の数のパラメーターを受け取ることができます。
-
修飾子、final、synchronized、static、abstract はコンストラクターでは使用できません。
-
コンストラクターは、本体内のreturnステートメントをサポートしていません。
-
コンストラクター内のthrowステートメントでは例外が発生する可能性があります。
-
コンストラクターでthrows 節を使用することは許容されます。
-
コンストラクターは再帰を生成しないでください。
プライベート コンストラクターはいつ使用できますか?
特定のクラスのオブジェクトを外部から作成したくない場合は、クローズドまたはプライベート コンストラクターを使用できます。コンストラクターをプライベートと宣言すると、クラス内でのみオブジェクトを作成できます。シングルトンクラスは、プライベート コンストラクターの使用例です。明示的に定義しない場合、デフォルトのコンストラクターのアクセス修飾子は何になりますか?
コンストラクターのデフォルトのアクセス修飾子は常にクラス修飾子と同じになります。クラスが public の場合、コンストラクターも public になります。クラスがプライベートの場合、コンストラクターもプライベートになります。他のアクセス修飾子でも同じことが起こります。以下のコード スニペットの出力を記述して説明します。
class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
上記のコードは次のように出力します。
インタビュービットへようこそ。InterviewBit による Scaler Academy へようこそ。
最初の行のコンストラクターにsuper()またはthis()キーワード を含めないと、JVM が実行時に自動的にキーワードを挿入するため、この出力が得られます。JVM がこれを行うのは、JVM が別のクラスから継承し、その機能が派生クラスにも実装されるためです。したがって、基本クラスのインスタンスにデフォルト値を割り当てるとき、JVM はデフォルトでsuper()キーワードを追加します。
コードを確認し、それが有効か無効かを示します。理由を説明してください
class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
this();
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
上記のコードは、 Scaler Academyコンストラクター 内の同じコンストラクターであるため、無効です。これによりコンストラクター内で再帰が発生しますが、これは許可されていません。したがって、再帰的コンストラクターの呼び出しに関連するコンパイル時エラーが発生します。
Java の 1 つのクラスで 2 つのコンストラクターを使用できますか?
はい、次の 2 つの条件に従って、1 つのクラス内で任意の数のコンストラクターを使用できます。- コンストラクターのパラメーターは異なっている必要があります。
- コンストラクター内で再帰があってはなりません。
InterviewBit(){
this("Scaler"); // Calling parameterized constructor
System.out.println(" No Argument Constructor");
}
InterviewBit(String name){
this(); // Calling no-arg constructor
System.out.println(" Constructor with Parameters.");
}
このコードは再帰が発生するため無効です。引数のないコンストラクターはパラメーターのあるコンストラクターを呼び出し、パラメーターのあるコンストラクターは引数のないコンストラクターを呼び出します。
Java でコンストラクターをオーバーライドできますか?
いいえ、コンストラクターのオーバーロードの概念は Java には適用できません。Javaではコンストラクターをfinalにできますか?
コンストラクターを最終的なものにすることはできません。これは、finalキーワードは派生クラスのメソッドのオーバーライドを停止するために使用されるためです。ただし、コンストラクターではオーバーライドの概念が適用されないため、 finalキーワードを記述する必要はありません。コンストラクターにfinalキーワードを記述すると、コンパイラーはそれをメソッドとして扱うため、 「必須戻り型」と呼ばれるコンパイル時エラーが発生します。Java ではコンストラクターを静的にできますか?
いいえ、Java コンストラクターを静的にすることはできません。これは、メンバーをオブジェクトではなくクラスに所属させたい場合に静的キーワードが使用されるためです。ただし、コンストラクターはオブジェクトを初期化することを目的としているため、コンパイラーはそれをメソッドとして扱います。必須の戻り値の型エラーが発生します。super()、super と this()、this の違いを説明してください
super()とthis() はコンストラクター呼び出しです。これは、親クラスまたは現在のクラスのコンストラクターを呼び出すためにのみ使用されます。「スーパー」と「ディス」は、独自のクラスまたは基本クラスのインスタンスのメンバーを指定するために使用されるキーワードであることに注意してください。以下のコードを考えてみましょう。class InterviewBit{
String message = " Welcome to InterviewBit";
}
public class Scaler extends InterviewBit
{
String message = " Welcome to Scaler Academy";
public void printMethod(){
//this will print the message variable of the current class.
System.out.println(this.message);
//this will print the message variable of Base class.
System.out.println(super.message);
}
public static void main(String[] args) {
Scaler sa = new Scaler();
sa.printMethod();
}
}
このコード スニペットでは、this.message は「 Welcome to Scaler Academy 」というメッセージを出力し、super.message は「 Welcome to InterviewBit 」を出力します。この 2 つのキーワードを使用して、基本クラスと派生クラスのメンバー インスタンスを参照する方法を示します。
デストラクターとは何ですか? Javaにデストラクタは存在しますか?
デストラクターは、プログラムによって獲得されたメモリを解放するために使用されます。たとえば、プログラムの実行中にメモリが必要な場合、デストラクターはそのメモリを解放し、他のプログラムが使用できるようにします。Java ではメモリを解放する作業がガベージ コレクターによって処理されるため、Java にはデストラクターの概念がありません。Java のコンストラクター チェーンとは何ですか?
1 つのコンストラクターが別のコンストラクターから呼び出される場合、これをコンストラクターの連鎖と呼ぶことができます。コンストラクターの呼び出しは同じクラスで行う必要はありません。これは親クラスに対しても行うことができます。例として、以下の画像を考えてみましょう。 次に、これらのインスタンス変数の値を使用してオブジェクトを初期化するコードを見てみましょう。class EmployeeAddess{
int pinCode;
String address;
String mobNo;
EmployeeAddress(int pinCode, String address, String mobNo){
this.pinCode = pinCodel
this.address = address;
this.mobNo = mobNo;
}
}
class Employees extends EmployeeAddress{
int ID;
String name;
String designation;
String department;
Employee(int ID, String name, String designation,String department,
int pinCode, String address, String mobNo){
//Calling Constructor for Base class to initialize the object.
//This can be a constructor chaining.
super(pinCode, address, mobNo);
this.ID = ID;
this.name = name;
this.designation = designation;
this.department = department;
}
}
public class Main{
Employee emp = new Employee(101, "XYX", "SDE", "Cloud", 123456, "no 150, xys, xys, INDIA", "999999999");
}
上記のコードでは、従業員の詳細と住所を含むEmployeeクラス オブジェクト を作成しています。Employeeアドレス クラスは、Employeeクラスによって継承されます。ここで、住所のオブジェクト値をインスタンス化するために、従業員の住所に明示的な値を割り当てません。代わりに、 Employee Addressクラスのコンストラクターを使用してこれを行います。そして、 super(arguments)の助けを借りて、値を初期化するコンストラクターのチェーンを形成します。それがコンストラクター チェーンです。
コードからプログラム出力を特定し、答えを説明してください。
class InterviewBit{
void InterviewBit(){
System.out.println(" Java Constructor interview questions by InterviewBit");
}
int InterviewBit(int val){
System.out.println(" Java Constructor. And Value = "+val);
}
}
public class Main{
InterviewBit ib1 = new InterviewBit();
InterviewBit ib2 = new InterviewBit();
}
InterviewBit() はここではコンストラクターではない ため、上記のコードは何も出力しません。Voidとintキーワードを使用しているのでメソッドになります。したがって、メソッドを呼び出しません。メソッドを実行するにはオブジェクト上で明示的に呼び出す必要があるため、出力は得られません。
コンストラクターを使用してオブジェクトの値を新しいオブジェクトにコピーするプログラムを作成する
class Rectangle{
int length;
int breadth;
Rectangle(int length, int breadth){
this.length = length;
this.breadth = breadth;
}
//Overloaded Constructor for copying the value of old Object to new object
Rectangle(Rectangle obj){
this.length = obj.length;
this.breadth = obj.breadth;
}
}
public class Main{
Rectangle obj1 = new Rectangle(10, 5);
//New Object of rectangle class will be created with the value from obj1.
Rectangle obj2 = new Rectangle(obj1);
}
GO TO FULL VERSION