トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Java

オブジェクト指向プログラミングの実践

環境の準備

Javaのプログラム開発にはさまざまなツールがあるが、開発元であるサン・マイクロシステムズにいくとSDKという開発ツールをダウンロードできます。
現在のSDKはJava2と呼ばれていて、バージョンは1_4_2_08。
バージョンの確認は

java -version

オラクルになってJDKに変わり、現在は8.0(1.8.0)がでている模様。

Oracle Technology Network for Java Developers
http://www.oracle.com/technetwork/java/index.html

 種類

パソコンでJavaプログラミングの練習に使うならJ2SEになります。

種類説明
J2SE(Java 2 Platform. Standard Edition)クライアントアプリケーション向け
J2ME(Java 2 Platform. Micro Edition)携帯機器などの組み込み向け
J2EE(Java 2 Enterprise Edition)サーバサイド向け

※J2*Eはバージョン5までの名称で、それ以降はJava SE

Java Platform Standard Edition 7 概念図
http://docs.oracle.com/javase/jp/7/

 パッケージ

プログラムを作りたいならJDKです。

パッケージ説明
JRE(Java 2 Runtime Environment. Standard Edition)イントラネット Web ページ上の Java アプレットや JavaBeans を実行
JDK(Java SE Development Kit)/SDK(Software Development Kit)開発者向けのコンパイラなどのツールとクラスライブラリのパッケージ。JREが含まれる

以前はSDKの名称でダウンロードでしたが、現在はJDKの模様。
SDKのサブセットがJDKという位置づけみたいなので、SDK>JDKって感じかな。
WikipediaによるとJDKに「アプリケーションサーバ、デバッガ、そしてドキュメンテーションを含む」のがSDKみたい。

 ダウンロード

SDKの欄よりダウンロードする。

Windows Offline Installation, Multi-language (j2sdk-1_4_2_08-windows-i586-p.exe, 52.23 MB)

J2SE SDK v 1.4.2 のダウンロード
http://java.sun.com/j2se/1.4.2/ja/download.html
Java 2 Platform Standard Edition 5.0 のダウンロード
http://java.sun.com/j2se/1.5.0/ja/download.html
Sun Microsoystems - 開発者 -
http://jp.sun.com/developers/

 LinuxJava

Fedora9で確認したところ、

$ java -version
java version "1.6.0"
OpenJDK  Runtime Environment (build 1.6.0-b09)
OpenJDK Core VM (build 1.6.0-b09, interpreted mode)

となっていたがコンパイルに必要なjavacが無い模様。
openjdk-develパッケージに入っているので

# yum install java-1.6.0-openjdk-devel

javacのバージョンは

$ javac -version
javac 1.6.0-internal

 インストール

XPの場合で記述

  1. j2sdk-1_4_2_04-windows-i586-p.exeをダブルクリックし、インストール
  2. [スタート]-[コントロールパネル]より[システム]へ、[システムプロパティ]ダイアログボックスが表示される
  3. タブを[詳細設定]に切り替え[環境変数]ボタンをクリック、[環境変数]ダイアログボックスが表示される
  4. [システム環境変数]のリストから[Path]を選択し、[編集]ボタンをクリック
  5. [変数値]の文字列に、 ;c:\j2sdk1.4.2_04\bin を追加し[OK]ボタンをクリック
  6. [スタート]-[すべてのプログラム]-[アクセサリ]-[コマンド プロンプト]を実行
  7. [コマンド プロンプト]で javac と入力しEnter
  8. 使い方が表示されればOK

 ドキュメント

Java(TM)2 SDK ドキュメント
http://java.sun.com/j2se/1.4/ja/docs/ja/index.html
Java 2 プラットフォーム API 仕様
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html

Javaの仕組

テキストエディタを使用しソースを作成、拡張子を.javaとして保存します。

sample.java

コンパイルを実行します。

javac sample.java

コンパイルするとクラスファイルが作成されます。
実行にはインタープリタを使用します。

java sample

このようにJavaを実行できる環境をJava仮想マシン(JVM)と呼びます。これにより、ハードやOSが違っても、同じプログラムが実行できます。コンパイラやインタープリタなどのプログラム開発・実行に必要なもの一式をJ2SDKといいます。

 プログラミング練習

Hello.java

class Hello
{
  public static void main(String[] args)
  {
    System.out.println("Hello!");
  }
}

コンパイル

javac ソースファイル名.java

クラスファイルの実行

java クラスファイル名
※拡張子(.class)は付けない。

クラスの定義

class クラス名
{
  中身
}

mainの定義

public static void main(String[] args);
{
  中身
}

文字列の出力

