夏だからJava再入門

34
夏だからJava再入門 日本Androidの会 大分支部 本田 克己

description

日本Androidの会 大分支部 第10回勉強会の資料。 そろそろネタ切れか?

Transcript of 夏だからJava再入門

Page 1: 夏だからJava再入門

夏だからJava再入門日本Androidの会 大分支部

本田 克己

Page 2: 夏だからJava再入門

Androidの開発といえば

やっぱりJavaが基本になるので、夏なのでJavaのことをちょっとおさらいして

みよと思いました。

Page 3: 夏だからJava再入門

お題目

Javaの歴史

Javaの特徴?

Java言語について

Page 4: 夏だからJava再入門

Javaの歴史

1992年 Javaの前身、Oakというのが開発されたらしい

1993年 Webブラウザ Mosaicリリース

1994年 Webブラウザ HotJavaが作られたらしい    Oakが商標に引っかかるから、Javaに変更

1995年 HotJavaとJavaがお披露目、ベータ版公開

1996年 Java1.0リリース

1998年 Java Community Process(JCP)設立

2001年 DoCoMo 503iでiアプリ

2006年 SunがJavaをオープンソース化

2008年 Android公開

2010年 OracleがSunを買収

Page 5: 夏だからJava再入門

JDKのリリース

1996年 JDK 1.0

1997年 JDK 1.1

1998年 J2SE 1.2

2000年 J2SE 1.3

2002年 J2SE 1.4

2004年 J2SE 5.0 ・・・ 5.0!?

2006年 Java SE 6

2008年 リリースされず

2010年 リリースされず

Page 6: 夏だからJava再入門

2011年7月28日Java SE 7 リリース!

Page 7: 夏だからJava再入門

Javaのエディション

Javaには3つのエディションがあります

JavaMicro Edition

JavaStandard Edition

JavaEnterprise Edition

携帯電話などの組込み向け

iアプリとか、ガラケーのJavaアプリはコレ。

Androidアプリはコレじゃない

デスクトップ向け

開発者以外にあまり普及していなさそう。

昔、Javaアプレットとか少し流行ったけど、今はあまりみかけない。

サーバ向け

Java普及の立役者?お仕事でJavaを始めた人はここからが多そう。

Page 8: 夏だからJava再入門

AndroidとJavaの関係

Java ME

Java SE

Java EE

Page 9: 夏だからJava再入門

AndroidとJavaの関係

Java SEの一部 Android用の

拡張

Page 10: 夏だからJava再入門

で、OracleからGoogleが訴えられています

Page 11: 夏だからJava再入門

Javaの特徴

Page 12: 夏だからJava再入門

Javaの特徴

● オブジェクト指向プログラミング言語● Write Once,Run Anyware(という夢)● 膨大なAPI群● ガベージコレクション

Page 13: 夏だからJava再入門

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

クラスを基本とした静的なオブジェクト指向プログラミング言語です。

多重継承はできません。

オブジェクトではないプリミティブ型があります。

Page 14: 夏だからJava再入門

静的な言語

静的な型付け言語なので、コンパイル時に型のチェックが行われます。

Eclipse等の統合開発環境での、強力な入力補完機能が利用できます。

実行時に呼び出すメソッドを変えたい時は、リフレクションを使うとなんとかできます。

Page 15: 夏だからJava再入門

Write Once,Run Anyware(という夢)

Write Once,Run Anywareって昔はよく聞きましたが、最近はあまり耳にしません。

Javaが普及してきて、Java自体の宣伝文句を聞かなくなったからか、スクリプト言語が流行って、そんなの当たり前になったからか?

WindowsでもMacでもLinuxでも動くプログラム

を、作ることもできる。

Page 16: 夏だからJava再入門

膨大なAPI群

http://download.oracle.com/javase/7/docs/ から抜粋

Page 17: 夏だからJava再入門

ガベージコレクション(GC)

使用されていないオブジェクトを、自動的に削除してくれます。でも、不要な参照があると、使用されていると判断されて、メモリリークになります。

今のJavaでは世代別GCが多く使われています。

(ヒープによって、コピーGCとマーク・アンド・スイープを使い分けている)

Java SE6 Update 14以降ではG1GCという新しいGCも提供されています。

AndroidのDalvikではマーク・アンド・スイープだけが行われている。

Page 18: 夏だからJava再入門

マーク・アンド・スイープだけ???

