夏だからJava再入門
-
Upload
katsumi-honda -
Category
Technology
-
view
1.381 -
download
0
description
Transcript of 夏だからJava再入門
夏だからJava再入門日本Androidの会 大分支部
本田 克己
Androidの開発といえば
やっぱりJavaが基本になるので、夏なのでJavaのことをちょっとおさらいして
みよと思いました。
お題目
Javaの歴史
Javaの特徴?
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を買収
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年 リリースされず
2011年7月28日Java SE 7 リリース!
Javaのエディション
Javaには3つのエディションがあります
JavaMicro Edition
JavaStandard Edition
JavaEnterprise Edition
携帯電話などの組込み向け
iアプリとか、ガラケーのJavaアプリはコレ。
Androidアプリはコレじゃない
デスクトップ向け
開発者以外にあまり普及していなさそう。
昔、Javaアプレットとか少し流行ったけど、今はあまりみかけない。
サーバ向け
Java普及の立役者?お仕事でJavaを始めた人はここからが多そう。
AndroidとJavaの関係
Java ME
Java SE
Java EE
AndroidとJavaの関係
Java SEの一部 Android用の
拡張
で、OracleからGoogleが訴えられています
Javaの特徴
Javaの特徴
● オブジェクト指向プログラミング言語● Write Once,Run Anyware(という夢)● 膨大なAPI群● ガベージコレクション
オブジェクト指向プログラミング言語
クラスを基本とした静的なオブジェクト指向プログラミング言語です。
多重継承はできません。
オブジェクトではないプリミティブ型があります。
静的な言語
静的な型付け言語なので、コンパイル時に型のチェックが行われます。
Eclipse等の統合開発環境での、強力な入力補完機能が利用できます。
実行時に呼び出すメソッドを変えたい時は、リフレクションを使うとなんとかできます。
Write Once,Run Anyware(という夢)
Write Once,Run Anywareって昔はよく聞きましたが、最近はあまり耳にしません。
Javaが普及してきて、Java自体の宣伝文句を聞かなくなったからか、スクリプト言語が流行って、そんなの当たり前になったからか?
WindowsでもMacでもLinuxでも動くプログラム
を、作ることもできる。
ガベージコレクション(GC)
使用されていないオブジェクトを、自動的に削除してくれます。でも、不要な参照があると、使用されていると判断されて、メモリリークになります。
今のJavaでは世代別GCが多く使われています。
(ヒープによって、コピーGCとマーク・アンド・スイープを使い分けている)
Java SE6 Update 14以降ではG1GCという新しいGCも提供されています。
AndroidのDalvikではマーク・アンド・スイープだけが行われている。
マーク・アンド・スイープだけ???
と、今回、資料をまとめていて始めて知りました(汗
マーク・アンド・スイープは遅いので、GCがあまり発生しないように、オブジェクトの生成は抑えないといけないですね。
Java言語について
クラス
Javaでプログラムを組むときはクラスを作っていきます。
● クラスの宣言class クラス名
● 継承class クラス名 extends 親クラス名
extendsで継承をしていない場合は、デフォルトでObjectクラスを継承します。class クラス名 → class クラス名 extends Object
オブジェクト
クラスからオブジェクトを生成します。
オブジェクト名 変数名 = new オブジェクト名();
List list = new ArrayList();
(Listはインタフェース java.util.ListArrayListはクラス java.util.ArrayList です)
インタフェース
実装のない抽象的なクラス。インタフェースから直接オブジェクトは作れません。
● インタフェースの宣言interface インタフェース名
● インタフェースの継承interface インタフェース名 extends 他のインタフェース名(クラスは複数のインタフェースを実装できるので、あまり使うことはありません。というか使ったことがない)
● インタフェースの実装class クラス名 implements インタフェース名
抽象クラス
部分的に実装されていて、部分的に実装がされていない中途半端な抽象クラス。
フレームワークの拡張ポイントとして用意されていることなどが多い。
● 抽象クラスの宣言abstract class クラス名
プリミティブ型
プリミティブ型はオブジェクトじゃないです● byte(8bit 符号付き整数)● short(16bit 符号付き整数)● int(32bit 符号付き整数)● long(64bit 符号付き整数)● float(32bit 符号付き浮動小数点数)● double(64bit 符号付き浮動小数点数)● char(16bit 符合なしユニコード)● boolean(ブール値 true または false)
ラッパークラス
プリミティブ型をオブジェクトとして扱うためにラッパークラスが用意されています。
byte→Byte short→Short int→Integer
long→Long float→Float double→Double
char→Character boolean→Boolean
オートボクシング
J2SE 5.0からオートボクシングという機能が提供されました。
プリミティブ型とラッパクラスを自動的に相互変換してくれます。
● ボクシングプリミティブ型からラッパクラスへ変換
● アンボクシング
ラッパクラスからプリミティブ型へ変換
オートボクシングの例
オートボクシング以前
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;
と、オートボクシングで簡素なコードになりますが、上記コードのような意味不明な型の混在は絶対にやめておきましょう ;-)
文字列
文字列はStringのオブジェクトです。
オブジェクトですがリテラルが使えます(オブジェクトをnewしなくても生成される)
Stringは変更不能です。
文字列の変更をするときは、StringBuilderを使いましょう。(Androidでオブジェクトの生成回数を減らす為にも重要ですね)
配列
Javaの配列はオブジェクト。
宣言時のみnewしなくてもリテラルが使える。
String[] strs = {“abc”,”def”,”ghi”};
宣言時以外はnewしてください。
Strs = new String[] {“jk”,”lm”,”no”};
Javaでの複数要素の主役の座はListなどのコレクションフレームワークに移っているが、リソース使用量が少ないので、Androidでは配列の方がいいかも。
コレクションフレームワーク
ListやSetやMapといった複数の要素を扱うクラス群
データ構造に合わせて、効率のよい実装を選択することができます。
J2SE 5.0以降でジェネリクスという機能が提供されました。(ジェネリクスはコレクション以外にも利用できます)
ジェネリクス
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);
静的な型付けがさらに強力になっています。コンパイル時に型の間違いを検知できて、より安全なコーディングが行えます。
import
Eclipseとか使っていると、存在感が薄くなってしまっているimportです。
他の言語のincludeなどと違って、なくてもどうにかなります。
Import java.util.List;Import java.util.ArrayList;List list = new ArrayList;
が
java.util.List list = new java.util.ArrayList();
になるだけ。
static import
Staticなメソッドやクラス変数をインポートする
たとえばMath.abs(10) + Math.abs(-10);
がimport static import Math.abs;abs(10) + abs(-10);
みたいに書けるので、同じクラスメソッドを大量に呼ぶ場合は、コードが読みやすくなるかも。
他の人が読んだ時に混乱するので、多用はしないようがヨサゲです。
他にも色々ありますが、今回はここで力尽きてしまいました。