System.out.println("文字列");

 用語

オブジェクト

クラスとインスタンス

継承(インヘリタンス)

カプセル化

 

定数(リテラル)

ある値そのものを表す

変数

値を格納、演算、参照をする、メモリ内に確保された領域

型名サイズ(bit)説明
boolean1trueとfalseの2種利の状態のみを保持
char16Unicodeで表現された1文字
byte82の補数表現さた整数(-128〜+127)
short162の補数表現された整数(-32768〜+32767)
int322の補数表現された整数(-2147483648〜+2147483647)
long642の補数表現された整数(-9223372036854775808〜+9223372036854775807)
float32IEEE754-1985規格の浮動小数点(単精度)
double64IEEE754-1985規格の浮動小数点(倍精度)

参照型

配列要素の初期値

型名初期値
booleanfalse
char0
byte0
short0
int0
long0
float0
double0
参照型null(空白とは違う)

設定の確認

$ java -XshowSettings
VM settings:
    Max. Heap Size (Estimated): 471.75M
    Ergonomics Machine Class: client
    Using VM: OpenJDK Zero VM

Property settings:
    awt.toolkit = sun.awt.X11.XToolkit
    file.encoding = UTF-8
    file.encoding.pkg = sun.io
    file.separator = /
    java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
    java.awt.printerjob = sun.print.PSPrinterJob
    java.class.path = .
    java.class.version = 51.0
    java.endorsed.dirs = /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/endorsed
    java.ext.dirs = /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/ext
        /usr/java/packages/lib/ext
    java.home = /usr/lib/jvm/java-7-openjdk-armhf/jre
    java.io.tmpdir = /tmp
    java.library.path = /usr/java/packages/lib/arm
        /usr/lib/arm-linux-gnueabihf/jni
        /lib/arm-linux-gnueabihf
        /usr/lib/arm-linux-gnueabihf
        /usr/lib/jni
        /lib
        /usr/lib
    java.runtime.name = OpenJDK Runtime Environment
    java.runtime.version = 1.7.0_91-b02
    java.specification.name = Java Platform API Specification
    java.specification.vendor = Oracle Corporation
    java.specification.version = 1.7
    java.vendor = Oracle Corporation
    java.vendor.url = http://java.oracle.com/
    java.vendor.url.bug = http://bugreport.sun.com/bugreport/
    java.version = 1.7.0_91
    java.vm.info = mixed mode
    java.vm.name = OpenJDK Zero VM
    java.vm.specification.name = Java Virtual Machine Specification
    java.vm.specification.vendor = Oracle Corporation
    java.vm.specification.version = 1.7
    java.vm.vendor = Oracle Corporation
    java.vm.version = 24.91-b01
    line.separator = \n
    os.arch = arm
    os.name = Linux
    os.version = 4.1.13-v7+
    path.separator = :
    sun.arch.data.model = 32
    sun.boot.class.path = /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/resources.jar
        /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/rt.jar
        /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/sunrsasign.jar
        /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/jsse.jar
        /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/jce.jar
        /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/charsets.jar
        /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/rhino.jar
        /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/jfr.jar
        /usr/lib/jvm/java-7-openjdk-armhf/jre/classes
    sun.boot.library.path = /usr/lib/jvm/java-7-openjdk-armhf/jre/lib/arm
    sun.cpu.endian = little
    sun.cpu.isalist =
    sun.io.unicode.encoding = UnicodeLittle
    sun.java.launcher = SUN_STANDARD
    sun.jnu.encoding = UTF-8
    sun.os.patch.level = unknown
    user.country = GB
    user.dir = /path/to
    user.home = /path/to
    user.language = en
    user.name = hogeuser
    user.timezone =

上はraspbian(jessie)のdefault-jdk(JAVA7)インストール後に確認したもの。
java.class.pathがカレントディレクトリなので、カレントディレクトリに階層掘って置いているパッケージ等は読み込める。

標準的?なライブラリが入っているのはrt.jarで、

$ cd /usr/lib/jvm/java-7-openjdk-armhf/jre/lib
$ jar -tvf rt.jar | grep java/io

みたいにすれば確認できる(あまりに多いのでjava/ioに絞った例)。

src.zipにソースそのものがあるらしいが、好き好んで見たくはないかな(汗)。

MariaDBに接続

MariaDBMySQLと同じでmysql-connector-javaがあれば接続できる模様。

