Java プログラミングの覚え書き

最終更新  2018.01.24


◆◆ メイン関数 ◆◆

public class Hello{
    public static void main(String[] args){
        System.out.println("Hello");
        System.out.print("World" + "\n");
    }
}


◆◆ コンソール入力 ◆◆

    import java.io.*;

    BufferedRead reader = new BufferedReader(new InputStreamReader(System.in),1)
    try{
        String line = reader.readreadLine();
    } catch ( IOException e){
        System.out.println(e);
    } catch ( NumberFormatException e){
        System.out.println("Input is no correct");
    }


◆◆ String, int, double 型変換 ◆◆

    int i = Integer.parseInt(String line);
    int d = Double.parseDouble(String line);

    String line = String.valueOf(i);
    String line = String.valueOf(d);

◆◆ String クラス ◆◆

    int  len;
    char cha;
    String str,str2,str3,str4;

    str  = "yabu";
    cha  = str.charAt(3);      3 文字目の文字
    len  = str.length();       長さ
    str2 = str.toLowerCase();  小文字に変換
    str3 = str.substring(3);   4 文字目以降の部分文字列
    str4 = str.substring(1,3); 2 文字目から 3 文字目まで

    toString()        文字列自体を返す
    trim()            両端からスペースを取り除いた文字列
    replace("a","b")  置換

行分解

    String str, str2[];

    str = "123\n456\n\n789\n";
    str2 = str.split("\n");

    for(i = 0; i < str2.length; i++){
          textview.append(str2[i] + "\n");
    }

結果

    str2[0] = "123";
    str2[1] = "456";
    str2[2] = "";
    str2[3] = "789";

行末の "\n" はあってもなくても結果は同じ。
\n\n の部分は "" があると見なされる。


◆◆ goto 文 ◆◆

break の後にラベル名を書く


◆◆ メソッドの名前 ◆◆

public static int halve(int n)

public : 他のクラスから参照可能
static : クラスメソッド or インスタンスメソッド
int    : 帰り値の型  何も返さないときは void


◆◆ 配列 ◆◆

1 次元配列

int[] a;
a = new int[3];

配列のサイズ : a.length

配列の初期化   int[] a = { 1 , 2 , 3 };
    あるいは   a = new int[]{ 1, 2 , 3 };

2 次元配列

int[][] a;
a = new int[2][3];

int[][] a = {
              { 1 , 2 , 3 },
              { 4 , 5 , 6 },
            };


a.length    の値は 2
a[0].length の値は 3


2 次元配列の場合、各要素の配列の長さは一定でなくてもよい


◆◆ 型キャスト ◆◆

C の場合と同じ


◆◆ アプレット ◆◆

html 側で <applet code="Hello.class" width=400 height=200> </applet>

Java 側では

import java.awt.*;
import java.applet.*;

public class MyApplet extends Applet {

    グローバル変数の宣言

    public void init(){

    }
    public void start(){

    }

    public void update(Graphics g){
        paint(g);
    }

    public void paint(Graphics g){
        描画処理
    }
}

◆◆ 継承 ◆◆

スーパークラスのコンストラクタは継承されない。

サブクラスのコンストラクタの最初で、スーパークラスの
引数なしのコンストラクタが呼び出される。

明示的に引数付きのコンストラクタを呼び出したいときは、
サブクラスのコンストラクタで super(30,20); などと記述する
super() が最初に来ない場合は、super() が最初に自動的に
挿入される。

this(20);  自分の引数付きコンストラクタの呼び出し


◆◆ スレッド ◆◆

1. Thread クラスを extends して新しいクラスを作る
2. そのインスタンスを作成する
3. start() メソッドで分岐すし、run() メソッドが実行される

スレッドの定義

public class YThread extends Thread {

    public int switch;   // メインからの命令を受け取る変数

    YTread(){
    }

    public void run(){

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Log.e("InterruptedException", e.getMessage());
        }
    }

    public void re_init(){   // 何らかの設定など

    }
}

メイン側

    YThread th = new YTread();
    th.start();    // run が実行される

    th.switch = 1;  // 何らかの設定
    th.re_init();   // 何らかの設定


◆◆ パッケージ ◆◆

package yabu;

とすると、パッケージ yabu に属するクラスとなる。

そのパッケージを使うには、yabu というディレクトリを
作り、そのディレクトリの中に .class ファイルを配置する。

setenv CLASSPATH  /home/yabu/java:デフォルトのパス

などと打つと、パッケージを探す基点となるディレクトリを
指定することができる。カレントの下にあるときは、CLASSPATH は
なくても良い。

◆◆ ファイルへ出力 ◆◆

PrintWriter クラスを使うと printf が使え、フォーマット付きの
出力ができる。

Java

import java.io.*;

