amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
x
telegram
steam
nintendo switch
email

Java学習のゼロからのスタート

背景#

もうすぐ 3 年生になります。私たちの世代から、学部では 3 年生の時に専攻分野に分かれて学ぶことになりました。私は個人の興味に従ってソフトウェア開発を選び、そのために Java が必修科目になりました...

7 月 24 日、夏学期が終わった後、「暇なら何かやるよりは何かをやった方がいい」という基本的な原則に従って、Java の予習を始めました(実際はサボっていただけですが)。もう 5 日が経ちましたので、小さなまとめを書く準備ができました。

チュートリアルの選択#

この問題について、私は「NEU LUG」グループのメンバーに相談しました。彼らのアドバイスは、Mooc を見ることですが、自分の実際の状況を考慮して、最終的には自分に合った学習方法を選びました - ドキュメントを読むことです。ここでは、廖雪峰のチュートリアルを選びました。理由は、自分のGit/JavaScript/Pythonのチュートリアルも彼のものを見ているので、当然Javaも優先的に選びました。🤣

今は 1 週間学習して、チュートリアルの内容は非常に詳細で深く、Java 14の新機能にも一部触れています。各セクションの後には練習問題があり、質問があればコメントで質問することもできます。全体的に見て、素晴らしいチュートリアルです。

現在の進捗状況#

現在、チュートリアルの最初の 6 章と第 7 章の一部を学習しました。これらの章は次のとおりです:

  • Java のクイックスタート
  • オブジェクト指向プログラミング
  • 例外処理
  • リフレクション
  • アノテーション
  • ジェネリクス
  • コレクション

