学習ノート: ダークホース プログラマー Java の基礎 (パート 1)

Java 言語入門からマスタリーまでの章

  1. 学習メモ: Java の基礎 (パート 1)_ljtxy.love のブログ - CSDN ブログ
  2. 学習ノート: Java-Intermediate (パート 2)_ljtxy.love のブログ-CSDN ブログ
  3. 学習ノート: Java 上級章 (パート 3)_ljtxy.love のブログ-CSDN ブログ
  4. 学習ノート: Java 上級章 (1) (パート 4)_ljtxy.love のブログ-CSDN ブログ
  5. 学習ノート: Java 上級章 (2) (パート 5)_ljtxy.love のブログ-CSDN ブログ
  6. 研究メモ: Java8_ljtxy.love のブログの新機能 - CSDN ブログ

記事ディレクトリ

1。概要

メモの要約:

  1. 定義: Java は高級言語です。クロスプラットフォームポータブルな汎用オブジェクト指向プログラミング言語として設計されました。
  2. 特徴: 学びやすい、オブジェクト指向プログラミング、プラットフォーム非依存、セキュリティ、高性能、マルチスレッドサポート、オープンソース、無料
  3. クロスプラットフォームの原則: Java は、異なるオペレーティング システムに対して異なる仮想マシンを提供し、異なるオペレーティング システムに対して異なる仮想マシンをインストールします。
  4. 3 つの主要なバージョン:
    • JavaSE: SE は Standard Edition であり、Java コア クラス ライブラリが含まれており、主にデスクトップ アプリケーションの開発
    • JavaME: ME はマイクロ バージョンであり、SE 中央分類ライブラリと独自の拡張機能が含まれており、主にモバイル組み込み開発に使用されます。
    • JavaEE: EE は、SE と拡張機能 (サーブレット、JDBC など) を含むエンタープライズ バージョンで、主に分散ネットワーク プログラムの開発に使用されます。
  5. JRE、JVM、JDK:
    • JVM (Java 仮想マシン)、Java 仮想マシン
    • JRE (Java Runtime Environment)、Javaランタイム環境には、JVM および Java コア クラス ライブラリ (Java API) が含まれます
    • JDK(Java Development Kit)は、JREや開発ツールを含めたJava開発ツールと呼ばれます。
  6. ダウンロードとインストール
  7. カタログ紹介
  8. 環境変数の設定

1.1 定義

​ Java是一种广泛使用的计算机编程语言,由Sun Microsystems(后来被Oracle收购)在1995年推出。它被设计为一种通用的、面向对象的编程语言,具有跨平台性和可移植性

补充:

  • 语言:人与人交流沟通的表达方式

  • 计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言

1.2特点

  1. 简单易学:Java采用类似于C++的语法,但它去除了一些容易导致错误的复杂特性,使得它更加简单易学。
  2. 面向对象编程:Java是一种完全面向对象编程语言,这意味着所有的程序元素都是对象,通过对象之间的交互实现程序的逻辑。
  3. 跨平台性:Java程序在不同平台上可以运行,这是因为Java程序通过JVM(Java虚拟机)来运行,JVM能够在不同平台上执行相同的Java代码。
  4. 安全性:Java是一种安全性较高的编程语言,因为它具有内置的安全机制,如内存管理、异常处理和访问控制。
  5. 高性能:尽管Java是一种解释型语言,但它可以通过JIT(即时编译)技术提高性能。
  6. 多线程支持:Java提供了内置的多线程支持,使得程序员可以很方便地编写多线程程序。
  7. 开源免费:Java是一种开源免费的编程语言,可以通过许多渠道获得它的开发工具和运行环境。

Java语言跨平台的原理

  • 操作系统本身其实是不认识Java语言的。
  • 但是针对于不同的操作系统,Java提供了不同的虚拟机

ここに画像の説明を挿入します

画像-20230227102000755

1.3三大版本

​ JavaSE、JavaME、JavaEE

1.3.1JavaSE标准版

JavaSE (Java Platform, Standard Edition) は、デスクトップ アプリケーションの開発に使用される Java 言語 (Standard Edition) であり、他の 2 つのバージョンの基礎です。

1.3.2JavaMEマイクロエディション

JavaME (Java Platform, Micro Edition) は Java 言語の小型バージョンであり、組み込み家電機器小型モバイル機器の開発に使用されます(組み込み、テレビ、電子レンジ、テレビなど)、その中で最も重要なのは小型モバイル機器(携帯電話)の開発です。徐々に衰退していき、AndroidやIOSに取って代わられてしまいました。ただし、Android は Java で開発することもできます。

1.3.3JavaEE Enterprise Edition

JavaEE (Java Platform, Enterprise Edition) は、Web 指向のWeb サイト開発に使用されます。(主にバックエンドサーバーの開発に従事) サーバー分野ではJavaが言わずと知れたリーダーです。

ここに画像の説明を挿入します

1.3JDKのインストール

1.3.1 概要

  • JVM (Java 仮想マシン)、Java 仮想マシン
  • JRE (Java Runtime Environment)、Javaランタイム環境には、JVM および Java コア クラス ライブラリ (Java API) が含まれます
  • JDK(Java Development Kit)は、JREや開発ツールを含めたJava開発ツールと呼ばれます。

ここに画像の説明を挿入します

例証します:

開発時には、Java オペレーティング環境と仮想マシンを含むJDK をインストールするだけで済みます。実行するだけの場合は、JREをインストールするだけで済みます。

1.3.2 基本的な使用例

例証します:

JDK は公式 Web サイト (URL: Java Downloads | Oracle China)から入手してください。

知らせ:

  • インストール パスには、漢字、スペース、その他の特殊記号を含めないでください。
  • 開発に関連する今後のソフトウェアの推奨事項はすべて、管理が容易になるように同じフォルダーにインストールされます。

ステップ 1: JDK をダウンロードする
ここに画像の説明を挿入します

補足: インストールディレクトリ

ここに画像の説明を挿入します

  • 上記はJDK17のインストールディレクトリ、以下はJDKのディレクトリ説明です。
ディレクトリ名 説明する
置き場 JDK のさまざまなツールコマンドがこのパスに格納されます。javac と java はこのディレクトリに配置されます。
会議 JDK 関連の設定ファイルはこのパスに保存されます。
含む 一部のプラットフォーム固有のヘッダー ファイルは、このパスに保存されます。
jmod JDK のさまざまなモジュールがこのパスに保存されます。
法律上の 各 JDK モジュールの認証ドキュメントはこのパスに保存されます
ライブラリ JDK ツールの一部の補足JAR パッケージは、このパスに保存されます。

ステップ 2: 環境変数の設定

例証します:

Java プログラムを開発するには、JDK が提供する開発ツール (javac.exe、java.exe などのコマンド) を使用する必要があり、これらのツールは JDK インストール ディレクトリの bin ディレクトリにあります。環境変数の場合、これらのコマンドは bin ディレクトリでのみ使用できます。任意のディレクトリで使用したいため、環境変数を設定する必要があります。

1.JAVA_HOME環境を構成する

画像-20230809140945961

2.PATH環境を構成する

ここに画像の説明を挿入します

補充:

  • JAVA_HOME : JDK がインストールされている場所をオペレーティング システムに通知します (将来の他のテクノロジは、JDK を見つけるためにこれを使用します)
  • パス: JDK が提供する javac (コンパイル) および java (実行) コマンドがインストールされる場所をオペレーティング システムに伝えます。

ステップ 3: デモ

  • 新しい cmd 名前付けウィンドウを作成し、次のように入力します。java --version

画像-20230809141449697

例証します:

ここで、JDK バージョンが 17 であることがわかります。

2. 基本的な使用例 - HelloWorld

メモの要約:

Java プログラムの開発および実行プロセスには、プログラムの作成、プログラムのコンパイルプログラムの実行という 3 つのステップが必要です。

例証します:

プログラムを通じてHelloWorldJava プロセスの基本的な実行フローをデモンストレーションします。

ステップ 1: Java プログラムを作成する

  • 新しいファイルを作成しHelloWorld.classて書き込みます
class HelloWorld {
    
    
    public static void main(String[] args) {
    
    
        System.out.println("Hello, World!"); 
    }
}

ステップ 2: Java プログラムをコンパイルする

例証します:

javacは、Java ソース コード ファイル(.java拡張子で終わる) を Java バイトコード ファイル (.class拡張子で終わる) にコンパイルする Java コンパイラ用のコマンド ライン ツールです。Java バイトコード ファイルは Java 仮想マシン (JVM) 上で実行できます。

  • コマンドラインウィンドウを開いてjavacコマンドを実行します
javac HelloWorld.java

説明: 結果

ここに画像の説明を挿入します

ステップ 3: バイトコード ファイルを実行する

  • コマンド ライン ウィンドウを開いて、現在のディレクトリ内のjavaコマンドを実行します。
java HelloWorld

説明: 結果

ここに画像の説明を挿入します

知らせ:

.classクラスファイルを実行する際にサフィックスを追加する必要はありません

3. 基本的な文法

メモの要約:

  1. コメント: 単一行コメント、複数行コメント、ドキュメントコメント

  2. キーワード:

    • 定義: Java によって特定の意味が与えられた英単語
    • クラス、静的、……
  3. リテラル:

    • 定義:プログラムにおけるデータの記述形式
    • 666、「マイソウル」、……
  4. 変数:

    • 定義: データを一時的に保存するためのコンテナー
    • int a = 16;、double b = 10.1;、……
    • 注: Java の変数には変数タイプ、変数名があり、セミコロンで終わる必要があります。
  5. データの種類:

    • 基本データ型: byte、short、int、long、float、double、char、boolean
    • 参照データ型: 文字列、配列、クラス、インターフェイスなど。
    • 違い:
      1. プリミティブ データ型はスタックに格納され、参照データ型はヒープに格納されます。
      2. 基本データ型の変数は互いに独立していますが、参照データ型の変数は同じオブジェクトを共有する場合があります
  6. 識別子:

    • 定義: 識別子は、変数、メソッド、クラス、インターフェイスなどのプログラム要素に名前を付けるために使用される名前です
    • 知らせ:
      1. 数字、文字、**アンダースコア_、ドル記号 $** で構成する必要があります。
      2. 番号を次で始めることはできません
      3. キーワードにはできません
      4. 大文字と小文字を区別
    • Alibaba 命名規則の詳細
  7. 権限修飾子:

    • 定義: パーミッション修飾子は、クラス、メソッド、変数のアクセスパーミッションを制御するために使用される Java のキーワードです。
    • 権限範囲: private< 默认/空着不写< protected<public
  8. バッグ:

    • 定義: パッケージは、Java クラスを編成および管理するためのメカニズムです。

    • 命名規則:

      路径名.路径名.xxx.xxx
      // 例如:com.itheima.oa
      
    • パッケージのインポート: パッケージを java.lang パッケージの下にインポートする必要はありません。Java 開発環境のため、デフォルトは lang パッケージです。

3.1 注意事項

3.1.1 概要

コメントはコードの説明と説明です

3.1.2 分類

Java には 3 種類のコメントがあります。

  • 単一行コメント:
// 这是单行注释文字
  • 複数行のコメント:
