BlackFlame33

BlackFlame33

若无力驾驭,自由便是负担。个人博客 https://blackflame33.cn/

《On Java》読書ノート-01

#

《On Java》は読む価値のある良書です。Java の基礎はあるものの、この本を読むと基礎部分でも新たな理解が得られます。著者は《Thinking in Java》の著者でもあり、使用法を説明するだけでなく、その知識の由来やなぜそれを使うのか、その価値はどこに現れているのか、それが一体何なのかを普及するのが得意です。一度読んだ後に忘れたくないので、各章ごとに感想を書き、後でこの記事を読み直すこともできます。何か中二病計画を忘れてしまったのではないでしょうか?

第 1 章 オブジェクトとは何か#

この章では、Java の核心的な特徴を読者にまとめています。Java の基礎を学んでいない読者は、Java の概要を把握することができます。また、基礎を持っている読者は、さらに深い理解を得ることができ、著者の独自の見解を読むことができます。

チューリング公式のガイドでは、「理解するだけで十分です」と述べています。個人的には、この章の主な知識ポイントは以下のとおりです:

前の 2 つの章

抽象の歴程#

すべてのプログラミング言語は抽象の一種です。実際、解決できる問題の複雑さは、抽象の種類と品質に直接依存します。

アセンブリ言語は機械語の一種の抽象です。手続き型プログラミング言語である C 言語は、アセンブリ言語の抽象です。手続き型プログラミング時代には、プログラマは自分自身をコンピュータの視点に置き、問題を解決する方法を考える必要がありました。このような抽象タイプでは、問題自体の構造ではなく、コンピュータの構造を頻繁に考慮する必要があります。

オブジェクト指向プログラミングの登場により、以前の手続き型プログラミングの問題点がうまく解決されました。この本によれば、以前のプログラマはマシンモデル(ソリューションスペース、つまりコンピュータ)と実際の問題を解決するための問題モデル(問題が実際に存在するスペース、つまりビジネス)の関連付けを行う必要がありました。しかし、手続き型プログラミングによって確立された関連付けの抽象度は高くなく、プログラマは引き続きコンピュータを考慮する必要がありました。オブジェクト指向プログラミングでは、マシンモデルの要素と問題モデルの要素をオブジェクトというキャリアを通じて 1 対 1 にマッピングし、プログラマはオブジェクト指向思考の強力な抽象能力を使用して、問題モデルを直接マシンモデルに記述し、関連付けの問題を解決することができます。あなたが読んでいるのは、マシンモデルが提供するソリューションであり、ビジネスの実際の業務を記述しています。明らかに、この抽象タイプはより一般的で効率的です。

オブジェクト指向プログラミングの目的#

オブジェクト指向プログラミングの目的は、問題を解決するためにオブジェクトが提供する特定のサービスを作成または使用することです。プログラムもユーザーにサービスを提供し、そのためには特定のオブジェクトのサービスを使用する必要があります。

隠蔽の実現#

良いクラスを設計するためのテクニックの 1 つは、詳細を隠蔽することです。使用者に細部を公開しないでください。なぜなら、使用者がクラスをどのように使用するかわからないため、将来の変更に対して隠蔽されていないコードが問題を引き起こす可能性があるからです。したがって、必要のない情報を公開せず、サービスのみを提供します。使用者は私たちのサービスが更新されても無効にならないことを信頼し、私たちは安心してリファクタリングを行うことができます。

再利用、継承、多態#

ここでは、Java の重要な特徴について説明しています。継承と多態の目的は、コードの再利用を最大化することです。たとえば、既存のクラスと非常に似ているクラスを作成する必要がある場合、コードを再度書く必要はありません。代わりに、継承を使用するだけです。ただし、継承を使用する際には注意が必要です。継承の原則は、「置換原則」を満たすことです。つまり、「A は B である」という関係を満たすことです。継承を使用する必要があるかどうかを判断するための明確な基準は、「上位クラスにキャストする必要がありますか?」です。
実際のコーディングでは、メソッドが具体的なクラスに依存しないようにする必要があります。メソッドは基本クラスのみを受け入れる必要があり、具体的なサブクラスが何であるかは関係ありません。冗長な条件コードを書く必要がなくなり、実行時に具体的なサブクラスのメソッドを実行するように処理を委任することができます。これが多態です。

第 2 章 Java のインストールと本書のサンプル#

注目すべきは、この章では環境変数やclasspathなどについて説明していません。インストール手順は、WinプラットフォームのChocolateyMac OSHomeBrewなどのパッケージ管理ツールを使用して解決されます。これらのツールは環境変数を自動的に処理します。もちろん、環境変数を設定するのは、コンソールで Java プログラムをコンパイルおよび実行するための便宜ですが、現在の IDE やスクリプトはますますスマートになり、環境変数を自動的に設定できるようになりました。