学習の感想#

  1. Java のクイックスタート

    この章では、Java の変数の型と基本的な構文について説明しています。全体的に見て、C言語と非常に似ているため、理解しやすいですが、注意が必要な点もいくつかあります。例えば:

    • Java 12 で導入された switch 式

      String fruit = "apple";
      // opt = 1
      int opt = switch(fruit){
              case "apple"->1;
              case "pear" ->2;
      }
      
    • Java のデータ型

      注意が必要なのは、整数、浮動小数点数、文字、ブール型以外のすべての型は、Java では参照型(オブジェクト)です。

      Java は文字を UTF-16 で格納しているため、Java の文字は2 バイトを占有します。

      操作を容易にするために、各基本型には対応するラッパークラスがあります(例:intのラッパークラスはIntegerです)。

      String は変更不可能です。String に再代入すると、新しい領域が確保され、String ポインタがその領域を指すようになります。

    • var キーワード

      このキーワードは、コンパイラに型を自動的に推論させるために使用されます。C++ の auto に似ています。

      var s = "テスト"; // sはString型です
      
    • 配列の反復処理

      Java では、Python のfor ... in ...に似た反復処理方法が提供されています:

      String[] arr = new String[] { "1", "2", "3" };
      for (var item : arr) {
          System.out.println(item);
      }
      
  2. オブジェクト指向プログラミング

    オブジェクト指向プログラミングは、古くからある概念であり、C++ の学習経験があれば、理解するのは難しくないはずです。Java のコアクラスについては、必要に応じて調べるべきであり、熟練する必要はありません。

    • インスタンスフィールド / メソッドと静的フィールド / メソッド

      個人的な理解ですが、インスタンスフィールド / メソッドはオブジェクト(インスタンス)に適用されるものであり、静的フィールド / メソッドはクラス自体に適用されるものです。

      たとえば、学生クラスでは、学生の個別の名前、年齢などはインスタンスフィールドであるべきですが、学生の数などの「クラスの性質」は静的フィールドとして扱うべきです。

      それ以外にも、静的メソッドは、インスタンス自体に依存せずに存在する機能を表すために使用されます。例:

      // Numberクラスの静的メソッドvalueOfは、Numberインスタンスを構築するために使用され、特定のNumberに依存しません
      Number.valueOf();
      // Arraysクラスの静的メソッドsortは、配列をソートするために使用され、特定のArraysに依存しません
      Arrays.sort();
      
    • final キーワード

      final キーワードには 3 つの主な目的があります:

      • 変数を修飾して変更不可にする
      • メソッドを修飾してオーバーライド不可にする
      • クラスを修飾して継承不可にする
    • インターフェース

      インターフェースは、抽象クラスのさらなる抽象化であり、公開されたメソッドと静的で final なフィールドのみを持つことができます。

    • オブジェクト指向の基礎の最後の 4 つのセクション

      オブジェクト指向の基礎の最後の 4 つのセクション:パッケージ、スコープ、クラスパスと jar、モジュールは、Java コードの組織形式を説明しています。個人的には非常に重要だと思います。最初は少し混乱するかもしれませんが、何度も読んでみることをお勧めします(私もまだ混乱していますが、まだまだです)。

  3. 例外処理

    Java の例外処理は、try...catch...メカニズムを使用してエラーを階層的にスローすることができます。このセクションの内容は比較的簡単で、あまり感想はありません。

  4. リフレクション

    リフレクションは、実行時にオブジェクトの情報を取得するプログラムの仕組みであり、インスタンスについて何も知らない状態でそのメソッドを呼び出すことができます。例えば、関数名の文字列を使用して関数を呼び出すことができます。

    この章では、私にとって理解が難しいのはダイナミックプロキシのセクションです(主にその用途がわからないためです)。コメントセクションには、非常にわかりやすい例があり、私はそれに大いに恩恵を受けました。

  5. アノテーション

    私にとって、アノテーションは非常に便利な機能です。チュートリアルでは、自分で定義したアノテーションを使用して、パラメータの一括チェックを行う便利な例が紹介されています。このコメントは、アノテーションの役割を非常によく説明しています。

  6. ジェネリクス

    ジェネリクスは、もう一つの難しいトピックであり、後半の 3 つのセクションに焦点が当てられています:消去法、extends ワイルドカード、super ワイルドカード。

    • 消去法

      Java のジェネリクスは、消去法を使用して実装されており、ジェネリクスの処理はすべてコンパイラによって行われます。仮想マシンはジェネリクスについて何も知りません。これにより、さまざまな問題が発生します。

      1. ジェネリクスは基本型を使用できません。ジェネリクスの実際の型は Object です。
      2. ジェネリクスの型を取得することはできません。
      3. ジェネリクスの型を判断することはできません(instanceof)。
      4. T 型を直接インスタンス化することはできず、追加の Classが必要です。
    • extends と super ワイルドカード

      これらのセクションでは、ジェネリクスに対して extends/super ワイルドカードを使用することによって生じる性質の違いについて説明しています。総じて言えば、extends は読み取り専用であり、super は書き込み専用です。

      この性質を理解するには、上方向へのキャストと下方向へのキャストの違いを理解する必要があります:

      上方向へのキャストは、親クラスの参照を子クラスによって行います。下方向へのキャストは、子クラスの参照を親クラスによって行います。前者は安全であり、後者は安全ではありません。

      class Person{}
      class Student extends Person{}
      Person person = new Student(); //√
      Student student = new Person(); //×
      

      したがって、<? extends Integer>は、ジェネリクス内部がIntegerまたはそのサブクラスであることを意味します。この場合、ジェネリクス内部のIntegerまたはそのサブクラスを外部のIntegerに代入することは上方向へのキャストであり、安全ですが、外部のIntegerを内部のサブクラスに代入することは下方向へのキャストであり、エラーが発生します。最終的に現れる性質は「読み取り専用」です。<? super Integer>はこれとは逆です。

  7. コレクション

    第 7 章はまだ半分ほどしか学習していませんが、現時点では比較的簡単だと感じています。この章では、配列、リスト、ハッシュテーブルなどの基本的なデータ構造の使用方法について説明しています。設計や実装には触れていないため、この章は比較的楽です。


    続きます...( ランダムに更新 )😝

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。