/*
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/

知らせ:

複数行のコメントはネストできません。

  • ドキュメントのコメント (まだ使用されていません)
/**
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/

説明: 使用上のヒント

  • コードを説明したい場合はコメントを使用できます
  • コメントの内容が比較的小さく、1 行で記述できる場合は、1 行コメントを使用できます。
  • コメントの内容が比較的大きく、複数行にまたがって記述する必要がある場合は、複数行コメントを使用できます。

3.2 キーワード

3.2.1 概要

Java キーワードは、Java によって特定の意味が与えられる英単語です。コードにキーワードを記述した後、プログラムが実行されると、何をすべきかがわかります。

3.2.2 分類

Java キーワードは、プログラミング言語で特別な意味を持つ定義済みの単語であり、プログラムの構造、フロー、動作を制御するために使用されます。

知らせ

キーワードはたくさんあるので、注意深く覚える必要はありません。

  1. 修飾子キーワード: publicprotectedprivatestaticfinalabstract
  2. アクセス制御キーワード: publicprotectedprivatedefault(デフォルト)
  3. クラス、インターフェイス、およびパッケージのキーワード: classinterfaceenumpackageimportextendsimplements
  4. メソッドキーワード: voidreturnthissuper
  5. フロー制御キーワード: ifelseswitchcasedefaultwhiledoforbreakcontinuereturn
  6. 例外処理キーワード: trycatchfinallythrowthrows
  7. 論理キーワード: truefalsenull
  8. その他のキーワード: newinstanceofsynchronizedtransientvolatileassert

3.2.3 基本的な使用例とキーワードのデモンストレーション

  • ClassClass このキーワードはクラスの定義を示します
public class HelloWorld{
    
    
    
}

例証します:

  • 説明: クラスとは、クラスを定義することを意味します。

  • クラス名: HelloWorld

  • HelloWorld の後の中括弧は、このクラスのスコープを示します。

3.3 リテラル

3.3.1 概要

Java リテラルは、プログラム内で直接使用される定数値であり、さまざまなデータ型の固定値を表します。リテラルは、整数、浮動小数点数、文字、文字列などのデータ型の定数値であり、計算や変換を行わずにコード内に直接表示されます。

3.3.2 分類

  1. 整数リテラル: 整数値を表し、10 進数、8 進数 (0 で始まる)、および 16 進数 (0x または 0X で始まる) 表記を使用できます。例: 420120xFF
  2. 浮動小数点数リテラル: 通常の浮動小数点数と科学的表記法を含む浮動小数点値を表します。例: 3.142.0e-5
  3. 文字リテラル: 一重引用符で囲まれた単一の文字を表します。例: 'A''1''@'
  4. 文字列リテラル: 二重引用符で囲まれた文字列を表します。例: "Hello, World!""Java"
  5. ブール値リテラルtrue:との 2 つの値のみを持つブール値を表しますfalse
  6. null リテラル: null 参照を表し、オブジェクト参照が有効なオブジェクトを指していないことを示すために使用されます。
  7. エスケープ シーケンス: バックスラッシュで始まる一部の特殊文字シーケンスは、改行文字、タブ文字など\、直接入力できない文字を表すために使用されます。\n\t
  8. 配列リテラル: 中括弧で表され{}、配列の初期化に使用されます。例: {1, 2, 3}
  9. 列挙型定数: 列挙型の特定のオプションを表す列挙型の定数値。
  10. 文字エンコーディング リテラル\u: 4 つの 16 進数で始まり、その後に続く文字の Unicode エンコーディングを表します。例: は\u0041文字「A」を表します。

3.3.3 基本的な使用例

public class Demo {
    
    
    public static void main(String[] args) {
    
    
        System.out.println(10); // 输出一个整数
        System.out.println(5.5); // 输出一个小数
        System.out.println('a'); // 输出一个字符
        System.out.println(true); // 输出boolean值true
        System.out.println("欢迎来到黑马程序员"); // 输出字符串
    }
}

補足:見分け方スキル

  1. 小数点のない数値は整数型のリテラルです。
  2. 小数点があれば10 進型リテラルです
  3. 二重引用符で囲まれている限り、内容が何であっても、内容の有無に関係なく、文字列型リテラルです。
  4. 文字型リテラルは、内容に関係なく一重引用符で囲む必要がありますが、単一引用符は 1 つだけです。
  5. ブール値リテラルには、true と false の 2 つの値しかありません。
  6. 空の型のリテラルには値が 1 つだけあり、 null になります。

3.4 変数

3.4.1 概要

変数とは、プログラム内でデータを一時的に保存するための入れ物です。ただし、このコンテナに保存できる値は 1 つだけです。

3.4.2 フォーマット

数据类型 变量名 = 数据值;

例証します:

  • 10 を格納する場合、データ型は整数型である必要があります。

  • 10.0 を保存する場合は、データ型を 10 進数型として記述する必要があります。

補足:パラメータの説明

  • 変数名: 実際には、このコンテナの名前です。

  • データ値: 実際にコンテナに格納されているデータ

  • セミコロン:文章を書くときの句点と同じように、文の終わりを示します。

3.4.3 基本的なユースケース変数のデモンストレーション

public class VariableDemo2{
    
    
	public static void main(String[] args){
    
    
		//1.变量名不允许重复
		//int a = 10;
		//int a = 20;
		//System.out.println(a);
		
		//2.一条语句可以定义多个变量
		//了解。
		//int a = 10, b = 20, c = 20,d = 20;
		//System.out.println(a);//?
		//System.out.println(b);//?
		
		
		//3.变量在使用之前必须要赋值
		int a = 30;
		System.out.println(a);
	}
}

知らせ:

  • 変数名は重複できません
  • 1 つのステートメントで複数の変数を定義できます。ただし、この方法はコードの読み取りに影響するため、理解してください。
  • 変数には、使用する前に値を割り当てる必要があります。

3.5 データ型

3.5.1 概要

Java データ型は、変数または式が格納できるデータの型を定義するために使用される分類です。

3.5.2 分類

  • 基本的なデータ型
  • 参照データ型 (オブジェクト指向について詳しく学ぶ)

3.5.3 基本的なデータ型

  1. 整数型: byte:8 ビット、-128 ~ 127 の範囲、short:16 ビット、-32,768 ~ 32,767 の範囲、int:32 ビット、-2^31 ~ 2^31 - 1 の範囲、long:64 ビット、範囲は -2 ^63 から 2^63 - 1
  2. 浮動小数点型: float: 32 ビット、単精度浮動小数点数の表現に使用、double: 64 ビット、倍精度浮動小数点数の表現に使用
  3. 文字タイプ: char16 ビット、Unicode 文字の格納に使用されます。
  4. ブール型: boolean: 2 つの値のみを持つブール値を表すために使用されます:truefalse

知らせ:

  • バイト型の値の範囲:-128~127
  • int型のおおよその値の範囲:~21億以上~21億以上

補足:整数型と小数型の値の範囲の関係:

  • double > float > long > int > short > byte
  • Java では、整数のデフォルトは int 型で、浮動小数点数のデフォルトは double 型です。

コード例:

public class VariableDemo3{
    
    
    public static void main(String[] args){
    
    
        //1.定义byte类型的变量
        //数据类型 变量名 = 数据值;
        byte a = 10;
        System.out.println(a);

        //2.定义short类型的变量
        short b = 20;
        System.out.println(b);

        //3.定义int类型的变量
        int c = 30;
        System.out.println(c);

        //4.定义long类型的变量
        long d = 123456789123456789L;
        System.out.println(d);

        //5.定义float类型的变量
        float e = 10.1F;
        System.out.println(e);

        //6.定义double类型的变量
        double f = 20.3;
        System.out.println(f);

        //7.定义char类型的变量
        char g = 'a';
        System.out.println(g);

        //8.定义boolean类型的变量
        boolean h = true;
        System.out.println(h);

    }
}

知らせ:

  • 整数型の変数を定義したいが、どのデータ型を選択すればよいかわからない場合は、デフォルトで int が使用されます。
  • 10 進数タイプの変数を定義したいが、どのデータ型を選択すればよいかわからない場合は、デフォルトで double が使用されます。
  • Long 型変数を定義する場合は、データ値の後にL 接尾辞を追加する必要があります。(大文字、小文字どちらも使用可能ですが、大文字を推奨します。)
  • float 型変数を定義する場合は、データ値の後にF 接尾辞を追加する必要があります。(大文字、小文字どちらでも可)

3.5.4 参照データ型

  1. クラス: クラスはオブジェクトを作成するために使用されるテンプレートです。オブジェクトのプロパティ(メンバー変数)とメソッド(メンバーメソッド)を定義します。クラスをインスタンス化すると、そのクラスのオブジェクトが作成され、そのオブジェクトを使用してクラスのメソッドを呼び出します。
  2. インターフェイス: インターフェイスは一連のメソッド仕様を定義しますが、実際のメソッド本体はありません。クラスは 1 つ以上のインターフェイスを実装して、インターフェイスによって定義されたメソッドを取得し、これらのメソッドをクラスに実装できます。
  3. 配列: 配列は、同じ型の要素を格納するために使用されるデータ構造です。複数の要素をメモリ内に連続して格納するために使用される 1 次元配列または多次元配列にすることができます。
  4. Enum (Enum) : 列挙は、事前定義された定数のセットを表すために使用される特別なクラスです。列挙は、関連する値のグループを表すためによく使用されます。
  5. String : String は参照データ型ですが、基本的なデータ型のように操作できる特別なプロパティを持っています。文字列は実際には文字のシーケンスであり、文字列操作を処理するためのメソッドが多数あります。
  6. カスタム参照タイプ: 上記の組み込み参照データ タイプに加えて、開発者はカスタム クラスとインターフェイス、およびそのインスタンスを作成して、より複雑なデータ構造と関数を構築することもできます。

3.5.5 基本データ型と参照データ型の違い

  1. 基本データ型: 基本データ型は値によって渡され、Java 仮想マシン スタックにメモリ領域を割り当て、値自体を直接保存します。基本データ型の変数に値が割り当てられると、その変数の値は実際には別の変数にコピーされ、2 つの変数の間には関係がありません。
  2. 参照データ型: 参照データ型は参照によって渡され、Java 仮想マシン ヒープにメモリ領域を割り当て、オブジェクトの参照 (メモリ アドレス) を格納します。参照データ型の変数に値が割り当てられると、変数内の参照は実際には別の変数にコピーされ、両方の変数が同じオブジェクトを指します。

補充:

詳しくはナレッジガソリンスタンドをご覧ください基本数据类型和引用数据类型区别

コード例:

// 使用引用数据类型创建一个对象
String message = new String("Hello, World!");

// 创建一个数组
int[] numbers = new int[5];

// 使用自定义类创建对象
class Person {
    
    
    String name;
    int age;
}
Person person = new Person();
person.name = "Alice";
person.age = 30;

// 枚举类型
enum Day {
    
    
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.WEDNESDAY;

3.5.6 一般的なデータ型

  • 整数: int
  • 10 進数: (浮動小数点数) double

コード例:

public class VariableDemo{
    
    
	public static void main(String[] args){
    
    
		//定义一个整数类型的变量
		//数据类型 变量名 = 数据值;
		int a = 16;
		System.out.println(a);//16
		
		//定义一个小数类型的变量
		double b = 10.1;
		System.out.println(b);//10.1
	}
}

補充:

null を直接出力することはできません。出力する必要がある場合は、文字列の形式で出力する必要があります。

最も一般的に使用されるデータ型の選択:

  • 変数を定義するときは、実際の状況に応じてさまざまなタイプの変数を選択する必要があります。

    例:人の年齢の場合、バイト タイプを選択できます。

    例:地球の年齢の場合は、ロングタイプを選択できます

  • 整数型の範囲が不明な場合は、デフォルトでint 型が使用されます。

  • 10 進数型の範囲が不明な場合は、デフォルトでdouble 型が使用されます。

  • 文字型の変数を定義する場合はchar を使用します。

  • ブール型の変数を定義したい場合はboolean を使用します。

3.6 識別子

Java では、識別子は、変数、メソッド、クラス、インターフェイスなどプログラム内のさまざまな要素を識別するために使用される名前です。識別子は、一連の文字、数字、アンダースコア (_)、およびドル記号 ($) であり、文字、アンダースコア、またはドル記号で始まる必要があります。識別子はプログラミングでさまざまなエンティティに名前を付けるために使用され、プログラムを読みやすく、理解し、保守しやすくします。

3.6.1 必須要件

これは必ず行う必要があります。そうしないと、コードでエラーが報告されます。

  • 数字、文字、アンダースコア_、**ドル記号 $** で構成する必要があります。
  • 番号を次で始めることはできません
  • キーワードにはできません
  • 大文字と小文字を区別。

3.6.2 ソフトな提案

1. リトルキャメルケースの命名法

変数名とメソッド名に適用されます

  • 単語の場合は、name のようにすべて小文字です。

  • 複数の単語がある場合は、2 番目の単語から始めて最初の文字を大文字にします (例: firstName、maxAge)。

2. ビッグキャメルケースの命名法

クラス名に適用されます

  • 単語の場合は、最初の文字を大文字にします。例: デモ、テスト。

  • 複数の単語がある場合は、各単語の最初の文字を大文字にする必要があります。例: HelloWorld

3.6.3 Alibaba 命名仕様の詳細

  1. ピンインは使用しないようにしてください。ただし、国際的に受け入れられているピンインの中には、英語の単語とみなせるものもあります。

    正解: アリババ、杭州、南京

    错误:jiage、dazhe

  2. 変数、メソッド、クラスに名前を付けるときは、アンダースコアやドル記号を使用しないでください。

    エラー: _name

    正解:名前

3.7 権限修飾子

3.7.1 概要

Java には 4 種類のアクセス権があります。異なるアクセス権修飾子を使用すると、変更されたコンテンツには異なるアクセス権が与えられます。これまでに学習しました。次に、保護された修飾子の役割とデフォルトの修飾子の役割を学習しましょpublic private

  • public: パブリック、どこからでもアクセス可能。

  • protected: このクラス、このパッケージ、および他のパッケージのサブクラスがアクセスできます。

  • デフォルト (修飾子なし): このクラス、このパッケージにアクセス可能。

    注: デフォルトでは空白のままにし、何も書き込まないことになっていますが、これはデフォルトではありません。

  • private: プライベート、現在のクラスからアクセス可能。
    public > protected > 默认 > private

3.7.2 許可アクセス機能

権限の範囲

プライベート<デフォルト/空白のままにしてください<保護<パブリック

公共 保護された デフォルト プライベート
同じクラスに
同じパッケージ内のクラス
さまざまなパッケージのサブクラス
異なるパッケージ内の無関係なクラス

大衆が最大の権威を持っていることがわかります。プライベートは最も権限がありません。

コードを記述するとき、特別な考慮事項がない場合は、次のようなアクセス許可を使用することをお勧めします。

  • メンバー変数はprivate詳細を隠すために使用されます。
  • コンストラクター メソッドを使用すると public、オブジェクトの作成が容易になります。
  • メンバー メソッドは、publicメソッドの呼び出しを容易にするために使用されます。

補充:

権限修飾子がない場合、それがデフォルトの権限になります

3.7.3 パーミッションの使用規則

実際の開発では、一般的にプライベートとパブリックのみが使用されます

  • メンバー変数のプライベート
  • メソッドパブリック

知らせ:

メソッド内のコードが他のメソッドから共通のコードを抽出するものである場合、このメソッドも通常プライベートです。

3.8パック

3.8.1 概要

Java では、パッケージ (Package) はクラスとインターフェイスを編成する方法であり、関連するクラスとインターフェイスを論理的な編成を通じて名前空間に分類します。パッケージの主な目的は、名前の競合を回避し、より適切なコード管理と編成を提供することです。

パッケージは実際にはオペレーティング システム内のフォルダーです。パッケージは管理テクノロジを分類するために使用され、管理と保守を容易にするために、異なるテクノロジ カテゴリが異なるパッケージの下に配置されます

IDEA プロジェクトでは、パッケージの構築操作は次のとおりです。

画像-20230813112207023

パッケージ名の命名規則:

路径名.路径名.xxx.xxx
// 例如:com.itheima.oa
  • 通常、パッケージ名は会社のドメイン名を逆から綴ったものです。たとえば、ダークホースが www.iheima.com の場合、パッケージ名は com.iheima.technical name として定義できます。
  • パッケージ名は「.」で接続する必要があります。
  • パッケージ名の各パス名は有効な識別子である必要があり、Java キーワードにすることはできません。

3.8.2 ガイドパッケージ

ガイド パッケージが必要になるのはどのような場合ですか?

状況 1: Java で提供される **非コア パッケージ (java.lang)** 内のクラスを使用する場合

状況 2:自分で作成した他のパッケージのクラスを使用する場合

インポートパッケージが不要になるのはどのような場合ですか?

状況 1: Java コア パッケージ ( java.lang )内のクラスを使用する場合

状況2:自分で作成した同じパッケージ内のクラスを使用する場合

デモ 1 とデモ 2 に学生がいると仮定します。

コード例:

//使用全类名的形式即可。
//全类名:包名 + 类名
//拷贝全类名的快捷键:选中类名crtl + shift + alt + c 或者用鼠标点copy,再点击copy Reference
com.itheima.homework.demo1.Student s1 = new com.itheima.homework.demo1.Student();
com.itheima.homework.demo2.Student s2 = new com.itheima.homework.demo2.Student();

4.IDEA開発ツール

メモの要約:

  1. 概要: Java プログラム開発に現在使用されている最良のツール
  2. 階層構造の紹介: プロジェクト - モジュール - パッケージ - クラス
  3. クラスの操作
    • 新しいクラスファイルを作成する
    • クラスファイルを削除する
    • クラスファイルを変更する
  4. モジュールの動作
    • 新しいモジュール
    • モジュールの削除
    • モジュールの変更
    • インポートモジュール
  5. プロジェクト運営
    • プロジェクトを閉じる
    • プロジェクトを開く
    • プロジェクトを変更する
    • 新しいプロジェクト

4.1 概要

IntelliJ IDEA の正式名である IDEA は、Java 言語開発のための統合環境であり、現在 Java プログラム開発に使用されている最良のツールとして業界で認められています。

補充:

コードの作成、コンパイル、実行、デバッグなどの機能を統合した開発ツール

4.2 インストール

例証します:

良いことを学ぶ、参考リンク: IDEA2023. 継続的に更新することを学ぶ - Souyunku 技術チーム (souyunku.com)

ステップ 1: ダウンロード

例証します:

ダウンロードリンクは: https://www.jetbrains.com/idea

画像-20230809160833406

ステップ 2: インストール

1. インストールインターフェイスに入ります

画像-20230227141623703

2. インストールディレクトリを変更する

画像-20230227141634020

例証します:

Cドライブには置かないことをお勧めします

3. 追加オプション

画像-20230227141649386

例証します:

64ビットランチャーを確認してください。デスクトップに新しい 64 ビットのショートカットを作成することを示します。

4.取り付け

画像-20230227141701750

5.スタート

ここに画像の説明を挿入します

例証します:

インポートしない 2 番目の設定を選択し、デフォルト設定のままにして、「OK」をクリックします

4.3 ディレクトリ階層

メモの概要

  • 階層関係: プロジェクト - モジュール - パッケージ - クラス

  • 含まれる数量:

  • プロジェクト内に複数のモジュールを作成可能

  • モジュール内に複数のパッケージを作成できます

  • パッケージ内に複数のクラスを作成できる

3.4.1 概要

画像-20230227141855655

補足:構造分類

  • プロジェクト(プロジェクト、プロジェクト)
  • モジュール
  • パッケージ
  • クラス

4.3.2 プロジェクト

Taobao、JD.com、Dark Horse のプログラマ Web サイトはすべてプロジェクトに属しており、IDEA はプロジェクトです。

4.3.2 モジュール

プロジェクトには複数のモジュールを保存でき、プロジェクト内の異なるモジュールは異なるビジネス関数コードを保存できます。Dark Horse Programmers の公式 Web サイトには、少なくとも次のモジュールが含まれています。

  • フォーラムモジュール
  • 登録および相談モジュール

4.3.3 パッケージ

1 つのモジュールには多くのビジネスが含まれており、Black Horse Programmer 公式 Web サイトのフォーラム モジュールを例に挙げると、少なくとも次のさまざまなビジネスが含まれています。

  • 役職
  • コメント

これらのビジネスをより明確に区別するために、パッケージを使用してこれらの異なるビジネスを管理します。

4.3.4 クラス

4.4 一般的な構成

1.フォントを変更する

画像-20230227142334713

例証します:

フォントとして Consolas を選択します。このフォントは柔らかいです。

カテゴリ 4.5 の関連操作

クラス関連の操作

  • 新しいクラスファイルを作成する
  • クラスファイルを削除する
  • クラスファイルを変更する

4.6 モジュール関連の操作

モジュール関連の操作

  • 新しいモジュール
  • モジュールの削除
  • モジュールの変更
  • インポートモジュール

4.7 プロジェクト関連業務

プロジェクト関連業務

  • プロジェクトを閉じる
  • プロジェクトを開く
  • プロジェクトを変更する
  • 新しいプロジェクト

プロジェクトを変更する

「ファイル」をクリックし、「プロジェクト構造」を選択します。

画像-20230227143125944

このインターフェイスでは、デフォルトはモジュールです。

そこで、まず「プロジェクト」をクリックします。

右側のページで、新しいプロジェクト名を入力します

JDK バージョンとコンパイル済みバージョンを JDK14 に変更します。

もう一度「OK」をクリックします

画像-20230227143221007

  • この際、プロジェクト名が変更されていることが判明した。

画像-20230809165947767

  • ただし、ローカルフォルダーの名前は変更されていません

画像-20230809170012544

  • まず現在のプロジェクトを閉じる必要があります

画像-20230809170022657

  • リストから項目を削除するには、項目の横にある×印をクリックします

画像-20230809170033150

  • ローカル ハードディスクに移動して、フォルダーの名前を手動で変更します。
  • 「開く」または「インポート」をクリックしてプロジェクトを再度開きます

画像-20230809170043305

  • 変更された項目を選択します

    「OK」をクリックします

画像-20230809170052181

  • この時点で、プロジェクト名とローカル ハードディスク フォルダーの名前が変更されていることがわかります。

画像-20230809170059554

4.8 プラグインの管理

参考リンク:

IntelliJ Idea は、一般的に使用される 12 個のプラグイン (開発効率を向上させるため) を使用し、優れたテーマを備えています。 プラグイン_アイデア プラグイン_Java テクノロジー クライマーのブログ - CSDN ブログ

IDEA_idea plug-in_Xinyuan Yima のブログ - CSDN ブログによる、推奨する価値のある 20 の優れたプラグイン

5. 演算子と式

メモの要約:

  1. 概要:

    1. Java 演算子は、 1 つ以上のオペランドの演算を実行するために使用される特殊な記号です。

    2. 式は、変数、定数、演算子、メソッド呼び出しで構成される文法的なステートメントです。

    3. 演算子と式の違い:

      • 演算子は、定数または変数を操作するシンボルです。

      • 式はJava 構文に準拠したです。

  2. 算術演算子:

    • 定義: 算術演算子は、基本的な数学演算を実行するために使用されます。

    • 例えば:

      +-*/ 
      
  3. インクリメント演算子とデクリメント演算子:

    • 定義: インクリメントおよびデクリメント演算子は、変数の値に 1 を加算または減算するために使用される特別な算術演算です

    • 例えば:

       ++--
      
  4. 代入演算子:

    • 定義: 代入演算子は、 Java で変数に値を代入するために使用される演算子です。

    • 例えば:

      b = 20;
      
  5. 拡張代入演算子:

    • 定義: スプレッド代入演算子は、算術演算子と代入演算子を組み合わせた演算子です。

    • 例えば:

       "+=""-=""*=""/=""%="
      
    • 機能: 拡張代入演算子には、隠れ層での強制変換も含まれています。

  6. 関係演算子:

    • 意味: 関係演算子は、2 つの値の大小関係を比較するために使用されます。

    • 例えば:

      a > b
      
    • 注: ===代入演算子と関係演算子を区別してください。

  7. 論理演算子:

    • 意味: 複数のブール式を結合して新しいブール式を生成するために使用されます。

    • 例えば:

      true & truefalse & false
      
    • 注: 論理演算子には次の機能もあります。

      !、&|^ 
      
  8. 短絡論理演算子:

    • 意味: 式全体の結果が決定できる、残りの式の計算を続行しないでください。

    • 例えば:

      用户名正确  && 密码正确
      
  9. 三項演算子:

    • 意味: 条件演算子として知られ、Java で3 つのオペランドを持つ唯一の演算子です。

    • フォーマット:

      关系表达式 ? 表达式1 :表达式2
    • 例えば:

      a > b ? a : b
      
  10. 演算子の優先順位:括弧が最初()

  11. 暗黙的な変換と強制的な変換

    1. 暗黙的な変換:自動昇格

      • 値の関係: byte < short < int < long < float < double
      • 注意:float型はlong型に比べて記憶容量は小さいですが、表現範囲はlong型に比べて大きくなります。
    2. 出演者:強制昇格

      • フォーマット:

        目标数据类型 变量名 = (目标数据类型)被强转的数据
        
  12. 文字列 + 演算(特殊な場合):

    • 意味: + 演算に文字が現れると、その文字をコンピュータの内蔵 ASCII コード テーブルに取り込み、対応する数値を検索し、計算します。

    • 例えば:

      char c = 'a';
      int result = c + 0;
      System.out.println(result);//9
      