と、今回、資料をまとめていて始めて知りました(汗

マーク・アンド・スイープは遅いので、GCがあまり発生しないように、オブジェクトの生成は抑えないといけないですね。

Page 19: 夏だからJava再入門

Java言語について

Page 20: 夏だからJava再入門

クラス

Javaでプログラムを組むときはクラスを作っていきます。

● クラスの宣言class クラス名

● 継承class クラス名 extends 親クラス名

extendsで継承をしていない場合は、デフォルトでObjectクラスを継承します。class クラス名 → class クラス名 extends Object

Page 21: 夏だからJava再入門

オブジェクト

クラスからオブジェクトを生成します。

オブジェクト名 変数名 = new オブジェクト名();

List list = new ArrayList();

(Listはインタフェース java.util.ListArrayListはクラス java.util.ArrayList です)

Page 22: 夏だからJava再入門

インタフェース

実装のない抽象的なクラス。インタフェースから直接オブジェクトは作れません。

● インタフェースの宣言interface インタフェース名

● インタフェースの継承interface インタフェース名 extends 他のインタフェース名(クラスは複数のインタフェースを実装できるので、あまり使うことはありません。というか使ったことがない)

● インタフェースの実装class クラス名 implements インタフェース名

Page 23: 夏だからJava再入門

抽象クラス

部分的に実装されていて、部分的に実装がされていない中途半端な抽象クラス。

フレームワークの拡張ポイントとして用意されていることなどが多い。

● 抽象クラスの宣言abstract class クラス名

Page 24: 夏だからJava再入門

プリミティブ型

プリミティブ型はオブジェクトじゃないです● byte(8bit 符号付き整数)● short(16bit 符号付き整数)● int(32bit 符号付き整数)● long(64bit 符号付き整数)● float(32bit 符号付き浮動小数点数)● double(64bit 符号付き浮動小数点数)● char(16bit 符合なしユニコード)● boolean(ブール値 true または false)

Page 25: 夏だからJava再入門

ラッパークラス

プリミティブ型をオブジェクトとして扱うためにラッパークラスが用意されています。

byte→Byte short→Short int→Integer

long→Long float→Float double→Double

char→Character boolean→Boolean

Page 26: 夏だからJava再入門

オートボクシング

J2SE 5.0からオートボクシングという機能が提供されました。

プリミティブ型とラッパクラスを自動的に相互変換してくれます。

● ボクシングプリミティブ型からラッパクラスへ変換

● アンボクシング

ラッパクラスからプリミティブ型へ変換

Page 27: 夏だからJava再入門

オートボクシングの例

オートボクシング以前

int a = 1;

Integer b = new Integer(2);

int x = 1 + b.intValue();

Integer y = new Integer(a + b.intValue());

オートボクシング以降

int a = 1;

Integer b = new Integer(2);

int x = a + b;

Integer y = a + b;

と、オートボクシングで簡素なコードになりますが、上記コードのような意味不明な型の混在は絶対にやめておきましょう ;-)

Page 28: 夏だからJava再入門

文字列

文字列はStringのオブジェクトです。

オブジェクトですがリテラルが使えます(オブジェクトをnewしなくても生成される)

Stringは変更不能です。

文字列の変更をするときは、StringBuilderを使いましょう。(Androidでオブジェクトの生成回数を減らす為にも重要ですね)

Page 29: 夏だからJava再入門

配列

Javaの配列はオブジェクト。

宣言時のみnewしなくてもリテラルが使える。

String[] strs = {“abc”,”def”,”ghi”};

宣言時以外はnewしてください。

Strs = new String[] {“jk”,”lm”,”no”};

Javaでの複数要素の主役の座はListなどのコレクションフレームワークに移っているが、リソース使用量が少ないので、Androidでは配列の方がいいかも。

Page 30: 夏だからJava再入門

コレクションフレームワーク

ListやSetやMapといった複数の要素を扱うクラス群

データ構造に合わせて、効率のよい実装を選択することができます。

J2SE 5.0以降でジェネリクスという機能が提供されました。(ジェネリクスはコレクション以外にも利用できます)

Page 31: 夏だからJava再入門

ジェネリクス

List list = new ArrayList();

list.add(“abc”);

list.add(new Integer(1));

String abc = (String)list.get(0);

List<String> list = new ArrayList<String>();

list.add(“abc”);

list.add(1); // コンパイルエラー

String abc = list.get(0);

静的な型付けがさらに強力になっています。コンパイル時に型の間違いを検知できて、より安全なコーディングが行えます。

Page 32: 夏だからJava再入門

import

Eclipseとか使っていると、存在感が薄くなってしまっているimportです。

他の言語のincludeなどと違って、なくてもどうにかなります。

Import java.util.List;Import java.util.ArrayList;List list = new ArrayList;

java.util.List list = new java.util.ArrayList();

になるだけ。

Page 33: 夏だからJava再入門

static import

Staticなメソッドやクラス変数をインポートする

たとえばMath.abs(10) + Math.abs(-10);

がimport static import Math.abs;abs(10) + abs(-10);

みたいに書けるので、同じクラスメソッドを大量に呼ぶ場合は、コードが読みやすくなるかも。

他の人が読んだ時に混乱するので、多用はしないようがヨサゲです。

Page 34: 夏だからJava再入門

他にも色々ありますが、今回はここで力尽きてしまいました。