0
0

More than 5 years have passed since last update.

プログラミングド素人のデザイナーがJava入門してみた_その8

Posted at

前回までのあらすじ

プログラミングド素人のデザイナーがJava入門してみた_その7

ジェネリクス

  • 汎用化されたデータ型でクラスやインターフェースを作ることができる
  • メソッドを呼び出すときに、引数のデータ型を選べるようにするということ
    • intしか受け付けない、Stringしか受け付けない、とかいう制約を取っ払える
    • 普通に書くと引数は決まった型でしか受け付けられないので、受けたい型の種類だけクラスを用意しないといけない
  • ジェネリクスはクラスやインターフェース単位で指定する?
    • このクラスでは汎用データ型Tが使えますよ、と明示しておいて...
    • そのクラス内のメソッドの引数で汎用型Tを使う、という感じ?
  • ジェネリクスをつかうと引数には参照型しか使えなくなる

class Hoge <汎用の型名(Typeの頭文字Tとするのが慣習)>{//クラス宣言時に汎用のデータ型を扱うことを明示
  public void huga(T 引数){//引数の型は汎用型とする
    (引数が絡む)処理
  }
}

public class Piyo {

  public static void main(String[] args) {

    Hoge<使いたい型> i = new Hoge<>();//変数宣言時の型を<>で括り、インスタンス化する際クラス名の後に<>を付け足す
    i.huga(boo);//変数宣言時の型で引数を渡せる
  }
}
class MyData <T>{//汎用データ型Tを用いる
  public void getThree(T x){引数xのデータ型は何でもOK
    System.out.println(x);//xを3度表示する
    System.out.println(x);
    System.out.println(x);
  }
}

public class HelloWorld {

  public static void main(String[] args) {

    MyData<Integer> i = new MyData<>();//変数iはInteger型として宣言&インスタンス格納
    i.getThree(10);//引数10はInteger型として渡される
  }

}

スレッド処理

  • スレッドとはコンピュータの処理単位のこと
  • スレッドを複数立ち上げれば処理を並行して実行できる

1.処理内容の記述

  • Runnableインターフェースを実装したクラスを作成
  • ↑のクラスにRunnableインターフェースがもつ抽象メソッドRunを実装(オーバーライド)
  • Run内に処理を書いていく

2.スレッド処理の実行

  • 1.で作ったクラスのインスタンスを作成
  • Threadクラスのインスタンスを作成し、コンストラクタの引数に↑のインスタンスを指定
  • ↑のインスタンスがもつstart()メソッドを呼ぶことで実行
class Huga implements Runnable { //Runnableインターフェースを実装したクラスを定義
  @Override //Runnableインターフェースがもつ抽象メソッドrunをオーバーライド
  public void run(){
    処理
  }
}

public class Hoge {

  public static void main(String[] args) {
    Huga huga = new Huga();//Runnableインターフェースを実装したクラスのインスタンスを作成
    Thread t = new Thread(r);//Threadクラスのインスタンスを作成し、引数として↑のインスタンスを渡す
    t.start();//↑のインスタンスがもつstart()で処理を実行

    for(int i = 0; i < 500; i++){
      System.out.print('.');
    }
  }

}
class MyRunnable implements Runnable {
  @Override
  public void run(){
    for(int i = 0; i < 500; i++){
      System.out.print('*');
    }
  }
}

public class HelloWorld {

  public static void main(String[] args) {
    MyRunnable r = new MyRunnable();
    Thread t = new Thread(r);
    t.start(); //**********…

    for(int i = 0; i < 500; i++){
      System.out.print('.');//..........…
    }
  }

}

Stringクラスを使う

  • String型の変数の値をいろいろと扱う
文字列の長さ 文字列を切り出す 文字列の置換
s.length() s.substring(2,5) s.replaceAll("置換対象","置換内容")
そのまんま(フィールドじゃなくメソッド) 2文字目から5文字目のまでを切り出す そのまんま

文字列内容の比較

equals()を使う方法】

String s1 = "abc";
String s2 = "abc";

if(s1.equals(s2)){
  System.out.println("same");
}

==を使う方法】

  • 参照型の場合はメモリ領域の場所を比較
  • Stringは参照型だが、異なる変数に同じ値が格納された場合は、同じメモリ領域を使うようになっている
  • ので参照型だが比較すると真となる
String s1 = "abc";
String s2 = "abc";//s1と同じ値なので同じメモリ領域を使いまわしている

if(s1 == s2){//真となりブロックの処理が実行される
  System.out.println("same same");
}

【異なるメモリ領域を使用することを明示するには】

  • newすることによってメモリ領域を独自に確保することを明示
String ss1 = new String("abc");
String ss2 = new String("abc");//ss1と値は一緒だが、別のメモリ領域を確保

if(s1 == s2){//偽となりブロックの処理は実行されない
  System.out.println("same same");
}

printfメソッド

  • 指定した書式で文字列を表示できる
  • printlnと違い改行されないので、必要に応じて\nを行末に追加
String name = "tatou";
int age = 25;
double height = 165.5;
  //%xで表示する変数の型を指定して書式を記述
  //書式の後に、対応する型の順に変数名を記述することで、それぞれの値が格納される
  System.out.printf("name: %s age: %d height: %f \n", name, age, height);
%s %d %f
文字列 整数値 浮動小数点

表示桁数と行揃えの指定

  • %に続けて数値指定で桁数を指定できる
  • -をつけることで左詰めの指定が可能(-がない場合は右詰め)
String name = "tatou";
    int age = 25;
    double height = 165.5;

    System.out.printf("name: %10s age: %-10d height: %5.2f \n", name, age, height);
%10x %-10x %5.2f
10桁行事で右詰め 10桁表示で左詰め 整数部分5桁、小数点部分2桁で右詰め

文字列として受け取る

  • 単に出力するのではなく、文字列として変数に格納したい場合はStringクラスのformatメソッドを使う
String name = "tatou";
int age = 25;
double height = 165.5;

  //String型の変数宣言と同時に、`format`メソッドで書式とはめ込む変数名を記述?
  String s = String.format("name: %10s age: %-10d height: %5.2f \n", name, age, height);
  System.out.println(s);

教科書

ドットインストールさまさま

@iwashi0830はこう思った

  • 無名クラス、ラムダ式はちょっと何言っているかわからなかったので後回し...
  • 変数宣言と同時に、そのクラスが持っているメソッドを実行できる?
    • コンストラクタじゃないメソッドも呼べるのか?
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0