5.0 概要

5.0.1 定義

Java 演算子は、1 つ以上のオペランドの演算を実行するために使用される特殊なシンボルです。式は、変数、定数、演算子、メソッド呼び出しで構成される文法的なステートメントです。

5.0.2 演算子

定義: 定数または変数を操作するシンボルです。

例えば:

 +  -  *  / 

5.0.3 式

定義: 演算子を使用して定数または変数を接続する、Java 構文に準拠した式は式です。

例えば:

a + b 这个整体就是表达式。

例証します:

+ は算術演算子の一種であるため、この式は算術式とも呼ばれます。

5.1 算術演算子

5.1.1 概要

5.1.1.1定義

算術演算子は、加算、減算、乗算、除算、モジュロ (剰余) 演算などの基本的な数学演算を実行するために使用されます。Java では、算術演算子には、プラス記号 (+)、マイナス記号 (-)、乗算記号 (*)、除算記号 (/)、および剰余演算子 (%) が含まれます。これらの演算子は、int、long、float、double などの数値型変数を操作するために使用できます。

5.1.1.2 分類

+ - * / %

5.1.1.3 機能

+ - * :跟小学数学中一模一样没有任何区别.

5.1.2 基本的な使用例 - オペレーターによるデモンストレーション

/番号

/1.整数相除结果只能得到整除,如果结果想要是小数,必须要有小数参数。
2.小数直接参与运算,得到的结果有可能是不精确的。
案例:
System.out.println( 10 / 3);//3
System.out.println(10.0 / 3);//3.3333333333333335

%番号

%:取模、取余。
   他做的也是除法运算,只不过获取的是余数而已。
案例:
System.out.println(10 % 2);//0
System.out.println(10 % 3);//1
应用场景:
//可以利用取模来判断一个数是奇数还是偶数
System.out.println(15 % 2);//1  奇数

5.1.3 大文字と小文字の値の分割

デモンストレーション: キーボードで 3 桁の数値を入力し、それを単位、十、百の位に分割して、コンソールに出力します。

//1.键盘录入一个三位数
//导包 --- 创建对象 --- 接收数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数");
int number = sc.nextInt();//123

//2.获取这个三位数的个位、十位、百位并打印出来
//公式:
//针对于任意的一个数而言
//个位: 数字 % 10
int ones = number % 10;
//十位: 数字 / 10 % 10
int tens = number / 10 % 10;
//百位: 数字 / 100 % 10
int hundreds = number / 100  % 10;

//输出结果
System.out.println(ones);
System.out.println(tens);
System.out.println(hundreds);

詳細:

  • 式: 任意の数値のすべての桁を取得します。

    1. 単位の位: 数値 % 10

    2. 10の位:数値/10%10

    3. 百の位:数値 / 100 % 10

    4. 千: 数値 / 1000 % 10

    5. ……

5.2 インクリメント演算子とデクリメント演算子