// FileOutputStream --- OutputStreamWriter --- PrintWriter

    String fname = "a.txt";
    try {
        PrintWriter w = new PrintWriter(new OutputStreamWriter(
                            new FileOutputStream(fname),"Shift_JIS"));
        w.printf("%02d:%02d\n",1,-2);
        w.println("yabu");
        w.print("tetsuro\n");
        w.flush();
        w.close();
    } catch (FileNotFoundException e) {
        System.out.println(e);
    } catch (IOException e){
        System.out.println(e);
    }

Android #1

FileOutputStream のオブジェクトの作成法は 2 つある

    FileOutputStream outs = new FileOutputStream(fname);           // 通常
    FileOutputStream outs = openFileOutput(fname, MODE_PRIVATE);  // モード指定

// FileOutputStream -- OutputStreamWriter --- PrintWriter

    try {
        FileOutputStream outs = openFileOutput(fname, MODE_PRIVATE);
        PrintWriter w = new PrintWriter(new OutputStreamWriter(outs,"UTF-8"));
        w.write(contents.toString());
        w.close();
        outs.close();
    } catch (FileNotFoundException ex) {
        Log.e("FileNotFoundException", ex.getMessage());
    } catch (IOException ex){
        Log.e("IOException", ex.getMessage());
    }

Android #2

// FileOutputStream --- OutputStreamWriter -- BufferedWriter

    try {
        FileOutputStream outs = new FileOutputStream(fname);
        BufferedWriter w = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
        w.write(str.toString());
        w.flush();
        w.close();
        outs.close();
    } catch (FileNotFoundException ex) {
        Log.e("FileNotFoundException", ex.getMessage());
    } catch (IOException ex){
        Log.e("IOException", ex.getMessage());
    }

◆◆ ファイルから入力 ◆◆

    String fname = "in.txt";
    try {
        BufferedReader r = new BufferedReader(new InputStreamReader(
                                new FileInputStream(fname),"UTF-8"));
        String line;
        while(( line = r.readLine()) != null ){
            System.out.println(line);
        }
        r.close();
    } catch (FileNotFoundException e) {
        System.out.println(e);
    } catch (IOException e){
        System.out.println(e);
    }

ファイルの終端まで来たときには、null を返す。


◆◆ クラスフィールドとインスタンスフィールド / クラスメソッドとインスタンスメソッド ◆◆

class Myclass {
    int    value;
    static int common_value;

    Myclass(int val){
        value        = val;
        common_value = val * 2;
    }

    public int get_value() {
        return ( this.value );
    }

    public static int get_value_static(Myclass obj){
        return ( obj.value );
    }

    public int get_common_value() {
        return( common_value );
    }

    public static int get_common_value_static() {
        return( common_value );
    }
}

static が付いたフィールドは 1 つだけ生成される。
static が付かないフィールドはインスタンス毎に生成される。

static が付かないメソッドは、そのインスタンスへのポインタが
暗黙の了解として渡される。ゆえに、単にフィールド名を指定
すると、this が付いているとみなされる。
static が付いたメソッドは暗黙のポインタが渡されないので、
当然 static でないフィールドの値にはアクセスできない。
上の例のように明示的にインスタンスを引数として取る必要が
ある。

static が付いたメソッドは、インスタンスを未作成の状態で、

    クラス名.メソッド名

という呼び方が可能。ただし通常の

    インスタンス名.メソッド名

も可能。


◆◆ new していないオブジェクト ◆◆

MyClass myclass;

myclass = new Myclass(引数);

宣言して new していない状態では
myclass == null


◆◆ ライブラリ ◆◆

C の関数に相当するものを作るにはどうすればよいのだろう?
関数だけ集めたクラスを作り、

Class lib {
    static public void func1(a, b){


    }
}

のように、全て static にすれば、

    lib.func1(a, b);

のようにどこからでも呼べるが・・・


◆◆ 切り上げ・切り捨て・四捨五入 ◆◆

import java.lang.Math;       <--- android studio では不要

double Math.floor(x)    切り捨て
double Math.ceil(x)     切り上げ
int    Math.round(x)    四捨五入

floor
  -1.0 -- -0.001  --> -1.0
   0.0 --  0.999  -->  0.0
   1.0 --  1.999  -->  1.0

ceil
  -1.999 -- -1.000  --> -1.0
  -0.999 --  0.000  --> -0.0
   0.001 --  1.000  -->  1.0

round
  -1.499 -- -0.500  --> -1.0
  -0.499 --  0.499  -->  0.0
   0.500 --  1.499  -->  1.0


◆◆ 文字のフォーマット ◆◆

sprintf 相当

String str;
str = String.format("%02d:%02d:%02d",hour,minute,second);

printf 相当

System.out.printf("%02d:%02d:%02d\n",hour,minute,second);

fprintf 相当

PinterWriter w = new PrinterWriter(new OutputStreamWriter(outs, "Shift_JIS"));
w.printf(


◆◆ 時刻の取得 ◆◆

Calendar calendar = Calendar.getInstance();

int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
int ms = calendar.get(Calendar.MILLISECOND);

String line = String.format("time : %04d/%02d/%02d  %02d:%02d:%02d\n",year,month+1,day,hour,minute,second);