mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1490 文字
4 分
Javaコア技術 学習Day02
2022-07-14

javaの学習と復習、本文は主に『Javaコア技術巻』を学習対象として参照します。

第4章 オブジェクトとクラス#

1. クラス#

オブジェクト指向プログラミング OOP

クラス:インスタンスフィールドとメソッドをカプセル化する

クラス >== 継承(is a)/依存(uses a)/集約(has a)==>クラス

DVjasvCERhIqiUH.png

2. 事前定義済みクラス#

// Math
// Date
Date date = null; //CPPのオブジェクトポインタに似ている
date = new Date();
System.out.println(date.toString());

localDate#

// LocalDate
System.out.println(LocalDate.now());
LocalDate date = LocalDate.now(); //現在日付を構築
date = LocalDate.of("year","month","day"); //指定日を構築
int today = date.getDayOfMonth();
int getYear();
int getMonthValue();
int getDayofMonth();
int getDayofWeek(); //1~7
// 先日(n日)前, を含めてn日後
date = date.minusDays(n);
date = date.plusDays(n);
// is闰年
date.isLeapYear();
// 現在の年の日数と現在の月の日数
date.lengthOfYear();
date.lengthOfMonth();
  • localDateを使用して今月のカレンダーを出力する
public class chapter04main {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
int month = date.getMonthValue();
int today = date.getDayOfMonth();
date = date.minusDays(today-1); //今月の初日
DayOfWeek week = date.getDayOfWeek();
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for(int i=0;i<week.getValue();i++) System.out.printf(" ");
while (date.getMonthValue() == month){
int now = date.getDayOfMonth();
System.out.printf("%3d",now); //日付を出力
if(now == today) System.out.printf("*");
else System.out.printf(" ");
date = date.plusDays(1); //次の日
if(date.getDayOfWeek().getValue() == 1) System.out.println();
}
}
}

KiyBMQgl85CdVjU.png

3. 自作クラス#

class Test{
//field
private int t;
//constructor
public Test(/*...*/){
//...
}
// method
public void test(int n){
System.out.println("just test");
}
}
  • 複数のソースファイルをコンパイルする
javac Test*.java
  • インスタンス化
// コンストラクトを使用
Test test1 = new Test();
var test2 = new Test();
// nullになる場合
t = Objects.requireNonNullElse(n,"unknown"); //警告を出し受け取る
Objects.requireNonNull(n,"not to be null"); //直接拒否
  • 明示的引数、暗黙的引数

test1.test(3)の中でtest1が暗黙的引数、メソッド内の3が明示的引数。

  • カプセル化

クラスのプライベートオブジェクトを返してはいけない

  • アクセス権限

public:公開

private:非公開

  • final

初期化が必要で、参照先を変更できないが、参照先のオブジェクト自体は変更可能。

private final StringBuilder eva;
eva = new StringBuilder(); //初期化が必須
eva.append("ok!\\n"); //合法

4. 静的メソッドと静的フィールド#

static int number = 1; //静的フィールド、クラスで共有される
static final double PI = 3.141592653589; //静的定数
  • 静的メソッド

static int getNum(){...}

暗黙的な関数はなく、クラスを直接呼び出して使用します。例:Test.getNum()

オブジェクト状態を使わず、クラスの静的フィールドにアクセスするだけ

  • ファクトリメソッド

LocalDateNumberFormatのようなコンストラクタ。

  • main

mainメソッドも静的メソッドです。

5. メソッドの引数#

  • 値渡し(Javaで使用)
  • 参照渡し
  • 名前渡し(Algolで使用)

値渡しでは、引数はコピー(基本データ型)。

オブジェクト参照を渡す場合、引数はオブジェクト参照そのものになるが、依然として値渡しである。例:2つのクラスのオブジェクトを入れ替えることはできない。

6. オブジェクトの構築#

  • オーバーロード

同じ名前で異なるパラメータ(戻り値は含まない)

  • 引数なし構造

デフォルト値で初期化される。

P.S. 自作が存在する場合、引数なしのコンストラクタを自分で用意する必要がある。

  • 明示的フィールド初期化

private String name = ""; をクラス内で直接初期化。

  • thisを使って構築
public Test(double s){
this("Test "+Double.toString(s));
}
  • 初期化ブロック
class Test{
private static int Aid = 1;
private int id;
// 初期化ブロック
// static がある場合、クラスが初めてロードされる時に実行される。
{
id = Aid;
Aid ++;
}
//...
}

オブジェクトを構築すると、初期化ブロックは実行される。先に初期化ブロックが実行される。

  • デストラクション

Javaは自動的にガベージコレクションを行う。

7. パッケージ#

package

  • パッケージ名
  • クラスのインポート

パッケージ内のすべてのクラスを直接使用する。

他のパッケージの公開クラスを使用する。

完全修飾名

java.time.LocalDate today = java.time.LocalDate.now();

  • import のインポート

import java.time.*; | import java.time.LocalDate;

パッケージをインポートするには、*のみを使用することができる。

  • 静的インポート

import static java.lang.System.*;

直接 out.println(); を使用できる

  • パッケージ

package cc.dreaife.chapter04;