5.2.1 概要

5.2.1.1定義

インクリメントおよびデクリメント演算子は、変数に 1 を加算または減算するために使用される特別な算術演算子です。Java では、インクリメント演算子とデクリメント演算子には、プレフィックス形式とサフィックス形式の 2 つの形式があります。

5.2.1.2 分類

++  自增运算符

例証します:

++: 変数の値に 1 を加算するだけです

--  自减运算符

例証します:

--: 変数の値を -1 に変更するだけです

5.2.1.3 機能

  • これを変数の前に置くことを first++ と呼びます。例: ++a
  • これを変数の後に置きます。これを post++ と呼びます。例: a++

詳細:

++最初でも++最後でも構いません。一行に分けて書いても、演算結果は全く同じになります。

5.2.2 基本的な使用例 - 自己インクリメントおよび自己デクリメントのデモンストレーション

//++
int a = 10;
a++;//就是让变量a里面的值 + 1
System.out.println(a);//11
++a;//就是让变量a里面的值 + 1
System.out.println(a);//12

5.3 代入演算子

5.3.1 概要

代入演算子とは、Javaで変数に値を代入するために使用される演算子です。Java では、代入演算子は等号 (=) で表され、左側に変数名、右側に変数に割り当てられる値が表示されます。

5.3.2 基本的なユースケース割り当て演算子のデモンストレーション

public class OperatorDemo6 {
    
    
    public static void main(String[] args) {
    
    
        //1.最为简单的赋值运算符用法
        int a = 10;//就是把10赋值给变量a
        System.out.println(a);

        //2.如果等号右边需要进行计算。
        int b = 20;
        int c = a + b;//先计算等号右边的,把计算的结果赋值给左边的变量
        System.out.println(c);

        //3.特殊的用法
        a = a + 10;//先计算等号右边的,把计算的结果赋值给左边的变量
        System.out.println(a);//20
    }
}

5.4 拡張代入演算子

4.4.1 概要

4.4.1.1

拡張代入演算子とは、元の代入演算子に、 、 などの他の算術演算子を追加することを指し+=ます-=*=

5.4.1.2 分類

+=、-=、*=、/=、%=

4.5.1.3 機能

左側と右側で演算を実行し、右側には影響を与えずに最終結果を左側に割り当てることです。

5.4.2 基本的な使用例 - スプレッドオペレーターのデモンストレーション

public class OperatorDemo7 {
    
    
    public static void main(String[] args) {
    
    
        //扩展赋值运算符
        int a = 10;
        int b = 20;
        a += b;//把左边和右边相加,再把最终的结果赋值给左边,对右边没有任何影响
        // 相当于 a = a + b;
        System.out.println(a);//30
        System.out.println(b);//20
    }
}

知らせ:

  • 拡張代入演算子には暗黙的なキャストも含まれています

  • 例えば:

    public class OperatorDemo8 {
           
           
        public static void main(String[] args) {
           
           
            byte a = 10;
            byte b = 20;
            //a += b;
            a = (byte)(a + b);
            System.out.println(a);//30
        }
    }
    

    注: += を例として取り上げます。a += b ;実際には a = (byte)(a + b) と同等です。

5.5 関係演算子

5.5.1 定義

比較演算子とも呼ばれますが、実際には左辺と右辺に基づいて判断するだけです。

5.5.2 分類

シンボル 説明する
== 左辺と右辺が等しいかどうかを判断するもので、真であれば真、そうでなければ偽となります。
!= 左辺と右辺が等しくないかどうかを判断し、真であれば真、真でなければ偽とします。
> 左辺が右辺より大きいかどうかを判断するもので、真であれば真、そうでなければ偽となります。
>= 左辺が右辺以上かどうかを判定し、真であれば真、真でなければ偽
< 左辺が右辺より小さいかどうかを判断するもので、真であれば真、そうでなければ偽となります。
<= 左辺が右辺以下であるかどうかを判断するもので、真であれば真、真でなければ偽となります。

詳細:

  • 関係演算子の最終結果はブール型である必要があります。真か偽のどちらか
  • == を書くときは、絶対に = を書かないでください。

5.6 論理演算子

5.6.1 概要

5.6.1.1定義

論理演算子は、複数の条件式を接続するために使用される演算子であり、複雑な条件式を構築するために使用されます。

5.6.1.2 & と | の使用

&: 論理積 (および)

両方が真であれば結果は真、一方が偽であれば結果は偽となります。

|: 論理和 (または)

両方が偽であれば結果は偽、どちらか一方が真であれば結果は真となります。

5.6.2 基本的な使用例 - 論理演算子のデモ

// &  //两边都是真,结果才是真。
System.out.println(true & true);//true
System.out.println(false & false);//false
System.out.println(true & false);//false
System.out.println(false & true);//false

System.out.println("===================================");

// | 或  //两边都是假,结果才是假,如果有一个为真,那么结果就是真。
System.out.println(true | true);//true
System.out.println(false | false);//false
System.out.println(true | false);//true
System.out.println(false | true);//true

5.6.3 アプリケーションシナリオ

5.6.3.1 シナリオの例

定型シーンに応じて、「&」または「|」を選択します。

  • ユーザーログイン。

    ユーザー名とパスワードが正しく入力されています

    ユーザー名とパスワードが同時に正しい場合にのみ、どちらかが失敗した場合でも正常にログインできるからです。

    スキル:

    左と右の両方の条件を同時に満たす必要がある場合、 と を使用できます。

  • 義母が婿を選ぶ

    義母:お婿さん、家を買うか車を買うかどっちでもいいよ。そうすれば、小さなパッド入りのジャケットを着ることができます。

    家を買う | 車を買う

    2つの条件のうちどちらかが満たされていれば、中綿ジャケットを着用することができます。

    スキル:

    2 つの条件のうち 1 つだけが満たされる場合は、 または

5.6.3.2 ^ (XOR) の使用

将来的にはあまり使われないので、理解しておいてください。

計算規則: 両辺が同じ場合、結果は偽、両辺が異なる場合、結果は真

コード例:

//^   //左右不相同,结果才是true,左右相同结果就是false
System.out.println(true ^ true);//false
System.out.println(false ^ false);//false
System.out.println(true ^ false);//true
System.out.println(false ^ true);//true

5.6.3.3! (否定) の使用

はい、否定、否定とも呼ばれます。

計算規則: false の否定は true、true の否定は false

注意:否定に使用できるのは 1 つだけです。

コード例:

System.out.println(!false);//true
System.out.println(!true);//false
System.out.println(!!false);//报错

詳細:

注: 反転は最大でも 1 つだけ使用されます

5.7 短絡論理演算子

5.7.1 概要

5.7.1.1定義

短絡論理演算子とは、論理演算において、左側の式の値に基づいて論理式全体の結果が得られる場合、右側の式は計算されなくなることを意味します。

5.7.1.2 分類

  • &&

    演算結果は & とまったく同じですが、短絡効果があります。

  • ||

    演算の結果は | とまったく同じになります。短絡効果があるだけです。

論理コア:

左辺で式全体の結果を決定できない場合は、右辺が実行されます。

左側が式全体の結果を決定できる場合、右側は実行されません。これにより、コードの動作効率が向上します。

5.7.2 アプリケーションシナリオ

5.7.2.1 シナリオ

1. ユーザーログインの場合

ユーザー名とパスワードが正しい

& を使用すると、ユーザー名が正しいかどうかに関係なく、パスワードが検証されます。

考える:

ユーザー名が正しく入力されていれば、ビジネスロジックに沿ってパスワードが正しいかどうかを判断します。

しかし、ユーザー名が間違って入力された場合でも、今でもパスワードを比較する必要があるのでしょうか? もうない。

&を使用すると、状況に関係なく左右が実行されます。

ユーザー名は正しい&&パスワードは正しいです

ユーザー名が正しく入力されている場合は、パスワードが正しく入力されているかどうかが確認されます。

ユーザー名が正しく入力されない場合、パスワードは検証されず、最終結果は false になります。これにより、プログラムの動作効率が向上します。

2. 義母が婿を選ぶ

家を所有する | 車を所有する

まずは家があるかどうかを確認し、見つかったら車があるかどうかを確認します。

考える:

私たちはすでに家を持っているのに、なぜ車を見る必要があるのでしょうか?不要。

家がある || 車がある

まず、部屋があるかどうかを確認します。部屋がある場合、右側は実行されません。最終結果はそのまま true になります。

家がない場合は、右側に車があるかどうかを確認します。

5.7.2.2 概要

&& と &、|| と | の結果はまったく同じです。

ただし、論理演算子を短絡すると、プログラムの効率が向上します。

5.7.2.3 推奨事項

最も一般的に使用される: && || !

5.8 三項演算子

5.8.1 概要

5.8.1.1定義

三項式または疑問符コロン式。

5.8.1.2 フォーマット

関係式?式 1:式 2;

詳細:

  • 関係式を評価します。
  • 関係式が true と評価されると、式 1 が実行されます。
  • 関係式が false と評価された場合、式 2 が実行されます。

知らせ:

三項演算子の最終結果は、変数に代入するか直接出力して使用する必要があります。

5.8.2 基本的な使用例 - 三項演算子のデモ

public class OperatorDemo12 {
    
    
    public static void main(String[] args) {
    
    
        //需求:求两个数的较大值
        int a = 10;
        int b = 20;

        //格式:关系表达式 ? 表达式1 : 表达式2 ;
        //注意点:
        //三元运算符的最终结果一定要被使用。
        //要么赋值给一个变量,要么直接输出。
       int max =  a > b ? a : b ;
        System.out.println(max);


        System.out.println(a > b ? a : b);
    }
}

5.9 演算子の優先順位

Java には多数の演算子が関与しており、各演算子には独自の優先順位があります。ただし、これらの優先順位にはメモリは必要ありません。知っておくべきことは 1 つだけです。括弧はすべての括弧よりも優先されるということです。

5.10暗黙的な変換

5.10.1 定義

Java では、暗黙的な変換とは、値の範囲が小さいデータまたは変数を、値の範囲が大きい別の変数に代入することです。現時点では、追加のコードを作成して個別に実装する必要はなく、プログラムが自動的に実装します。自動型プロモーションとも呼ばれます。言い換えれば、狭い範囲のデータ型を広い範囲のデータ型に与えることも、直接に与えることもできます。

5.10.2 プロモーションルール

  • 小さい値の範囲は大きい値の範囲で計算され、小さい値から大きい値に昇格してから計算が実行されます。
  • byte、short、char の 3 種類のデータは、操作が実行される前に直接 int にプロモートされます。

5.10.3 値の範囲の関係

byte < short < int < long < float < double

5.11 力の変換

5.11.1 概念

5.11.1.1定義

値の範囲が大きいデータまたは変数を、値の範囲が小さい別の変数に代入する場合。直接操作はできません。

5.11.1.2 フォーマット

ターゲット データ型変数名 = (ターゲット データ型) 強制するデータ;

5.11.2 基本的な使用例 - 軽量変換デモ

public class OperatorDemo2 {
    
    
    public static void main(String[] args) {
    
    
        double a = 12.3;
        int b = (int) a;
        System.out.println(b);//12
    }
}

注意点:

強制的に変換するとデータエラーが発生する可能性があります。(データの精度は失われます)

+ 5.12でのキャラクターの操作

5.12.1 概念

+ 演算に文字が現れると、その文字をコンピュータの内蔵 ASCII コード テーブルに取り込んで対応する数値を検索し、計算を実行します。

5.12.2 基本的な使用例 - キャラクター + デモ

char c = 'a';
int result = c + 0;
System.out.println(result);//97

例証します:

  • ASCII コード表では次のようになります。

    1. 「あ」-----97

    2. 「あ」-----65

5.13 ビットシフト演算子

Java のビット シフト演算子は、バイナリ ビットを操作する演算子であり、整数型データに対してビット シフト演算を実行できます。Java には、左シフト (<<)、右シフト (>>)、および符号なし右シフト (>>>) という 3 つのビット シフト演算子が用意されています。

  1. 左シフト (<<): 数値のバイナリ表現を指定された桁数だけ左にシフトし、右側をゼロで埋めます左シフト演算は、元の数値に 2 の累乗を乗算するものと考えることができます。たとえば、整数 a の場合、a << b は、a のバイナリ表現を左に b 桁シフトすることを意味します。
  2. 右シフト (>>): 数値の 2 進表現を指定された桁数だけ右に移動し、最上位ビットの符号ビットに従って埋めます。右シフト演算は、元の数値を 2 の累乗で割って四捨五入することとみなすことができます。たとえば、整数 a の場合、a >> b は、a のバイナリ表現を右に b 桁シフトすることを意味します。
  3. 符号なし右シフト (>>>): 数値のバイナリ表現を指定されたビット数だけ右にシフトし、最上位ビットの符号ビットに関係なくゼロで埋めます。符号なし右シフト演算は、符号ビットを通常のビットとして扱うため、符号なし数値のビット シフト演算に適しています。

これらのビット シフト演算子は、整数の 2 進ビットを処理する場合に非常に便利で、ビット演算、ビット フラグの設定とクリア、および特定のアルゴリズムの最適化によく使用されます。ビット シフト演算子は整数型 (int、long など) でのみ機能し、浮動小数点型では機能しないことに注意してください。