# apt-get install libmysql-java
# dpkg -L libmysql-java
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libmysql-java
/usr/share/doc/libmysql-java/README.gz
/usr/share/doc/libmysql-java/changelog.gz
/usr/share/doc/libmysql-java/copyright
/usr/share/doc/libmysql-java/changelog.Debian.gz
/usr/share/java
/usr/share/java/mysql-connector-java-5.1.32.jar
/usr/share/maven-repo
/usr/share/maven-repo/mysql
/usr/share/maven-repo/mysql/mysql-connector-java
/usr/share/maven-repo/mysql/mysql-connector-java/5.1.32
/usr/share/maven-repo/mysql/mysql-connector-java/5.1.32/mysql-connector-java-5.1.32.pom
/usr/share/maven-repo/mysql/mysql-connector-java/debian
/usr/share/maven-repo/mysql/mysql-connector-java/debian/mysql-connector-java-debian.pom
/usr/share/java/mysql-connector-java.jar
/usr/share/java/mysql.jar
/usr/share/maven-repo/mysql/mysql-connector-java/5.1.32/mysql-connector-java-5.1.32.jar
/usr/share/maven-repo/mysql/mysql-connector-java/debian/mysql-connector-java-debian.jar

MySQL.javaを作成。

import java.sql.*;

class MySQL {
    public static void main(String[] args) {
        Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sampledb", "user", "password");

            Statement stmt = con.createStatement();
            String sql = "SELECT * FROM items";
            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next()) {
                System.out.println(rs.getInt("id") + " " + rs.getString("body"));
            }

            stmt.close();
            con.close();

        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            if(con != null) {
                try {
                    con.close();
                } catch(Exception e)  {
                    e.printStackTrace();
                }
            }
        }
    }
}

コンパイルと実行。

$ javac -cp /usr/share/java/mysql-connector-java.jar MySQL.java
$ java -cp /usr/share/java/mysql-connector-java.jar:. MySQL

Socket通信

Socketsプログラミング|Sinta's Site
http://www.gadgety.net/shin/java/sockets.html

こちらを参考に、LANで繋がったRaspberryPi2台によるSocket通信を試してみた。

参考サイトのサンプルのとおりだと、サーバー側は1接続?しか応答に答えてくれないのと、クライアント側の送出文字列が決め打ちなので改造。

サーバー側はEchoServer.javaを作成。

import java.io.*;
import java.net.*;

public class EchoServer {
    public static void main(String args[]) {
        // ソケットや入出力用のストリームの宣言
        ServerSocket echoServer = null;
        String line;
        BufferedReader is;
        PrintStream os;
        Socket clientSocket = null;

        // ポート9999番を開く
        try {
            echoServer = new ServerSocket(9999);
        }
        catch (IOException e) {
            System.out.println(e);
        }

        // クライアントからのメッセージを待ち、受け取ったメッセージをそのま>ま返す
        while (true) {
            Socket soc;
            try {
                soc = echoServer.accept();
                is = new BufferedReader(new InputStreamReader(soc.getInputStream()));
                os = new PrintStream(soc.getOutputStream());

                line = is.readLine();
                os.println(line);
            } catch (IOException e) {
                System.out.println(e);
            }
        }
    }
}

accept()の処理をwhile()の中に移した。

$ javac EchoServer.java
$ java EchoServer

で、起動させておく。当然ながらポート9999を開いておくこと。

クライアント側はEchoClient.javaを作成。

import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) {
        // ソケットや入出力用のストリームの宣言
        Socket echoSocket = null;
        DataOutputStream os = null;
        BufferedReader is = null;

        // ポート9999番を開く
        try {
            echoSocket = new Socket("xxx.xxx.xxx.xxx", 9999);
            os = new DataOutputStream(echoSocket.getOutputStream());
            is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: localhost");
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: localhost");
        }

        // サーバーにメッセージを送る
        if (echoSocket != null && os != null && is != null) {
            try {
                // メッセージを送ります
                System.out.println("input string:");
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                String str = br.readLine();
                os.writeBytes(str + "\n");

                // サーバーからのメッセージを受け取り画面に表示します
                String responseLine;
                if ((responseLine = is.readLine()) != null) {
                    System.out.println("Server: " + responseLine);
                }

                // 開いたソケットなどをクローズ
                os.close();
                is.close();
                echoSocket.close();
            } catch (UnknownHostException e) {
                System.err.println("Trying to connect to unknown host: " + e);
            } catch (IOException e) {
                System.err.println("IOException: " + e);
            }
        }
    }
}

System.inからの入力で任意の文字列を送れるようにした。

$ javac EchoClient.java
$ java EchoClient
input string:
Hello World!!!
Server: Hello World!!!

こちらは1回毎に終了するので、再度試すなら

$ java EchoClient

する。
これでEchoServer側が動いているうちは何度でも返事が返ってくる。