小さな雑談
Java
:この記事は主に、小白が重要で忘れやすいと感じている細かい詳細や知識の補足を編集しています。学習とJava
使用、少し記録します. より多くの内容の知識ポイントはこのコラムに書かれているので、ここではすべて小さなtips
ものです.Java言語部分全体を、「基本編」「取り組み編」「補足編」に分けて、補足編も随時更新していきます〜 この記事は「基本編」です。
これまでのすべてのセクション:
- 1. Java JRE および JDK
- 2. Java データ型変換
- 3. Java 定数最適化メカニズム
- 4. +=、-= を使用すると、演算の結果の型は、結果を保持する型に自動的にキャストされます。
- 5. メンバー変数とローカル変数の違い
- 6. スタック、ヒープ、メソッド領域 (概要)
- 7. 標準コード - JavaBean
- 8. パッケージングの概念の包括的かつ簡単な理解
- 9. 継承の概念の包括的かつ簡潔な理解
- 10. super および this キーワード
- 11. 親クラスのスペースは、子クラスのオブジェクトの初期化よりも優れています
- 12.抽象クラスの包括的かつ簡単な理解
- 13. インターフェースの包括的かつ簡単な理解
- 14. ポリモーフィックな包括的かつ簡潔な理解
- 15.決勝(面接試験場)
- 16. 許可修飾子
- 17. Java プリミティブ型とラッパー型
- 18.書き直す
- 19. オーバーロード
- 20. 識別子とキーワード
- 21. == と equals の違い
- 22.エッセイ
1. Java JRE および JDK
- JRE (Java Runtime Environment):実行に必要なコア クラス ライブラリを含む、
Java
プログラムの実行環境です。JVM
- JDK (Java Development Kit)
Java
:JRE
開発者が使用するツールとツールを含むプログラム開発キットです。
既存の Java プログラムを実行したい場合は、それをインストールするだけで済みJRE
、まったく新しいプログラムを開発したい場合は、それをインストールする必要があります。Java
JDK
チップ:
3つの関係: JDK > JRE > JVM
2. Java データ型変換
-
自動変換: さまざまな種類の操作が実行されると、結果は大きな値の範囲を持つ型になるため、戻り値は大きな値で受け取る必要があります。そうしないと、コンパイル時にエラーが報告されます。
-
変換順序の規則
範囲の小さい型は範囲の大きい型に昇格し、
byte
、 、 、short
をchar
操作すると、 int に直接昇格され、java
自動的に実行されます。byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double
-
-
キャスト:
値の範囲が大きい型を値の範囲が小さい型に強制するには、手動で実行する必要があります。
- ノート:
- 浮動小数点を整数に変換するときは、小数点を直接キャンセルします。これにより、データの精度が失われる可能性があります。
int
強制的に変換して 2 バイトshort
を切り捨てると、データが失われる可能性があります。
- ノート:
3. Java 定数最適化メカニズム
-
在常量进行运算的时候,它的值是固定不变的。所以 `java` 虚拟机会自动进行运算(就是上面的自动隐式转换)。
-
然后判断是否超出了取值范围,如果没有超出就正常赋值。
public static void main(String[] args) {
//short类型变量,内存中2个字节
short s = 1;
/*出现编译失败 s和1做运算的时候,1是int类型,s会被提升为int类型 s+1后的结果是int类型,将结果在赋值会short类型时发生错误 short内存2个字节,int类型4个字节 必须将int强制转成short才能完成赋值 */
s = s + 1; // 编译失败
s = (short)(s+1); // 需要手动强制,编译成功
System.out.println(s1); // 2
}
4. を使用すると+=
、-=
操作の結果の型が結果を保持する型に自動的にキャストされます
- どのような意味です?Java 定数最適化メカニズムから、型の暗黙的な変換の適用、またはこの例を知っています。
public static void main(String[] args) {
// 例子一
short s1 = 1;
// s1 = s1 + 1; // short类型在进行运算时会自动提升为int类型。Java编译检测报错,无关结果是否溢出
s1 += 1; // 正确写法,它的机制就是先将结果算出,再将结果强制转换为持有结果的类型,溢出就为负
System.out.println(s1); // 2
// 例子二(溢出情况)
short a = 32767;
short b = 1;
b += a;
System.out.println(b); // -32768
}
5. メンバー変数とローカル変数の違い
違い | メンバー変数 | ローカル変数 |
---|---|---|
クラスでの立場が違う(強調) | クラス内、メソッド外 | メソッド内またはメソッド宣言上 (仮パラメーター) |
行動範囲が違う(強調) | クラスで | 方法 |
初期値の違い(強調) | デフォルト値があります | デフォルト値はありません。最初に定義し、割り当て、最後に使用する必要があります |
メモリ内の場所が異なります (強調) | ヒープメモリ | スタックメモリ |
ライフサイクルが違う(わかる) | オブジェクトが作成されると存在し、オブジェクトが消えると消えます | メソッドが呼び出されると存在し、メソッドが呼び出されると消える |
6. スタック、ヒープ、メソッド領域 (概要)
stack
Java 仮想マシンのメモリは、スタック、ヒープ、heap
メソッド領域の3 つの領域に分けられますがmethod area
、メソッド領域は実際にはヒープ内にあります。JVM
全体的なメモリ構造はスタックとヒープです。
-
スタック スタック
- スタックは、メソッド実行のメモリ モデルを記述します。各メソッドは、スタック フレームを作成するために呼び出されます (ローカル変数、オペランド、メソッド出口などのストレージ)。
JVM
スレッドごとにスタックを作成し、スレッドの実行方法の情報(実パラメータ、ローカル変数など)を格納します。- スタックはスレッド専用であり、スレッド間で共有することはできません
- スタックの貯蔵特性は「先入れ後出し後入れ先出し」(マガジン効果)
- スタックはシステムによって自動的に割り当てられ、高速です。スタックは連続したメモリ空間です
-
ヒープ ヒープ
- ヒープは、作成されたオブジェクトと配列を格納するために使用されます (配列もオブジェクトです)
JVM
すべてのスレッドで共有されるヒープは 1 つだけです- ヒープは、柔軟な割り当てと低速の不連続なメモリ空間です!
-
メソッド領域 メソッド領域(静的領域とも呼ばれる)
JVM
すべてのスレッドで共有されるメソッド領域は 1 つだけです。- メソッド領域は実際にはヒープであり、クラスと定数に関連する情報を格納するためにのみ使用されます!
- プログラム内の定数または一意のコンテンツを格納するために使用されます。(クラス情報[
Class
オブジェクト]、静的変数、文字列定数など)
7. 標準コード - JavaBean
JavaBean
Java
語学授業の標準仕様です。に準拠JavaBean
するクラスは、クラスが固有かつパブリックである必要があり、パラメーターなしのコンストラクターを持ち、メンバー変数を操作するためのメソッドset
を提供する必要があります。get
属性名はこのパターンに準拠しており、他の
Java
クラスはJavaBean
イントロスペクション メカニズム (リフレクション メカニズム) を通じてこれらの属性を検出して操作できます。
- フォーマット例
package Demo;
/**
* @Author 白忆宇
*/
public class Fruits {
private String name;
private String color;
/**
* 不写构造方法默认存在无参数的构造方法
*/
public Fruits() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
8. パッケージングの概念の包括的かつ簡単な理解
-
機能: コード間の保護バリアであり、このクラスのコードとデータが他のクラスによってランダムにアクセスされるのを防ぎます。このクラスのデータにアクセスするには、指定されたメソッドを渡す必要があります。適切にカプセル化すると、コードの理解と保守が容易になり、コードのセキュリティも強化されます。
-
カプセル化特性を実現する方法
-
(1) プライベートキーワード (メイン)
private によって変更されたメンバー変数とメンバー メソッドは、このクラスでのみアクセスできます。アクセスする必要があるメンバー変数に対応する getXxx メソッドと setXxx メソッドのペアを提供します。
-
(2) this キーワード (カプセル化最適化 1)
this
クラスの現在のオブジェクトの参照 (アドレス値)、つまりオブジェクト自体の参照を表します。
注: メソッドはどのオブジェクトによって呼び出され、this
メソッドそのオブジェクトを表します。つまり、電話をかけている人は誰でもthis
その人を代表しています。 -
(3) 構築方法 (カプセル化の最適化 2)
オブジェクトが作成されると、コンストラクターを使用してオブジェクトが初期化され、オブジェクトのメンバー変数に初期値が割り当てられます。
注: すべてのクラスには、カスタム コンストラクターであるかどうかに関係なく、パラメーターなしのコンストラクターがJava
自動的に定義されると、Java
自動的に提供される既定のパラメーターなしのコンストラクターは無効になります。
-
9. 継承の概念の包括的かつ簡潔な理解
- 機能(メリット):コードの再利用性向上、コード構造の簡素化、ポリモーフィズムの前提となるクラス間の関係の構築。
- 原則: サブクラスは親クラスの属性と動作を継承するため、サブクラス オブジェクトは親クラスと同じ属性と動作を持ちます。サブクラスは、親クラスの非プライベートプロパティと動作に直接アクセスできます。
- 特徴: 単一継承のみがサポートされています。しかし、それは多段階継承(継承システム)になる可能性があります
- 短所: クラス間の結合が強すぎるため、コードの世界では「疎結合」の概念が非常に重要であり、髪の毛 1 本で全身に影響を与えることはありません。
10. super および this キーワード
キーワード | 意味 |
---|---|
素晴らしい | 親クラスの記憶域識別子を表します(親への参照として理解できます) |
これ | 現在のオブジェクトの参照を表します(それを呼び出す人は誰でも誰を表しますか) |
-
使用法
-
訪問会員
this.Member 変数 - このクラスの
super.Member 変数 -- 親クラスの
this.Member method name() ‐‐ このクラスの
super.Member method name() ‐‐ 親クラスの
-
アクセスコンストラクター
this(…) - このクラスのコンストラクター
super(…) ‐‐ 親クラスのコンストラクタ
-
11. 親クラスのスペースは、子クラスのオブジェクトの初期化よりも優れています
サブクラス オブジェクトが作成されるたびに、親クラス空間が最初に初期化され、次にサブクラス オブジェクト自体が作成されます。その目的は、サブクラス オブジェクトに対応する親クラス スペースが含まれているため、親クラスのメンバーを含めることができるためです. 親クラスのメンバーが
private
変更されて コードがサブクラスのコンストラクターの呼び出しに反映される場合、親クラスのコンストラクターを最初に呼び出す必要があります。
-
簡単な面接の質問
-
問題: サブクラスが親クラスを継承し、別のクラスがこのサブクラスを初期化して作成し、使用します: サブクラスの引数なしの構築メソッド、サブクラスの
static{}
コードstatic{}
?実行? -
答え: 親クラスの静的コード ブロック > サブクラスの静的コード ブロック > 親クラスの構築方法 > サブクラスの構築方法
-
コードの説明
package Demo; /** * @Author 白忆宇 */ class Dad { static { System.out.println("父类 static 初始化"); } public Dad() { System.out.println("父类构造方法初始化"); } } class Son extends Dad { static { System.out.println("子类 static 初始化"); } public Son() { System.out.println("子类构造方法初始化"); } } public class Main { public static void main(String[] args) { Son son = new Son(); } } // 输出 父类 static 初始化 子类 static 初始化 父类构造方法初始化 子类构造方法初始化
-
12.抽象クラスの包括的かつ簡単な理解
-
機能 (利点) : 名前が示すように、このメソッドの実装はサブクラスごとに異なり、抽象化を継承し、特定の実装はサブクラスによって行われるため、サブクラス メソッドの抽象フレームワークを提供します。この種の利点は、端的に言えば、オブジェクト
java
指向。(Xiaobai は後に、非常にシンプルであることgo
も) -
定義: 修飾子抽象戻り値型メソッド名 (パラメータ リスト);
public abstract void run();
-
注意: 抽象クラスを継承するサブクラスは、親クラスのすべての抽象メソッドをオーバーライドする必要があります。それ以外の場合は、サブクラスも抽象宣言する必要があります。最終的には、親クラスの抽象メソッドを実装するサブクラスが存在する必要があります。そうでないと、最初の親クラスから最後のサブクラスまでオブジェクトを作成できず、意味がありません。
-
その他の注意事項
抽象クラスはobject を作成できません. オブジェクトが作成された場合, コンパイルは失敗し, エラーが報告されます. 非抽象サブクラスのオブジェクトのみを作成できます。
理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
抽象クラスには、サブクラスがオブジェクトを作成するときに親クラスのメンバーを初期化するために使用されるコンストラクターが存在する場合があります。
理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
抽象クラスには必ずしも抽象メソッドが含まれているとは限りませんが、抽象メソッドを持つクラスは抽象クラスである必要があります。
理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。
抽象クラスのサブクラスは、抽象親クラスのすべての抽象メソッドを書き換える必要があります。そうしないと、コンパイルが失敗し、エラーが報告されます。サブクラスも抽象クラスでない限り。
理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。
-
簡単な使用例: (読む必要はありません)
package Demo; /** * @Author 白忆宇 */ abstract class Animal { private String animalName; public String getAnimalName() { return animalName; } public void setAnimalName(String animalName) { this.animalName = animalName; } /** * 抽象方法action() */ abstract void action(); } class Dog extends Animal { @Override void action() { System.out.println("我是" + super.getAnimalName() + ",我爱摇尾巴"); } } class Cat extends Animal { @Override void action() { System.out.println("我是" + super.getAnimalName() + ",我爱喵喵叫"); } } public class Main { public static void main(String[] args) { Animal dog = new Dog(); dog.setAnimalName("狗"); dog.action(); Animal cat = new Cat(); cat.setAnimalName("猫"); cat.action(); } } // 输出 我是狗,我爱摇尾巴 我是猫,我爱喵喵叫
13. インターフェースの包括的かつ簡単な理解
-
役割: 最大のメリットは、コードの保守性が向上することです。例: コントロール クラスはインターフェイスを介して実装クラス メソッドを呼び出します. 実装クラスを変更する場合、コントロール クラスを移動する必要はありません. インターフェイスの実装のみを変更する必要があります. これは、Spring 開発モデル フレームワークの場合です。 . 特定の原則は、Java のオブジェクト指向の依存性逆転設計原則と組み合わせて理解することができます。
-
はじめに: メソッドの集合であるJava言語の参照型. クラスの内部がメンバー変数, 構築メソッド, メンバーメソッドをカプセル化する場合, インターフェイスの内部は主に抽象メソッド (JDK) を含むメソッドをカプセル化します. 7以前) )、デフォルトおよび静的メソッド (JDK 8)、プライベート メソッド (JDK 9)。
-
定義: public インターフェース インターフェース名 {}
public interface animal { //抽象方法:使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。 public abstract void eat(); //静态方法:使用 static 修饰,供接口直接调用。 public static void sleep(); //私有方法或私有静态方法:使用 private 修饰,供接口中的默认方法或者静态方法调用。 private (static) void run(); //默认方法:使用 default 修饰,不可省略,供子类调用或者子类重写。 public default void fight(); }
-
注意
- インターフェースを実装する非抽象サブクラスは、インターフェース; クラスは複数のインターフェースを実装できます
- インターフェイス
vs
継承: クラスは 1 つの親クラスのみを継承できますが、同時に複数のインターフェイスを実装します。 - クラスが親クラスを継承し、いくつかのインターフェースを実装する場合、親クラスのメンバー メソッドはインターフェースのデフォルト メソッドと同じ名前を持ち、サブクラスは近くの親クラスのメンバー メソッドを実行することを選択します。
-
その他のヒント
- インターフェイスでは、メンバー変数は定義できませんが、定数は定義でき、その値は変更できません. デフォルトでは、public static final で装飾されています。
- インターフェイスにはコンストラクターがなく、オブジェクトを作成できません。
- インターフェイスには、静的コード ブロックはありません。
14. ポリモーフィックな包括的かつ簡潔な理解
-
機能: たとえば、今後サブクラスがいくつ登場しても、getXxx/setXxx メソッドを記述する必要はなく、親クラスの getXxx/setXxx を使用して直接完了することができます。プログラミングをより簡単にし、優れた拡張機能を持つことができます。
-
定義:ポリモーフィズムは、カプセル化と継承に続くオブジェクト指向の 3 番目の主要な機能です。それは、いくつかの異なる症状を伴う同じ行動を指します。例: 生き物の活動: 人が歩く、魚が泳ぐ、鳥が飛ぶ...
-
使用: 親クラス型の変数名 = 新しいサブクラス オブジェクト; 変数名.メソッド名();
Fu f = new Zi(); f.method();
-
その他の注意
- 継承または実装 [2 つのうちの 1 つを選択]
- メソッド書き換え【意味のある表現:書き換えなし、無意味】
- 親クラス参照はサブクラス オブジェクトを指します [形式]
- 親クラスの参照、サブクラスの固有メソッドを呼び出したい場合は、ダウンキャストを行う必要があります。(ポリモーフィックなマイナー制限)
-
使用例(オプション)
package Demo; /** * @Author 白忆宇 */ abstract class Fruits { public abstract void color(); } class Banana extends Fruits { @Override public void color() { System.out.println("黄色~"); } } class Grape extends Fruits { @Override public void color() { System.out.println("紫色~"); } } public class Main { public static void main(String[] args) { Banana banana = new Banana(); Grape grape = new Grape(); getFruitsColor(banana); getFruitsColor(grape); } public static void getFruitsColor(Fruits fruit) { fruit.color(); } } // 输出 黄色~ 紫色~
15.決勝(面接試験場)
特徴: 不変。クラス、メソッド、および変数を装飾するために使用できます。
クラス: 変更されたクラスは継承できません。
Method : 装飾されたメソッドはオーバーライドできません。そして、より効率的に実行するためにインライン化を試み
JVM
ます。変数: 変更された変数は再割り当てできません。参照が変更された場合、それは参照が不変であり、参照が指す内容が可変であることを意味します。
定数: 変更された定数名には通常、書き方の基準があり、すべての文字が大文字になります。これは、コンパイル フェーズ中に定数プールに格納されます。
- 最終的な並べ替えルールについて
- コンストラクター内の
final
フィールドへの書き込みと、その後の構築されたオブジェクトへの参照の参照変数への割り当ては、順序を変更できません。 final
フィールドを含むオブジェクトへの参照の最初の読み取りと、その後のフィールドの最初の読み取りfinal
の間に並べ替えはありません。
- コンストラクター内の
16. 許可修飾子
公開: 公開。
保護された: 保護された
default : デフォルト
プライベート: プライベート
公共 | 保護された | デフォルト | プライベート | |
---|---|---|---|---|
同じクラスに | √ | √ | √ | √ |
同じパッケージ内 (サブクラスと無関係なクラス) | √ | √ | √ | |
異なるパッケージのサブクラス | √ | √ | ||
異なるパッケージ内の無関係なクラス | √ |
- 実践的なアドバイス
- メンバー変数の使用法
private
、詳細の非表示。 - コンストラクション メソッドは、
public
オブジェクトの作成を容易にするために使用されます。 - メンバーメソッドは、一般的に使用される許可要件に依存します
public
- メンバー変数の使用法
17. Java プリミティブ型とラッパー型
8 つの基本データ型は、カプセル化クラスです。
基本タイプ | デフォルト | パッケージ型式 |
---|---|---|
短い | 0 | 短い |
整数 | 0 | 整数 |
浮く | 0.0 | 浮く |
ダブル | 0.0 | ダブル |
長さ | 0 | 長さ |
バイト | 0 | バイト |
ブール値 | 間違い | ブール値 |
チャー | \u0000 | キャラクター |
- メンバー変数のカプセル化タイプのデフォルト値は
null
- 基本データ型が宣言されると、システムは自動的に領域を割り当てますが、参照型は宣言時にのみ参照領域が割り当てられ、割り当てられる前にデータ領域を開くためにインスタンス化する必要があります。
18.書き直す
-
オーバーライド定義 (Override)
サブクラス の親クラスに同名のメンバメソッドが出現した場合、このときのアクセスはメソッド書き換え(
Override
)と呼ばれる特殊なケースです。親クラスと同じメソッドがサブクラスに現れる (戻り値の型、メソッド名、およびパラメーター リストが同じ) 場合、書き換えまたは重複とも呼ばれるオーバーライド効果が発生します。変更せずに宣言し、再実装します。
オーバーライドされたメソッドが指定され、注釈が付けられます
@Override
(オプション)。- 使用例(オプション)
package Demo; class Dad { public void action(String action) { System.out.println("爸爸爱"+action); } } class Son extends Dad { public Son() { } public void action() { System.out.println("我是儿子在睡觉"); } @Override //重写的好处可以在原来的基础上修改和添加操作 public void action(String action) { super.action(action); System.out.println("儿子爱"+action); } } public class Main { public static void main(String[] args) { Son son1 = new Son(); son1.action(); son1.action("睡觉"); } } 输出: 我是儿子在睡觉 爸爸爱睡觉 儿子爱睡觉
-
要約する
-
メソッド名、パラメーター リスト、および戻り値の型 (サブクラスのメソッドの戻り値の型が親クラスの戻り値の型のサブクラスであることを除く) は同じである必要があります。
-
サブクラスのメソッドは、親クラスのメソッドをオーバーライドし、アクセス許可が親クラスのアクセス許可以上であることを確認する必要があります。(例えばサブクラスの場合
default
、親クラスは不可public
) -
書き換えると、メソッド内で super.parent クラスのメンバ メソッドを呼び出せるようになります。つまり、親クラスのメンバ メソッドを呼び出すということです。
-
19. オーバーロード
-
オーバーロードの定義 (Overload)
クラスでは、同じ名前のメソッドが異なるパラメーター リスト (異なるパラメーター タイプ、異なる数のパラメーター、または異なる順序のパラメーター) を持つ場合、オーバーロードされていると見なされます。同時に、オーバーロードには戻り値の型に関する要件はありません。戻り値の型は同じでも異なっていてもかまいませんが、戻り値の型が同じかどうかでオーバーロードを判断することはできません。
- 使用例(オプション)
package Demo; /** * @Author 白忆宇 */ class Person { public void sayHello() { System.out.println("I say Hello"); } public void sayHello(String who) { System.out.println(who + " say Hello"); } } public class Main { public static void main(String[] args) { Person person = new Person(); person.sayHello(); person.sayHello("Tom"); } } // 输出 I say Hello Tom say Hello
-
要約する
- オーバーロードは、クラスのポリモーフィズムの現れで
Overload
す - オーバーロードには、同じ名前のメソッドに対して異なるパラメーター リストが必要です (パラメーターの型、パラメーターの数、さらにはパラメーターの順序)
- オーバーロードする場合、戻り値の型は同じでも異なっていてもかまいません。戻り値の型は、オーバーロードと区別するための基準として使用できません
- 書き換えは親クラスとサブクラスで発生し、オーバーロードは同じクラスで定義された別の形式の式です
- オーバーロードは、クラスのポリモーフィズムの現れで
20. 識別子とキーワード
識別子は、プログラマーがプログラム、クラス、変数、およびメソッドに付ける名前です。
キーワードは、Java 言語によって内部的に識別される名前であり、特別な識別子です。
Java
一般的なキーワード
タイプ | キーワード |
---|---|
アクセス制御 | プライベート、プロテクト、パブリック |
クラス、メソッド、および変数 | 抽象、新規、クラス、静的、拡張、最終、実装、インターフェース、ネイティブ、strictfp、同期、一時的、揮発性 |
プログラム制御 | break、for、continue、instanceof、return、do、while、if、else、switch、case、default |
エラー処理 | トライ、キャッチ、スロー、スロー、ようやく |
パッケージ関連 | 輸入、パッケージ |
基本タイプ | boolean、char、byte、double、float、int、long、short、null、true、fasle |
変数参照 | スーパー、これ、ボイド |
予約語 | goto、const |
21. == と equals の違い
- ==
プリミティブ データ型は値==
を比較し、リファレンス データ型は==
メモリ アドレスを比較します。
- 等しい()
その機能は、2 つのオブジェクトが等しいかどうかを判断することでもあり、基本的なデータ型の変数を比較するために使用することはできません。equals()
メソッドObject
は、Object
すべてのクラスの直接または間接の親クラスである class に存在します。そして、そのデフォルトの実装は==
もちろん、クラスを定義するときにequals()
メソッド
// 默认实现
public boolean equals(Object obj) {
return (this == obj);
}
- String の equals メソッド
Sring
は基本型ではないため、元の比較はアドレス値ですが、特殊で、String
クラス内のequals
メソッドを元に書き直して、比較対象の値に変更しました。String
タイプのオブジェクトを作成する場合、仮想マシンは作成する値と同じ値を持つオブジェクトを定数プールで検索し、そうであれば、それを現在の参照に割り当てます。そうでない場合は、定数プールにString
オブジェクト。