6. 制御ステートメント

メモの要約:

  1. フロー制御ステートメント

    1. シーケンシャル構造:

      • 意味:書かれた順序に従って順次実行される構造。
    2. 判断と選択の構造

      • 意味:異なる条件に基づいて異なるコードブロックを選択して実行する構造

      • 例えば:

        ifswitch
        
    3. ループ構造

      • 意味:特定のコードを繰り返し実行する構造

      • 例えば:

        whiledowhilefor
        
      • ループの違い: 1. for ループと while ループは、最初に判断してから実行します。2.do…while が最初に実行されてから判定されます。

  2. 条件制御文

    • 意味:特定の条件に基づいてコードのブロックを実行またはスキップするために使用されるプログラム制御構造です。

    • 例えば:

      breakcontinue
      
    • : 条件付き制御ステートメントは、非ループ構造では使用できません。

6.1 概要

6.1.1 定義

Java 制御ステートメントは、プログラム フローの実行を制御するために使用されるステートメントであり、条件やループに基づいてプログラムの実行順序を変更できます。制御ステートメントは、さまざまな条件付きロジックやループ構造を実装して、さまざまなタスクや機能を実現するのに役立ちます。

6.1.2 分類

Java 制御ステートメントは、プロセス制御ステートメント条件制御ステートメントに分かれています。

6.1 プロセス制御ステートメント

6.1.1 概要

6.1.1.1定義

プログラムの実行中、各ステートメントの実行順序はプログラムの結果に直接影響します。したがって、各ステートメントの実行フローを把握する必要があります。さらに、多くの場合、必要な機能を実現するためにステートメントの実行順序を制御する必要があります。

6.1.1.2 分類

  • シーケンシャル構造

  • 判定・選択構造(if、switch)

  • ループ構造 (for、while、do…while)

6.1.1 シーケンシャル構造

6.1.1.1定義

シーケンシャル構造は、プログラムにおける最も単純かつ基本的なフロー制御です。特定の文法構造はありません。コードの順序に従って順番に実行されます。プログラム内のほとんどのコードはこの方法で実行されます。

6.1.1.2 実行フローチャート

1545615769372

6.1.2 判定構造 – f ステートメント

  • if文の形式1
格式:
if (关系表达式) {
    
    
    语句体;	
}

実装プロセス:

①まず関係式の値を計算します

②関係式の値が真の場合、文本体を実行

③ 関係式の値が false の場合、文本体は実行されません。

④以下のステートメント内容を継続して実行します。

1545616039363

例:

public class IfDemo {
    
    
	public static void main(String[] args) {
    
    
		System.out.println("开始");	
		//定义两个变量
		int a = 10;
		int b = 20;	
		//需求:判断a和b的值是否相等,如果相等,就在控制台输出:a等于b
		if(a == b) {
    
    
			System.out.println("a等于b");
		}		
		//需求:判断a和c的值是否相等,如果相等,就在控制台输出:a等于c
		int c = 10;
		if(a == c) {
    
    
			System.out.println("a等于c");
		}		
		System.out.println("结束");
	}
}
  • f ステートメントの形式 2
格式:
if (关系表达式) {
    
    
    语句体1;	
} else {
    
    
    语句体2;	
}

実装プロセス:

①まず関係式の値を計算します

②関係式の値が真の場合、文本体1を実行

③関係式の値が偽の場合、文本体2を実行

④以下のステートメント内容を継続して実行します。

1545616221283

例:

public class IfDemo02 {
    
    
	public static void main(String[] args) {
    
    
		System.out.println("开始");		
		//定义两个变量
		int a = 10;
		int b = 20;
		//需求:判断a是否大于b,如果是,在控制台输出:a的值大于b,否则,在控制台输出:a的值不大于b
		if(a > b) {
    
    
			System.out.println("a的值大于b");
		} else {
    
    
			System.out.println("a的值不大于b");
		}		
		System.out.println("结束");
	}
}

if文の形式3

格式:
if (关系表达式1) {
    
    
    语句体1;	
} else if (关系表达式2) {
    
    
    语句体2;	
}else {
    
    
    语句体n+1;
}

実装プロセス:

①まず関係式1の値を計算します。

②値が true の場合は文本体 1 を実行、値が false の場合は関係式 2 の値を計算します。

③値が true の場合は文本体 2 を実行、値が false の場合は関係式 3 の値を計算します。

④…

⑤どの関係式も真でない場合は、文本体n+1を実行します。

1545616667104

6.1.3 選択構造 – switch ステートメント

フォーマット

switch (表达式) {
    
    
	case 1:
		语句体1;
		break;
	case 2:
		语句体2;
		break;
	...
	default:
		语句体n+1;
		break;
}

実装プロセス:

  • まず式の値を計算します

  • 次に、ケースと順番に比較し、一致する値があれば、対応するステートメントを実行し、実行途中でブレークに遭遇すると終了します。

  • 最後に、すべてのケースが式の値と一致しない場合、デフォルトのステートメント本体が実行され、プログラムは終了します。

  • デフォルトの位置と省略

    デフォルトはどこにでも配置することも、省略することもできます

  • ケース貫通

    ブレークを書かないとケース貫通の原因となります

  • JDK12のスイッチの新機能

int number = 10;
switch (number) {
    
    
    case 1 -> System.out.println("一");
    case 2 -> System.out.println("二");
    case 3 -> System.out.println("三");
    default -> System.out.println("其他");
}
  • スイッチの 3 番目の形式の使用シナリオと

範囲を判断する必要がある場合は、if の 3 番目の形式を使用します。

限られた量のデータをリストし、そのうちの 1 つを選択して実行する場合、switch ステートメントを使用します。

例えば:

Xiao Mingのテストのスコアはswitchだと100件書く必要があり面倒なのでifを使うと簡単です。

曜日、月の場合、カスタマーサービスコールで0〜9の機能選択がスイッチを使用できます

6.1.4 ループ構造

6.1.4.1forループ構造(マスター)

ループ文は、ループ条件が成立した場合に、コードの特定の部分を繰り返し実行することができます。この繰り返し実行されるコードをループ本体文と呼びます。このループ本体が繰り返し実行される場合、適切なタイミングでループ判定条件を変更する必要があります。 . が false の場合はループが終了しますが、それ以外の場合はループが継続して実行され、無限ループが形成されます。

for ループの形式:

for (初始化语句;条件判断语句;条件控制语句) {
    
    
	循环体语句;
}

形式の説明:

  • 初期化ステートメント: ループ開始時の初期状態を示すために使用され、簡単に言うとループ開始時の状態を示します。
  • 条件判定文:ループを繰り返し実行する際の条件を表現するもので、簡単に言うとループを継続して実行できるかどうかを判定するものです。
  • ループ本体文:ループの繰り返し実行内容を表現するもので、簡単に言うとループが繰り返し実行する内容です。
  • 条件制御文:ループ実行時の各変更内容を表現するもので、簡単に言うとループを実行できるかどうかを制御します。

実装プロセス:

①初期化文の実行

②条件判定文を実行し、結果が真か偽かを確認する

falseの場合、ループは終了します

trueの場合、実行を続行します

③ループ本体文を実行する

④条件制御文の実行

⑤戻る ②進む

for ループの作成スキル:

  • ループの開始条件を決定する
  • ループの終了条件を決定する
  • ループで繰り返し実行するコードを決定する

コード例:

//1.确定循环的开始条件
//2.确定循环的结束条件
//3.确定要重复执行的代码

//需求:打印5次HelloWorld
//开始条件:1
//结束条件:5
//重复代码:打印语句

for (int i = 1; i <= 5; i++) {
    
    
    System.out.println("HelloWorld");
}

6.1.4.2while ループ

フォーマット:

初始化语句;
while(条件判断语句){
    
    
	循环体;
	条件控制语句;
}

6.1.4.3do…while ループ

この知識ポイントを理解するだけで

フォーマット:

初始化语句;
do{
    
    
    循环体;
    条件控制语句;
}while(条件判断语句);

特徴:

最初に実行し、後で判断します。

6.1.4.4 3 つの形式の違い

for ループと while ループは最初に判断されてから実行されます。

do...while が最初に実行されてから判断されます。

ループの数またはループ範囲がわかっている場合は、for ループを使用します。

ループの回数やループの範囲は分からないが、ループの終了条件は分かっている場合は、while ループを使用します。

6.1.4.4 無限ループ

コンセプト:

無限ループとも呼ばれます。そのサイクルが止まることはありません。

フォーマットの場合:

for(;;){
    
    
    System.out.println("循环执行一直在打印内容");
}

説明する:

初期化ステートメントは空白のままにすることができ、ループの前に制御変数が定義されていないことを示します。

条件判定文は空白でも構いませんが、書かれていない場合はデフォルトでtrueとなりループが継続します。

条件付き制御ステートメントは空白のままにすることができます。これは、各ループ本体が実行された後に制御変数が変更されないことを意味します。

フォーマットしながら:

while(true){
    
    
    System.out.println("循环执行一直在打印内容");
}

説明する:

括弧は省略できず、true を記述する必要があります。そうしないとコードでエラーが報告されます。

do…while フォーマット:

do{
    
    
    System.out.println("循环执行一直在打印内容");
}while(true);

説明する:

括弧は省略できず、true を記述する必要があります。そうしないとコードでエラーが報告されます。

無限ループに関する注意事項:

  • 最も一般的に使用される形式: while
  • 無限ループは実行されないため、他のコードを無限ループの下に記述することはできません。

6.2 条件付き制御文

  • 壊す
  • 続く

6.2.1休憩

単独では存在できません。スイッチやループで終了や飛び出しを示すために使用できます。

コード例:

//1.吃1~5号包子
for (int i = 1; i <= 5; i++) {
    
    
    System.out.println("在吃第" + i + "个包子");
    //2.吃完第三个的时候就不吃了
    if(i == 3){
    
    
        break;//结束整个循环。
    }
}

6.2.2続行

単独では存在できません。サイクル内でのみ存在できます。

の意味: このサイクルをスキップし、次のサイクルの実行を続行します。

コード例:

//1.吃1~5号包子
for (int i = 1; i <= 5; i++) {
    
    
    //2.第3个包子有虫子就跳过,继续吃下面的包子
    if(i == 3){
    
    
        //跳过本次循环(本次循环中,下面的代码就不执行了),继续执行下次循环。
        continue;
    }
    System.out.println("在吃第" + i + "个包子");
}

Random も Scanner と同様に Java であらかじめ記述されたクラスなので、実装方法を気にする必要はなく、そのまま使用することができます。

7.アレイ

メモの要約:

  1. 定義: 配列とは、同じデータ型の複数の値を同時に格納できるコンテナーを指します。

  2. 定義方法:

    • フォーマット 1:

      数据类型 [] 数组名;
      //例如
      int [] array;
      
    • フォーマット 2:

      数据类型  数组名 [];
      //例如
      int array [];
      
    • 注: 異なるデータ型は異なるデフォルト値に対応します。

      • 整数型: 0
      • 10進数型:0.0
      • ブール型: false
      • 文字タイプ: '\u0000'
      • 参照型: null
  3. 静的配列の初期化:

    • フォーマット 1:

      数据类型[] 数组名 = new 数据类型[]{
               
               元素1,元素2,元素3,元素4...};
      //例如
      double[] arr = new double[]{
               
               1.1,1.2,1.3};
      
    • フォーマット 2:

      数据类型[] 数组名 = {
               
               元素1,元素2,元素3,元素4...};
      //例如
      int[] array = {
               
               1,2,3,4,5};
      
  4. 動的配列の初期化:

    • フォーマット:

      数据类型[] 数组名 = new 数据类型[数组的长度];
      //例如
      double[] arr = new double[10];
      
  5. 配列の動的初期化と配列の静的初期化の違いは次のとおりです。

    1. 文法が違う
    2. 配列の長さが異なります
    3. 配属のタイミングが違う
    4. 注: 配列の種類に関係なく、配列の最大長は配列の長さ -1 です。例: arr.length - 1
  6. アドレス値:

    • 意味: 配列のアドレス値は、配列オブジェクトへのポインタまたは参照です。

    • 例えば:

      int[] arr = {
               
               1,2,3,4,5};
      System.out.println(arr);	//[I@6d03e736
      /*
      [ :表示现在打印的是一个数组。
      I:表示现在打印的数组是int类型的。
      @:仅仅是一个间隔符号而已。
      6d03e736:就是数组在内存中真正的地址值。(十六进制的)
      */
      
  7. 索引:

    • 意味:配列内の位置を識別するために使用されます。

    • 例えば:

      arr[0]、arr[1]、……
      
    • 特徴:

      1. 開始値は0です
      2. 継続的に
      3. 1つずつ+1ずつ増えていきます。
  8. 配列要素へのアクセス

    • 意味: インデックスに基づいて配列内の値にアクセスします
    • 形式: 配列名 [インデックス];
  9. トラバース

    • 意味: タプル内の要素を順番に取り出します。

    • フォーマット:

      for(int i = 0; i < arr.length; i++){
               
               
          //在循环的过程中,i依次表示数组中的每一个索引
          sout(arr[i]);//就可以把数组里面的每一个元素都获取出来,并打印在控制台上了。
      }
      

      説明: arr.length は配列の長さを取得することを意味します

