Java:学習:3.型を極める

Java:学習:2.基本的な書き方を身につける の続き

以下 VB.NETとの違い(自分が知らないこと)があればメモ

3-1. プリミティブ型と参照型

3-1-1. Javaは静的型付け言語

3-1-2. プリミティブ型
  • byte (符号付き整数値 8bit)
  • short (符号付き整数値 16bit)
  • int (符号付き整数値 32bit)
  • long (符号付き整数値 64bit)
  • char (Unicode文字 16bit)
  • float (IEEE 754 浮動小数点数 32bit 単精度)
  • double (IEEE 754 浮動小数点数 64bit 倍精度)
  • boolean (真偽値 1bit)

☆リテラルの型
int num1 = 123;  // 10進数
int num2 = 010;  // 8進数
int num3 = 0xa;  // 16進数
int num4 = 0b11;  // 2進数
long longNum = 1L;  // long型
float floatNum = 3.14f;  // float型
double doubleNum = 3.14  // 小数点のデフォルトはdouble
double doubleNum2 = 3d;  // またはd(D)を付ける
boolean bool = true;  // true または false
char c = 'A';  // 文字はシングルクォートで囲む

☆桁数の多い数値を表示する場合、"_"で区切り表現することができる。
例) 12,345,678 をJavaで表すと「12_345_678」と指定することができる。(Java7以降)

☆ワイドニング
型のデータサイズが大きくなるように変換
short shortNum = 100;
int intNum = shortNum;  // ワイドニング

☆ナローイング
型のデータサイズが小さくなるように変換
基本的にはコンパイルエラー。ただしキャストすることで可能。
int intNum = 32767 + 1;
short shortNum = (short) intNum;

3-1-3. 参照型

☆文字列リテラル
Stringクラス、newキーワードを使わず文字列リテラルを使ってインスタンス生成
String name = "aaa";

☆nullリテラル

3-1-4. ラッパークラス
プリミティブ型に対応するラッパークラスが存在
  • Java.Jang.Byte
  • Java.Jang.Short
  • Java.Jang.Integer
  • Java.Jang.Long
  • Java.Jang.Character
  • Java.Jang.Float
  • Java.Jang.Double
  • Java.Jang.Boolean

☆ラッパークラスでよく使う定数
  • SIZE (ビット数>
  • BYTES (バイト数)(Java 8)
  • MAX_VALUE (最大値)
  • MIN_VALUE (最小値)

☆ラッパークラスの代表的なメソッド
  • valueOf (プリミティブの型)
  • valueOf(String s)
  • valueOf(String s, int radix)
  • parseXxx(String s)
  • parseXxx(String s, int radix)
  • toString(プリミティブ型の値)
  • toString(プリミティブ型の値, int radix)
※radix = 基数 = ?

プリミティブ型からラッパークラスへの変換はコンストラクタを使用すべきでない。
コンストラクタを使用すると毎回オブジェクトが生成される
valudOfメソッドを利用した場合、-127から128までの範囲であればオブジェクトを再利用する

3-1-5. オートボクシングとアンボクシング
オートボクシング = プリミティブ型 → ラッパークラス (valueOfを用いて行われる)
アンボクシング = ラッパークラス → プリミティブ型

3-2. クラスの作成


3-2-1. クラスを定義する

3-2-2. パッケージ
パッケージの宣言
package aa.bb.cc.dd;

3-2-3. アクセス修飾子

3-2-4. その他よく利用する修飾子

3-2-5. 継承
親クラスを呼び出すには super を使う。

3-2-6. 抽象クラス
abstract修飾子
継承されることを前提としたクラス

3-2-7. インターフェース
※実際の処理は定義しないが、Java 8以降、処理内容を定義するdefaultメソッドが追加された

インターフェースには定数を定義可
定数の public static final も省略可
public interface TaskHandler {
  int TASK_TYPE_PRIVATE = 0;
}

3-2-8. 匿名クラス
名前がないクラス
主に、インターフェースを実装した処理や抽象クラスを継承した処理を局所的に使いたい場合に使用。
public interface TaskHandler {
  boolean handle(Task task);
}
 :
TaskHandler taskHandler = new TaskHandler() {
  public boolean handle(Task task) {
    // taskに関する処理
  }
}

3-3. 型判定とオブジェクトの等価性


3-3-1. instanceof演算子

3-3-2. オブジェクトの等価性
・オブジェクトが同じか? (objA == objB)
・オブジェクトの値は同じか? (objA.equals(objB))

→ equalsメソッドを実装した場合はhashCodeメソッドも実装すること。
おなじ値を持つオブジェクトのハッシュ値は同じ(ハッシュ値といってもSHAとかではなく、例えば社員クラスであれば "社員コード+"社員名"をハッシュ値とする等)

3-4. 型にまつわる問題を予防する


3-4-1. 列挙型(enum)
例)
public enum TaskType {
  PRIVATE, WORK
};

enumはswitch文にも利用できるがenum型は付けない
例)
switch (type) {
  case PRIVATE: // OK
    :
  case TaskType.PRIVATE:  // NG
    :

名前と数値を関連付けることもできる。
例)
public enum HttpStatus {
  OK(200), NOT_FOUND(404), INTERNAL_SERVER_ERROR(500);
    :

3-4-2. ジェネリクス (総称型)
例) String型のList
// Java 5.0, Java 6
List list = new ArrayList();

// Java 7 であればダイアモンドオペレータが使用可能
List list = new ArrayList<>();

例) ジェネリクスを使ったクラス
public class GenericStack {
  private List taskList;

  public GenericStack() {
    taskList = new ArrayList<>();
  }

  public boolean push(E task) {
    return taskList.add(task);
  }
    :

例) ジェネリクスを使ったメソッド
public class GenericStackUtil {
  public static  GenericStack as(List list) {
    :
  }
}

List strList = new ArrayList<>();
strList.add("java");
GenericStack gstack = GenericStackUtil.as(strList);

例) 仮型パラメータ制限
public class NumberStack {
  :
}

NumberStack intStack = new NumberStack<>();  // OK
NumberStack longStack = new NumberStack<>();  // OK
NumberStack(String> numberStack = new NumberStack<>();  // NG


[Java]
https://gihyo.jp/book/2017/978-4-7741-8909-3

0 件のコメント:

その他の記事