ファイルに package 文がない場合、そのファイル内のクラスは無名パッケージに属する。

  • パッケージアクセス

public か private を指定していない場合、同一パッケージからアクセス可能。

  • クラスパス

クラスは JAR ファイルに格納でき、複数のクラスファイルやサブディレクトリを含むことができる。

JAR は ZIP 形式でファイルとサブディレクトリを整理する。

# クラスパスを設定
java -classpath ${PATH(JAR)} ${className};
export CLASSPATH=${PATH};
set CLASSPATH=${PATH}

8. JARファイル#

  • JARファイルを作成

jar cvf jarFileName file1 file2 ...

  • マニフェストファイル

META-INF/MANIFEST.MF

jar cfm jarName manifestName ...

  • 実行可能なJARファイル

java -jar jarName

  • 複数バージョンのJARファイル

9. ドキュメントコメント#

javadoc => HTMLファイル

  • コメントの位置

モジュール・パッケージ・公開クラスと公開のインターフェース、保護されたフィールドを公開する、保護されたコンストラクタとメソッド

/**...*/ コメント

@ param タグ + 自由形式テキスト(最初の一文の概要、HTML修飾を使用可能)

  • クラスコメント

importの後、クラス定義の前

  • メソッドコメント

@param

パラメータは複数行になることがあり、HTML修飾を使用できる

  • @return

戻り値は複数行になることがあり、HTML修飾を使用できる

  • @throws

スローされる例外

/**
* testA
* @param s
* @param num
* @return string
*/
public String testA(String s,int num){
return s + Integer.toString(num);
}
  • フィールドのコメント
  • 一般的な説明

@author name@since text@version text@see | @link (ハイパーリンクを使用 #パッケージとクラス・メソッド)

  • パッケージ注釈

パッケージディレクトリに別ファイルを追加します。

package-info.javapackage.html … のテキストを抽出

  • コメントの抽出
javadoc -encoding UTF-8 -d ../doc Chapter04 #パッケージを抽出
javadoc -encoding UTF-8 -d docTest test.java #クラスを抽出

10. クラス設計のコツ#

  • データをプライベートに保つ
  • データの初期化
  • 過度な基本データ型の使用を避ける
  • すべてに get()set() が必要なわけではない
  • 責任を過度に分解したクラスの分離を避ける
  • クラス名とメソッド名は責務を表現できる
  • 不変クラスを優先して使用する
共有

この記事が役に立ったときは、ぜひ他の人に共有してください!

Javaコア技術 学習Day02
https://dreaife.tokyo/jp/posts/java-core-tech-day02/
著者
dreaife
公開日
2022-07-14
ライセンス
CC BY-NC-SA 4.0

一部の情報は古い可能性があります

関連した投稿 スマート
1
Javaコア技術 学習Day01
cs-base 本記事では、Javaの概要、環境構築、基本的なプログラム構造、データ型、変数、演算子、文字列処理、入出力、制御フロー、配列の使い方など、Javaのコア技術を主に紹介します。Javaのシンプルさ、オブジェクト指向特性、クロスプラットフォーム能力を強調し、JDKやJREなどの専門用語についても詳しく説明しています。
2
HTML学習
FRONTEND HTML学習では、文書構造、テキストタグ、画像、音声と動画、ハイパーリンク、フォーム、リスト、表、セマンティックタグ、特殊記号などの基本概念を扱います。重要な要素として、<html>、<head>、<body>、<div>、<span>、<img>、<audio>、<video>、<form> などがあり、Webページ作成に必要な基礎知識とサンプルコードを提供します。
3
Java IO
cs-base Java IOは入出力ストリームの基本概念を扱い、バイトストリームと文字ストリームの分類、およびInputStream、OutputStream、Reader、Writerなどの代表的なクラスを含みます。バイトストリームは生のバイトデータを処理し、文字ストリームは文字データを処理します。バッファ付きストリームはIO回数を減らして性能を向上させます。アダプタパターンとデコレータパターンはJava IOストリームで広く使われ、機能拡張や異なるインターフェースの調整を行います。JavaのIOモデルには同期ブロッキングIO、ノンブロッキングIO、非同期IOがあり、それぞれ適した利用場面があります。
4
Java並行プログラミング
cs-base 本記事では、スレッドとプロセスの定義、Javaスレッドの実装機構、スレッドライフサイクル、並行と並列の違い、同期/非同期の概念、多重スレッドの長所と短所など、Java並行プログラミングの基礎を紹介します。さらに、スレッド安全性、デッドロックとその回避方法、volatileキーワードの使い方、楽観ロックと悲観ロックの違い、スレッドプールやFutureを使った実行効率の向上方法についても扱います。最後に、CyclicBarrierやCountDownLatchなどのツールの利用シーンと原理も紹介します。
5
Java NIO
cs-base NIO(New I/O)は、従来のBIOの性能ボトルネックを解消するためにJava 1.4で導入されたノンブロッキングI/Oモデルです。中核コンポーネントにはBuffer、Channel、Selectorがあり、少数のスレッドで複数接続を処理できます。NIOはゼロコピー技術もサポートしてI/O効率を高め、ネットワークプログラミング簡略化のためにNettyのようなNIOベースのフレームワーク利用が推奨されます。

目次