7.1 概要

7.1.1 定義

Java では、配列とは、同じデータ型の複数の値を同時に格納できるコンテナーを指します。ただし、配列コンテナーにデータを格納する場合は、暗黙的な変換と併せて考慮する必要があります。

注: 配列内の暗黙的な変換

  • int型の配列を定義します。とてもブール値です。この配列にはdouble型のデータは格納できませんが、byte型、short型、int型のデータは格納できます。

7.1.2 推奨事項

コンテナのクラスは、保存されているデータのタイプと一致します。

例証します:

  • 整数 1 2 3 4 56 は、int 型の配列を使用して格納できます。
  • double 型の配列を使用して、10 進数 1.1 1.2 1.3 1.4 を格納できます。
  • String型の配列を使用して文字列「aaa」「bbb」「ccc」を格納できます。

7.2 配列の定義

7.2.1 フォーマット1

数据类型 [] 数组名
# 例如
int [] array

7.2.2 フォーマット 2

数据类型  数组名 []
# 例如
int array []

詳細:

  • データ型: 将来、配列に保存できるデータの種類を制限します。
    • 配列のデフォルトの初期化値:
      1. 整数型: 0
      2. 10進数型:0.0
      3. ブール型: false
      4. 文字タイプ: '\u0000'
      5. 参照型: null
  • 角括弧: 配列が現在定義されていることを示します。
  • 配列名: これは将来使用するための単なる名前です。

知らせ:

メソッド括弧と配列名、前に書いた人も後ろに書いた人も同じ

7.3 配列の静的初期化

/* 完整格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4...}; */
int[] arr = new int[]{
    
    11,22,33};
double[] arr = new double[]{
    
    1.1,1.2,1.3};
/* 简化格式:
数据类型[] 数组名 = {元素1,元素2,元素3,元素4...}; */
int[] array = {
    
    1,2,3,4,5};
double[] array = {
    
    1.1,1.2,1.3};

詳細:

  • データ型: 今後配列に保存できるデータの種類を制限します。
  • 角括弧: 定義されているものが配列であることを示します
  • 配列名: 実際には、これは将来の使用に便利な単なる名前です。名前を付けるときは、小さなこぶの命名法に従ってください。
  • new: メモリ内に配列用のスペースを空けます。
  • 中括弧: 配列内の要素を表します。要素は配列に格納されているデータです。複数の要素はカンマで区切る必要があります

知らせ:

  • 前後のデータ型は一貫している必要があります
  • 配列が作成されると、その長さは変更できません。

7.4 配列の動的初期化

/* 格式:
数据类型[] 数组名 = new 数据类型[数组的长度]; */
int[] agesArr = new int[3];
int[] scoresArr = new int[10];

7.5 アドレス値

int[] arr = {
    
    1,2,3,4,5};
System.out.println(arr);//[I@6d03e736

double[] arr2 = {
    
    1.1,2.2,3.3};
System.out.println(arr2);//[D@568db2f2

詳細:

  • 配列を出力する場合、実際に表示されるのは配列のアドレス値です。配列のアドレス値: メモリ内の配列の位置を示します。

  • 住所の詳細

    /*
    以[I@6d03e736为例:
    [ :表示现在打印的是一个数组。
    I:表示现在打印的数组是int类型的。
    @:仅仅是一个间隔符号而已。
    6d03e736:就是数组在内存中真正的地址值。(十六进制的)
    但是,我们习惯性会把[I@6d03e736这个整体称之为数组的地址值
    */
    

7.6 索引

7.6.1 定義

Java では、インデックスは添え字や添え字とも呼ばれます。つまり、配列コンテナ内の各小さなグリッドに対応する番号です。

7.6.2 機能

  • インデックスは 0 から開始する必要があります。
  • 中断することなく継続します。
  • 1つずつ+1ずつ増えていきます。

7.7 配列要素へのアクセス

7.7.1 機能

  • 配列内の対応するインデックスの値を取得します

  • 配列内の対応するインデックスの値を変更します。変更すると、元の値は上書きされます。

7.7.2 基本的な使用例 - 配列アクセスのデモ

public class ArrDemo2 {
    
    
    /*

        数组中元素访问的格式:
                数组名[索引];

         作用:
            1.获取指定索引上对应的元素
            2.修改指定索引上对应的元素


    */
    public static void main(String[] args) {
    
    
       int[] arr = {
    
    1,2,3,4,5};
       //需求1:获取arr数组中,3索引上的值
        int number = arr[3];
        System.out.println(number);
        System.out.println(arr[3]);

       //需求2:将arr数组中,3索引上的值修改为10
            arr[3] = 10;
        System.out.println("修改之后为:" + arr[3]);

    }
}

7.8 配列の走査

7.8.1 トラバーサル

配列の内容を一つ一つ全て取り出すことです。

7.8.2 基本的なユースケースの配列トラバーサルのデモ

/* 格式:
数组名.length */
for(int i = 0; i < arr.length; i++){
    
    
    //在循环的过程中,i依次表示数组中的每一个索引
    sout(arr[i]);//就可以把数组里面的每一个元素都获取出来,并打印在控制台上了。
}

7.9 配列の 2 つの初期化方法の違い

7.9.1 静的初期化

int[] arr = {
    
    1,2,3,4,5};

例証します:

配列の要素を手動で指定すると、システムは要素の数に基づいて配列の長さを計算します。

7.9.2 動的初期化

int[] arr = new int[3];

例証します:

配列の長さを手動で指定すると、システムによってデフォルトの初期化値が与えられます。

7.9.3 アプリケーションシナリオ

  • 要素数のみを指定し、具体的なデータを指定しないため、動的初期化を使用することを推奨します。

例証します:

// 使用数组来存储键盘录入的5个整数。
int[] arr = new int[5];
  • 操作されるすべてのデータが識別されているため、静的初期化が推奨されます。

例証します:

// 将全班的学生成绩存入数组中,已知学生成绩为:66,77,88,99,100
int[] arr = {
     
     66,77,88,99,100}

7.9.4 アレイに関するよくある質問

インデックスが範囲外です

public class ArrDemo6 {
    
    
    public static void main(String[] args) {
    
    
       int[] arr = {
    
    1,2,3,4,5,5,5,5,5};
        //用索引来访问数组中的元素
        System.out.println(arr[1]);
        System.out.println(arr[10]);//ArrayIndexOutOfBoundsException

    }
}

説明: 配列のインデックス範囲

  1. 最小インデックス: 0
  2. 最大インデックス:
    • 配列の長さ - 1
    • 配列名.長さ - 1

8. コードブロック

メモの要約:

  1. ローカルコードブ​​ロック: 省略

  2. コードブロックの構築: 省略

  3. 静的コード ブロック (強調)

    • 意味: 静的によって変更されたコード ブロック

    • 基本的な使用例:

      /*格式:
      static{},需要通过static关键字修饰 */
      static{
               
               
      
      }
      // 当类加载时,此代码块就会被加载
      
    • 特徴: クラスがロードされるとロードされ、自動的に開始され、一度だけ実行されます。

8.1 ローカルコードブ​​ロック

public class CodeBlockLearn {
    
    
    public static void main(String[] args) {
    
    
        {
    
    
            int a=10;
            System.out.println(a);
        }
    }
}

例証します:

  • 応用シナリオ: 角括弧を超えると、変数 a は存在しなくなり、変数を事前に解放する効果があります。

8.2 コードブロックの構築

  • メンバーの場所でコード ブロックをアンロードすると、複数のコンストラクターで重複したコードが抽出される可能性があります。
  • 実行タイミング:このクラスのオブジェクトを作成する最初に構築コード ブロックを実行し、次に構築メソッドを実行します。

例証します:

構築コードブロックは構築メソッドの前に実行されます

8.3 静的コードブロック (強調)

/*格式:
static{},需要通过static关键字修饰 */
public class MyClass {
    
    
    static {
    
    
        System.out.println("静态代码块执行了");
    }
 
    public static void main(String[] args) {
    
    
        System.out.println("主方法执行了");
    }
}

例証します:

  • 実行タイミング: クラスのロード時にロードされ、自動的に開始され、1 回のみ実行されます。
  • 使用シナリオ: クラスをロードするときにいくつかの初期化操作を実行します。

9.キーワード

メモの概要: 各モジュールを参照

9.1このキーワード

メモの要約:

  • 定義: クラス内で使用する場合、そのクラスの現在のオブジェクトthisを指します

  • 基本的な使用例:

     public class Person {
           
           
        private String name;
        private int age;
    
        public Person(String name, int age) {
           
           
                      this.name = name; //使用this关键字引用当前对象的成员变量name
            this.age = age; //使用this关键字引用当前对象的成员变量age
        }
    }
    

定義: Java では、これは現在のオブジェクトを表すキーワードです。これを使用して、現在のオブジェクトのプロパティとメソッドにアクセスできます。

基本的な使用例

public class Person {
    
    
    private String name;
    private int age;

    public Person(String name, int age) {
    
    
        this.name = name; //使用this关键字引用当前对象的成员变量name
        this.age = age; //使用this关键字引用当前对象的成员变量age
    }
}

例証します:

クラス内で使用する場合this、そのクラスの現在のオブジェクトを参照します。

9.2 静的キーワード

メモの要約:

  • 定義: static は、クラスのメンバー変数、メンバー メソッド、およびコード ブロックを変更するために使用されるキーワードです。その機能は、これらのメンバー変数、メンバー メソッド、およびコード ブロックを、クラスのインスタンス オブジェクトではなく、クラス自体に関連付けることです。

  • 静的変数とそのアクセス

    1. 意味: static はクラスのメンバー変数を変更します。

    2. 意味:

      /* 格式:
      	修饰符 static 数据类型 变量名 = 初始值;*/
      public static String schoolName = "传智播客"
    3. アクセス:

      /* 格式:
      	类名.静态变量 */
      System.out.println(Student.schoolName); // 传智播客
      
  • インスタンス変数とそのアクセス

    1. 意味: 静的変更を行わないクラスのメンバー変数

    2. 意味:

      /* 格式:
      	修饰符 数据类型 变量名 = 初始值;  */
      public String schoolName = "传智播客"
    3. アクセス:

      /* 格式:
      	对象.方法名 */
      Student stu = new Student();
      System.out.println(stu.schoolName);
      
    4. 知らせ:

      • インスタンス変数は各オブジェクトに属しており、クラスオブジェクトにアクセスするために作成する必要があります。
      • 静的変数はメンバー オブジェクトに属さず、クラスに属します。静的変数はクラスがロードされるときにロードされ、オブジェクトの存在よりも優先されます。
  • 静的メソッドとそのアクセス

    1. 意味: 静的に変更されたクラスのメンバーメソッド

    2. 意味:

      /* 格式:
      	修饰符 static 类型 方法名() */
      public static void study(){
               
                // 类方法或者静态方法。
          System.out.println("我们都在黑马程序员学习");   
      }
      
    3. アクセス: クラス名.メソッド名()経由

      /* 格式:
      	类名.方法名() */
      Student.study();
      
    4. 注: インスタンス メソッドは各オブジェクトに属しており、クラスオブジェクトにアクセスするために作成する必要があります。

  • インスタンスメソッドとそのアクセス

    1. 意味: 非静的変更クラスのメンバー メソッド

    2. 意味:

      /* 格式:
      	修饰符 类型 方法名()*/
      public void study(){
               
                // 类方法或者静态方法。
          System.out.println("我们都在黑马程序员学习");   
      }
      
    3. アクセス: 新しいオブジェクトが必要です

      /* 格式:
      	对象.方法名 */
      Student stu = new Student();
      System.out.println(stu.study());
      
  • メモリマップ:

    1. static キーワードを使用すると、ヒープ メモリ内に「静的格納場所」と呼ばれるメモリ空間が開かれます。
    2. 静的メソッドは非静的リソースにアクセスできません
    3. 静的メソッドはインスタンス変数を呼び出すことができません
    4. 非静的リソースはすべてにアクセスできます
    5. 静的メンバーの存続期間はクラスの存続期間と同じであることに注意してください。

9.2.1 概要

static は、クラスのメンバー変数、メンバー メソッド、およびコード ブロックを変更するために使用されるキーワードです。その機能は、これらのメンバー変数、メンバー メソッド、およびコード ブロックを、クラスのインスタンス オブジェクトではなく、クラス自体に関連付けることです。

9.2.1 静的変数とそのアクセス

9.2.1.1 概要

静的に変更されたメンバ変数があり、そのメンバ変数がクラスに属していることを示し、このメンバ変数をクラス変数または静的メンバ変数と呼びます。クラス名を使用して直接アクセスできます。クラスが 1 つしかないため、メモリ領域には静的メンバー変数のコピーが 1 つだけ存在します。すべてのオブジェクトがこの変数を共有できます。

9.2.1.2 基本的な使用例 - 静的キーワードの使用法

/* 格式:
	修饰符 static 数据类型 变量名 = 初始值;*/    
public class Student {
    
    
    public static String schoolName = "传智播客"// 类变量或者静态成员变量
    // .....
}

9.2.1.3 アクセス

/*格式:
	类名.静态变量	*/
public static void  main(String[] args){
    
    
    System.out.println(Student.schoolName); // 传智播客
    Student.schoolName = "黑马程序员";
    System.out.println(Student.schoolName); // 黑马程序员
}