第 3 章 オブジェクトはどこにでもある#

まさに「万物皆オブジェクト」です。この章では、Java で最も重要なオブジェクトと、Java プログラムの実行に関与するさまざまな「力」について説明しています。チューリングのガイドラインでは、「実行と単純な Java プログラムの作成に必要な知識を理解する」と述べていますので、この章では以下のポイントを重点的にまとめています:

第三章

オブジェクトと参照#

このセクションでは、Java では実際にオブジェクト自体を操作していないことを説明しています。私たちはすべてのプログラミング言語がデータをメモリで処理していることを知っていますので、メモリで安全に処理する方法は問題です。メモリを直接操作するのが良いですか?それとも間接的な方法でメモリを操作するのが良いですか?Java は、理想的な答えを提供しています。参照を使用します。参照は、オブジェクトを制御し、オブジェクトの動作を呼び出し、オブジェクトの状態を変更するためのリモコンのようなものです。

データはどこに保存されているのか?#

このセクションでは、Java のデータの保存方法について説明しています:

  • 1. レジスタ。コンピュータの中央処理装置であるCPUに直接保存されるため、アクセス速度が最も速いデータ保存方法です。ただし、レジスタは貴重なリソースなので、手動でレジスタを割り当てることはできません。
  • 2. スタック。RAM 内で、プロセッサはスタックポインタを使用してデータを操作します。ただし、データ構造の観点からは、スタックは追加と削除の面で柔軟性に欠けるため、一部のデータ(例:オブジェクト参照)はスタックに保存されますが、オブジェクト自体はそうではありません。
  • 3. ヒープ。RAM 内で、ヒープは一般的なメモリプールで、すべての Java オブジェクトを保存するために使用されます。コンパイラはヒープ上のオブジェクトのライフサイクルについて気にしません。割り当てとクリーンアップの方法があり、時代の進歩に伴い、Java のヒープメモリ割り当てメカニズムは非常に効率的になりました。
  • 4. 定数プール。定数はプログラムコードまたは ROM に直接保存されます。たとえば、すべての文字列と文字列定数は、文字列リソースプールに保存されます。
  • 5.RAM 以外の保存。通常、メモリ以外のデータ、例えばシリアライズオブジェクト(他のマシンに送信できるオブジェクト)や永続オブジェクト(ディスクに保存されるオブジェクト)などが含まれます。これらのデータ保存タイプは、オブジェクトを他のメディアに保存し、必要に応じてオブジェクトに変換することができます。最も典型的な例は、データベースの保存です。

第 4 章&第 5 章 演算子&制御フロー#

これらの 2 つの章では、Java の演算子と制御フローの構文について詳しく説明しています。チューリングのガイドラインでは、「すべてのものを理解し、困難はありません」と述べています。C 言語と基本的に同じですので、ここでは読書後に興味を持ったポイントのみを記録します。

オブジェクトの代入には注意が必要#

前述したように、実際にはオブジェクト自体を操作しているわけではありません。代わりに、オブジェクトの参照を別の参照にコピーしています。これにより、2 つの参照が同じオブジェクトを指すことになり、代入された参照にはオブジェクトがありません。オブジェクトの代入には注意が必要であり、予期しない結果が生じる可能性があります。

Java == C++ -- --#

これは Java の創始者であるジェームズ・ゴスリンの見解であり、Java はいくつかの不要で難しい要素を削除した、より簡潔な言語であると考えています。もちろん、完全な減算ではありません 2333

== と!=#

異なる方法で作成された同じ内容のラッパークラスは、メモリ上の異なる場所に保存される場合があります。そして、==演算子と!=演算子はオブジェクトの参照を比較するため、オブジェクトを比較する場合はequals()メソッドを使用することをお勧めします。

boolean-exp ? value0 :value1三項演算子#

これは、2 つの値のうち 1 つを変数に割り当てる場合に使用されます。if-elseと同じシナリオをより簡潔に表現するために使用されます。

for-in#

float[] f = new float[10];
for(int i=0; i<10; i++)
    f[i] = rand.nextFloat();
for(float x : f)
    System.out.println(x);

残念ながら、for-inはイテレーションにのみ使用できます。f の要素を変更することはできません。

for(;;)#

コンパイラはwhile(true)for(;;)を同じように扱います。Java のソースコードでも、これら 2 つの方法の使用はほぼ同じです。

Math.random()の範囲#

実際の例は文字列を使用したswitchです。Math.random()の厳密な範囲は[0,1)です。

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