9.2.2 インスタンス変数とそのアクセス

9.2.2.1 概要

各オブジェクトには静的に変更されていないメンバ変数が属します このメンバ変数をインスタンス変数と呼びます先ほど書いたメンバ変数がインスタンスメンバ変数です

9.2.2.2 基本的な使用例 - インスタンス変数の使用法

public class Student {
    
    
    public  String schoolName = "传智播客"// 成员变量
    // .....
}

9.2.2.3 アクセス

/* 格式:
	对象.实例成员变量 */
public static void main(String[] args) {
    
    
    Student stu = new Student();
    System.out.println(stu.schoolName);
}

詳細:

インスタンス メンバー変数は各オブジェクトに属しており、クラス オブジェクトにアクセスするために作成する必要があります。

9.2.3 静的メソッドとそのアクセス

9.2.3.1 概要

静的に変更されたメンバーメソッドがあり、このメンバーメソッドがクラスに属していることを示し、このメンバーメソッドはクラスメソッドまたは静的メソッドと呼ばれます。クラス名を使用して直接アクセスできます。クラスが 1 つしかないため、メモリ領域には静的メソッドのコピーが 1 つだけ存在します。すべてのオブジェクトがこのメソッドを共有できます。

静的メンバー変数と同様に、静的メソッドにもクラス名とメソッド名を介して直接アクセスできます

9.2.3.2 基本的な使用例

public class Student{
    
    
    public static String schoolName = "传智播客"// .....
        public static void study(){
    
     // 类方法或者静态方法。
        System.out.println("我们都在黑马程序员学习");   
    }
}

9.2.3.2 アクセス

/* 格式:
	类名.静态方法*/
public static void  main(String[] args){
    
    
    Student.study();
}

9.2.4 インスタンスメソッドとそのアクセス

9.2.4.1 概要

各オブジェクトには静的変更を行わないメンバメソッドが属しており、このメンバメソッドはインスタンスメソッドとも呼ばれます。

詳細

インスタンス メソッドは各オブジェクトに属しており、クラス オブジェクトにアクセスするために作成する必要があります。

9.2.4.2 基本的な使用例 - インスタンス メソッドの使用法

/*格式:
	对象.实例方法*/
public class Student {
    
    
    // 实例变量
    private String name ;
    // 2.方法:行为
    // 无 static修饰,实例方法。属于每个对象,必须创建对象调用
    public void run(){
    
    
        System.out.println("学生可以跑步");
    }
	// 无 static修饰,实例方法
    public  void sleep(){
    
    
        System.out.println("学生睡觉");
    }
    public static void study(){
    
    
        
    }
}

9.2.4.3 アクセス

public static void main(String[] args){
    
    
    // 创建对象 
    Student stu = new Student ;
    stu.name = "徐干";
    // Student.sleep();// 报错,必须用对象访问。
    stu.sleep();
    stu.run();
}

まとめ

1.staticメンバ変数またはメンバメソッドが変更された場合、その変数は静的変数、メソッドは静的メソッドと呼ばれます。このクラスのすべてのオブジェクトは、同じクラスの静的変数と静的メソッドを共有します。どのオブジェクトでも、この静的変数の値を変更したり、静的メソッドにアクセスしたりできます。ただし、このアクセス方法はお勧めできません。静的変数または静的メソッドにはクラス名を通じて直接アクセスできるため、それらにアクセスするためにオブジェクトを使用する必要はありません。

2. 静的変更を行わないメンバー変数またはメンバー メソッドは、インスタンス変数、インスタンス メソッド、インスタンス変数、インスタンス メソッドと呼ばれます。インスタンスメソッドは、クラスのオブジェクトを作成し、そのオブジェクトを通じてアクセスする必要があります。

3. static で変更されたメンバーはクラスに属しており、static 領域に保存されますが、クラスのロード時にロードされ、一度だけロードされるため、コピーが 1 つだけになり、メモリが節約されます。固定メモリ領域(静的領域)に格納されているため、クラス名で直接呼び出すことができます。これはオブジェクトの前に存在するため、すべてのオブジェクトで共有できます。

4. 静的に変更されていないメンバーはオブジェクトに属しており、オブジェクトの数と同じ数のメンバーのコピーが存在します。したがって、オブジェクトによって呼び出される必要があります。

9.2.5静的メモリマップ(要点)

静的メソッド

画像-20230303143249383

例証します:

クラス内のメンバ変数を共有したい場合は、メンバ変数を静的にして変更することが、静的メモリ上での実行処理となります。

補充:

メソッドはスタックにプッシュされた後に終了します

注: 静的メソッドは非静的メソッドにアクセスできません

画像-20230303151408269

例証します:

  1. 名前が非静的である場合、その名前はヒープ メモリ内の静的記憶場所に表示されないため、静的メソッドは非静的名前にアクセスできません。
  2. 現在、ヒープ メモリにはインスタンス化されたオブジェクトがないため、静的メソッドはインスタンス変数を呼び出すことができません。

補充:

Student.TeacherName メソッドの Student が main メソッドで読み込まれると、Student.class バイトコード ファイルがメソッド領域に読み込まれます。

画像-20230303151626162

例証します:

show メソッドをメソッドメソッド内で呼び出すことができる場合、スタックメモリ内では、これは? ? ? .show メソッドを呼び出すのは誰ですか? 通常、このメソッドはオブジェクトによって呼び出される必要があるため、静的メソッドは非静的メソッドにアクセスできません。

補充:

静的メンバーのライフ サイクルは、クラスのライフ サイクルと同じ長さです。つまり、クラスがロードされると、静的メンバーにメモリが割り当てられ、クラスがアンロードされると、静的メンバーが占有するメモリも割り当てられます。解放されました。

9.2.6Static はメンバー変数とメンバーメソッドを変更します

画像-20230303143546266

9.2.7 一般的に使用される静的ツール

何かをするのに役立つが、何も説明しないクラス

1. 理解していない生徒もいました。ここで説明させてください。前回のレッスンでは、静的変数は授業の前に作成されると述べました。

2. これは、最初に静的変数をロードしてからクラスを作成することを意味しており、この手順に従います。

3. そして、このクラスにメソッド、つまりツールクラスしかない場合は、このクラスを作成する必要はありません。

4. このクラスの直前にメソッドを呼び出すことができ、最初に作成できるのは静的メソッドのみであるためです。

9.2.8静的な欠点

  1. 静的変数のライフサイクルが長すぎる: 静的変数はプログラムの実行中に存在するため、大量のメモリ領域を占有し、プログラムのパフォーマンスに影響を与える可能性があります。
  2. 静的変数の同時アクセスの問題:複数のスレッドが同時に静的変数にアクセスすると、同時アクセスの問題が発生し、データの不整合やその他のエラーが発生することがあります。
  3. 静的メソッドはサブクラスでオーバーライドできない: 静的​​メソッドはオブジェクトではなくクラスに属しているため、サブクラスでオーバーライドできず、プログラムの柔軟性が制限されます。
  4. 静的メソッドは、非静的メソッドまたは変数を呼び出すときにオブジェクトを作成する必要があります。静的メソッドはクラスに属し、非静的メソッドまたは変数に直接アクセスできないため、それらにアクセスするためのオブジェクトを作成する必要があります。
  5. 静的コード ブロックは例外を処理できません: 静的コード ブロック内のステートメントは例外を処理できず、例外をスローすることによってのみ処理できます。

静的静的メソッドの実行 - メモリ分析 _ 静的メソッド ランタイム - qingdao_java のブログ - CSDN ブログ

9.3最後のキーワード

メモの要約:

  • 定義:変数、メソッド、クラスを変更して、変更不可能な最終状態finalを表すために使用できるキーワードです

  • 変数を変更します。

    1. ローカル変数: その値は変更できない、つまり変数が定数であることを意味します。変数の値は変更できません

         final int a;
         a = 10;
      
    2. メンバー変数: その値は変更できない、つまり変数が定数であることを意味します。変数は、メンバー変数を定義するときにのみすぐに割り当てることができます。

       final int num = 10;
      
    3. 変数は明確に標準化されています。単一の単語はすべて大文字で表記され、複数の単語はアンダースコアで区切られます。

  • 変更されたメソッド: メソッドがサブクラスによってオーバーライド(オーバーライド)できないことを示します。

    final public void show1() {
           
           
    		System.out.println("Fu2 show1");
    	}
    
  • 変更されたクラス:他のクラスに継承できないため、そのクラスが最終クラス (または非拡張クラス) と呼ばれることを示します。

    final class Fu {
           
           
    }
    
  • 詳細:

    1. 最終的に変更された変数は基本型です。その場合、変数に格納されているデータ値は変更できません。
    2. Final によって変更される変数は参照型です。この場合、変数に格納されているアドレス値は変更できませんが、変数が指すオブジェクトの内容は変更できます。

9.3.1 概要

final変数、メソッド、クラスを変更して不変の最終状態を示すために使用できるキーワードです。

  1. 変数を変更します。
    • final変更された変数は定数を表し、一度値が割り当てられると変更できません
    • final宣言された変数は宣言時またはコンストラクター内で初期化する必要があります。初期化しない場合、コンパイラーはエラーを報告します。
    • 変数を宣言するときはfinal、通常はすべて大文字とアンダースコアを使用します。
  2. 修正方法:
    • final変更されたメソッドは、メソッドがオーバーライドできない、またはサブクラスによってオーバーライドできないこと
    • クラスが として宣言されるとfinal、そのクラス内のすべてのメソッドは自動的に になりますfinalが、インスタンス変数は影響を受けません。
  3. 変更クラス:
    • final装飾されたクラスは、そのクラスが継承できないことを示します。
    • 変更されたクラスを使用するとfinal、クラスの動作が変更されないことが保証され、コードの安全性と信頼性も向上します。

9.3.2 変数の変更

9.3.2.1 ローカル変数 (強調)

public class FinalDemo1 {
    
    
    public static void main(String[] args) {
    
    
        // 声明变量,使用final修饰
        final int a;
        // 第一次赋值 
        a = 10;
        // 第二次赋值
        a = 20; // 报错,不可重新赋值

        // 声明变量,直接赋值,使用final修饰
        final int b = 10;
        // 第二次赋值
        b = 20; // 报错,不可重新赋值
    }
}

例証します:

基本型のローカル変数は、final によって変更された後は 1 回のみ代入でき、再度変更することはできません。

9.3.2.2 メンバー変数 (強調)

メンバー変数には初期化の問題が関係します。初期化メソッドには、表示の初期化とコンストラクターの初期化が含まれます。選択できるのは次のいずれか 1 つだけです。

  • 表示初期化(メンバー変数定義時にすぐに値を代入)(よく使われます);
public class Student {
    
    
    final int num = 10;
}
  • コンストラクターの初期化 (コンストラクター内で値を 1 回割り当てます) (一般的には使用されません。理解しておいてください)。

    注: 値は各コンストラクターで 1 回割り当てる必要があります。

public class Student {
    
    
    final int num = 10;
    final int num2;

    public Student() {
    
    
        this.num2 = 20;
//     this.num2 = 20;
    }
    
     public Student(String name) {
    
    
        this.num2 = 20;
//     this.num2 = 20;
    }
}

例証します:

Final によって変更された定数名には通常、記述基準があり、すべての文字が大文字になります。

9.3.3 変更方法

9.3.3.1 概要

最終的に変更されたメソッドはオーバーライドできません

9.3.3.2 基本的なユースケース変更方法のデモンストレーション

/* 格式:
修饰符 final 返回值类型 方法名(参数列表){
    //方法体
} */
class Fu2 {
    
    
	final public void show1() {
    
    
		System.out.println("Fu2 show1");
	}
	public void show2() {
    
    
		System.out.println("Fu2 show2");
	}
}

class Zi2 extends Fu2 {
    
    
//	@Override
//	public void show1() {
    
    
//		System.out.println("Zi2 show1");
//	}
	@Override
	public void show2() {
    
    
		System.out.println("Zi2 show2");
	}
}

9.3.4 修飾子クラス

9.3.4.1 概要

最終的に変更されたクラスは継承できません

9.3.4.2 基本的な使用例 - 変更されたクラスの使用

/* 格式:
	final class 类名 {
	} 	*/
final class Fu {
    
    
}
// class Zi extends Fu {} // 报错,不能继承final的类

例証します:

API をクエリすると、 、 など、私たちが研究したクラスの多くが Final によって変更されており、その目的は、その内容を変更せずに使用することであることがわかりpublic final class Stringましpublic final class Mathpublic final class Scanner

9.4プライベートキーワード

メモの要約:

  1. 概要: クラスのメンバー変数とメソッドを変更するために使用される修飾子
  2. 機能:外部プログラムがオブジェクトデータに不正にアクセスして操作することを防止します。

9.4.1 概要

private は、メンバー (メンバー変数、メンバーメソッド) を変更するために使用できる修飾子です。

例証します:

プライベートで変更されたメンバーは、このクラス内でのみアクセスできます。プライベートで変更されたメンバー変数については、他のクラスで使用する必要がある場合、対応する操作を提供します

詳細:

  • メンバー変数の値を取得するには、「get 変数名()」メソッドを提供します。このメソッドは public で修飾されています。
  • メンバー変数の値を設定するための「変数名(パラメータ)の設定」メソッドを提供し、そのメソッドをpublicで変更します。

9.4.2 基本的な使用例 - private キーワードの使用法

/*
    学生类
 */
class Student {
    
    
    //成员变量
    String name;
    private int age;

    //提供get/set方法
    public void setAge(int a) {
    
    
        if(a<0 || a>120) {
    
    
            System.out.println("你给的年龄有误");
        } else {
    
    
            age = a;
        }
    }

    public int getAge() {
    
    
        return age;
    }

    //成员方法
    public void show() {
    
    
        System.out.println(name + "," + age);
    }
}
/*
    学生测试类
 */
public class StudentDemo {
    
    
    public static void main(String[] args) {
    
    
        //创建对象
        Student s = new Student();
        //给成员变量赋值
        s.name = "林青霞";
        s.setAge(30);
        //调用show方法
        s.show();
    }
}

9.4.3 ケース - プライベートの使用

  • 要件: 標準の学生クラスを定義し、名前と年齢をプライベートで変更する必要があり、データの表示を容易にするための set メソッドと get メソッドおよび show メソッドを提供します。テスト クラスでオブジェクトを作成し、それらを使用します。最後に、コンソール出力ブリギット・リン、30歳

  • サンプルコード:

    /*
        学生类
     */
    class Student {
          
          
        //成员变量
        private String name;
        private int age;
    
        //get/set方法
        public void setName(String n) {
          
          
            name = n;
        }
    
        public String getName() {
          
          
            return name;
        }
    
        public void setAge(int a) {
          
          
            age = a;
        }
    
        public int getAge() {
          
          
            return age;
        }
    
        public void show() {
          
          
            System.out.println(name + "," + age);
        }
    }
    /*
        学生测试类
     */
    public class StudentDemo {
          
          
        public static void main(String[] args) {
          
          
            //创建对象
            Student s = new Student();
    
            //使用set方法给成员变量赋值
            s.setName("林青霞");
            s.setAge(30);
    
            s.show();
            //使用get方法获取成员变量的值
            System.out.println(s.getName() + "---" + s.getAge());
            System.out.println(s.getName() + "," + s.getAge());
    
        }
    }
    

9.5このキーワード

メモの要約:

  1. 意味:これの本質はメソッド呼び出し元のアドレス値です。
  2. メモリマップ:
    • メソッドの仮パラメータがメンバー変数と同じ名前である場合、この変更を行わない変数はメンバー変数ではなく仮パラメータを参照します。
    • メソッドの仮パラメータはメンバ変数と同じ名前ではありません。変更されていない変数はメンバ変数を参照します。

このキーワードの記憶原理(ポイント)

画像-20230228093820021

画像-20230228094218260

例証します:

メソッドの実行が完了すると、スタックからポップオフされます。

要約すると、この本質はメソッド呼び出し元のアドレス値です。

これによって変更された変数はメンバー変数を参照するために使用され、その主な機能はローカル変数とメンバー変数の名前の重複の問題を区別することです。

  • メソッドの仮パラメータがメンバ変数と同じ名前である場合、この変更を加えていない変数は仮パラメータを参照し、この変更を加えた変数がメンバ変数になります。
  • メソッドの仮パラメータはメンバ変数と同じ名前ではありません。変更されていない変数はメンバ変数を参照します。
public class Student {
    
    
    private String name;
    private int age;

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getName() {
    
    
        return name;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public int getAge() {
    
    
        return age;
    }

    public void show() {
    
    
        System.out.println(name + "," + age);
    }
}

9.6 スーパーキーワード

メモの要約:

  1. 意味:親クラス オブジェクトへの参照を表し、親クラスのコンストラクター メソッドインスタンス メソッド、およびインスタンス変数を呼び出すために使用できます。

  2. 使用形式:

    this.成员变量    	--    本类的
    super.成员变量    	--    父类的
    
    this.成员方法名()  	--    本类的    
    super.成员方法名()   --    父类的
    
    super(...) -- 调用父类的构造方法,根据参数匹配确认
    this(...) -- 调用本类的其他构造方法,根据参数匹配确认
    
  3. 超使用例:

    • super() と this() は両方ともコンストラクターの最初の行になければならないため、同時に指定することはできません。
    • super(...) は、パラメーターに基づいて親クラスのどのコンストラクターを呼び出すかを決定します。
  4. メモリマップ:

    画像-20230813112237941

  5. 詳細:

    • サブクラスの各コンストラクター メソッドにはデフォルトの super() があり、親クラスの空のパラメーター コンストラクターを呼び出します。親クラスのコンストラクターを手動で呼び出すと、デフォルトの super() がオーバーライドされます。

    • super() と this() は両方ともコンストラクターの最初の行になければならないため、同時に指定することはできません。

    • super() と this() は、パラメーターに基づいて親クラスのどのコンストラクターを呼び出すかを決定します。

    • super() は、親クラスのコンストラクターを呼び出して、親クラスから継承されたメンバー変数のデータを初期化できます。

    • this() はこのクラス内の他のコンストラクターを呼び出すことができます

9.6.1 概要

Java では、super キーワードは親クラス オブジェクトへの参照を表し、親クラスのコンストラクター、インスタンス メソッド、およびインスタンス変数を呼び出すために使用できます。

class Person {
    
    
    private String name;
    private int age;

    public Person() {
    
    
        System.out.println("父类无参");
    }

    // getter/setter省略
}

class Student extends Person {
    
    
    private double score;

    public Student() {
    
    
        //super(); // 调用父类无参构造方法,默认就存在,可以不写,必须再第一行
        System.out.println("子类无参");
    }
    
     public Student(double score) {
    
    
        //super();  // 调用父类无参构造方法,默认就存在,可以不写,必须再第一行
        this.score = score;    
        System.out.println("子类有参");
     }
      // getter/setter省略
}

public class Demo07 {
    
    
    public static void main(String[] args) {
    
    
        // 调用子类有参数构造方法
        Student s2 = new Student(99.9);
        System.out.println(s2.getScore()); // 99.9
        System.out.println(s2.getName()); // 输出 null
        System.out.println(s2.getAge()); // 输出 0
    }
}

例証します:

サブクラスには、独自のオブジェクトのメンバー変数スコアを初期化するだけのパラメーター構築メソッドがあることがわかりましたが、親クラスのメンバー変数の名前と年齢にはまだデータがありません。この問題を解決するにはどうすればよいですか? super( を使用できます。 … ) 親クラスのコンストラクターを呼び出して、親クラス オブジェクトから継承された名前と年齢を初期化します。

9.6.3 基本的な使用例 - スーパーキーワードの使用

/* 格式:
    super.成员变量    	--    父类的
    super.成员方法名()   --    父类的 */
class Person {
    
    
    private String name ="凤姐";
    private int age = 20;

    public Person() {
    
    
        System.out.println("父类无参");
    }
    
    public Person(String name , int age){
    
    
        this.name = name ;
        this.age = age ;
    }

    // getter/setter省略
}

class Student extends Person {
    
    
    private double score = 100;

    public Student() {
    
    
        //super(); // 调用父类无参构造方法,默认就存在,可以不写,必须再第一行
        System.out.println("子类无参");
    }
    
     public Student(String name , int age,double score) {
    
    
        super(name ,age);// 调用父类有参构造方法Person(String name , int age)初始化name和age
        this.score = score;    
        System.out.println("子类有参");
     }
      // getter/setter省略
}

public class Demo07 {
    
    
    public static void main(String[] args) {
    
    
        // 调用子类有参数构造方法
        Student s2 = new Student("张三"2099);
        System.out.println(s2.getScore()); // 99
        System.out.println(s2.getName()); // 输出 张三
        System.out.println(s2.getAge()); // 输出 20
    }
}

知らせ:

  • サブクラスの各コンストラクター メソッドにはデフォルトの super() があり、親クラスの空のパラメーター コンストラクターを呼び出します。親クラスのコンストラクターを手動で呼び出すと、デフォルトの super() がオーバーライドされます。

  • super() と this() は両方ともコンストラクターの最初の行になければならないため、同時に指定することはできません

  • super(...) は、パラメーターに基づいて親クラスのどのコンストラクターを呼び出すかを決定します。

9.6.4 メモリマップ

親クラス空間はサブクラス オブジェクトより優先されます。

サブクラス オブジェクトが作成されるたびに、最初に親クラス空間が初期化され、次にサブクラス オブジェクト自体が作成されます。その目的は、サブクラス オブジェクトに対応する親クラス空間が含まれるため、親クラスのメンバーを含めることができます。親クラスのメンバーがプライベートに変更されていない場合、サブクラスは親クラスのメンバーを自由に使用できます。このコードは、サブクラスのコンストラクターが呼び出されるとき、親クラスのコンストラクターが最初に呼び出される必要があるという事実に反映されています。図を理解すると次のようになります。

画像-20230813112250239

9.6.5this() の基本的な使用例

これ(…)

  • デフォルトでは、このクラス内の他のコンストラクターを検索し、パラメーターに基づいてどのコンストラクターを呼び出すかを決定します。
  • 他のコンストラクターの機能を借用するため。
/* 格式:
	this.成员变量    	--    本类的
	this.成员方法名()  	--    本类的    */
package com.itheima._08this和super调用构造方法;
/**
 * this(...):
 *    默认是去找本类中的其他构造方法,根据参数来确定具体调用哪一个构造方法。
 *    为了借用其他构造方法的功能。
 */
public class ThisDemo01 {
    
    
    public static void main(String[] args) {
    
    
        Student xuGan = new Student();
        System.out.println(xuGan.getName()); // 输出:徐干
        System.out.println(xuGan.getAge());// 输出:21
        System.out.println(xuGan.getSex());// 输出: 男
    }
}

class Student{
    
    
    private String name ;
    private int age ;
    private char sex ;

    public Student() {
    
    
  // 很弱,我的兄弟很牛逼啊,我可以调用其他构造方法:Student(String name, int age, char sex)
        this("徐干",21,'男');
    }

    public Student(String name, int age, char sex) {
    
    
        this.name = name ;
        this.age = age   ;
        this.sex = sex   ;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public char getSex() {
    
    
        return sex;
    }

    public void setSex(char sex) {
    
    
        this.sex = sex;
    }
}

例証します:

このメモリマップはこのキーワードで詳しく説明されています

知識補給の章

1.Javaメモリモデル

Java では、HelloWorldメソッドを実行する際のメモリ マップ

画像-20230303093525909

例証します:

スタックメモリはメソッド使用され、ヒープメモリはオブジェクト使用され、メソッド領域は実行されたクラスファイルの一時保存に使用されます。

補充:

  • 参考:https://www.bilibili.com/video/BV17F411T7Ao/?p=107
  • mainメソッドが実行されるとStringDemoクラスファイルが生成されます。

2.アイデアショートカットキー

2.1 インターフェース実装クラスの表示

例証します:

Ctrl+Alt+B

メソッドを選択し、Ctrl+Alt+B を押すと、このインターフェイスを実装する実装クラスが表示されます。

画像-20230321143750637

2.2 アイコンの詳細

Ctrl+F12 を押すと、メンバー メソッド、メンバー属性など、現在のクラスの状態を表示できます。

画像-20230424201934606

画像-20230424202204121

C はクラスを表します、M はメソッドを表します、F は定数または静的メンバー変数を表します、➡️ は継承を表します、⬆ はオーバーライドを表します

3.intと整数の違い

​ 在Java中,int是一种原始数据类型(primitive data type),用于表示整数值。它是Java中最常用的数据类型之一,它的大小为4个字节(32位),可以表示介于-2,147,483,648和2,147,483,647之间的整数。

​ 而Integer是Java中的一个类(Class),它封装了一个基本类型的int的值。它允许将int值作为参数传递给需要一个对象的方法,也可以将int值转换为其他类型的值,例如字符串。

​ 因此,intInteger的主要区别在于int是一个原始数据类型,而Integer是一个类,用于封装int值以便进行更多的操作。此外,int在Java中是一种基本数据类型,而Integer是一种引用数据类型,也就是说Integer实际上是一个指向对象的指针,而不是一个简单的数据值。

4.String 和Character 区别

String是一种对象,用于表示一个字符序列(即一组字符)。它是Java中的一个类,具有许多实用方法来操作和处理字符串,例如连接、替换、搜索和分割等。字符串常量可以使用双引号括起来,例如"hello"

Character是Java中的char类型的包装类,它用于表示单个字符。每个Character对象都包含一个char类型的值。它也具有一些实用方法来操作和处理字符,例如将字符转换为大写或小写。字符常量可以使用单引号括起来,例如'A'

したがって、Stringとの主な違いはCharacter、それらが表すデータ型です。String文字のグループを表すために使用され、Character単一の文字を表すために使用されます。また、StringはクラスですCharacterが単純なデータ型です。Java では、文字列は不変であるため、元の文字列を変更することはできませCharacterんが1 文字だけを表すため、変更可能です。

5. 基本データ型と参照データ型の違い

参考リンク: (29 メッセージ) 基本データ型と参照データ型の違い_Brandon はあなたのブログを理解しています-CSDN ブログ

おすすめ

転載: blog.csdn.net/D_boj/article/details/132192272