多分ブロンズは受けないんだけど(多分シルバーは受ける)、けっこうシルバーと被ってるって言うし。どうせなら最初からちゃんとやるタイプなのでJava SE7 Bronzeから勉強してみてる2日目。
問題の傾向などをまとめてみたよ。JavaはAndroidでいじってるよ。
前置き(一通り問題やってみたすべてに関係する傾向)
- 以下はJava SE7の記述であり、Java SE8では変更されている可能性あり
- クラスのインスタンス化やメソッドの呼び方などは実際のプログラミングで覚えるところなので多少割愛
- 通常業務などでは使うことのない書き方や、実用性のない(監修に従っていない)書き方も多い
- 複数選択の問題が多いので注意
- ぱっと見ひっかけの問題が多いので、正解を見つけたら他が不正解かも確認した方が良い
メモ程度に書いたので、細かい間違いなどあるかもごめんね
Java言語の基本
Javaはオブジェクト指向言語
Javaのコンパイルコマンド → javac **.java 実行ファイル名
Javaの実行コマンド → java クラス名
- claaa hoge
- class huga
- class moe
をコンパイルすると、hoge.class, huga.class, moe.classが生成される。
Javaの決まり文句
public static void main(String[] args){
//ここに処理
}
※1 修飾子の順序は関係ない
※2 String[] argsには、コマンド引数が入る
例: (コマンド: java sample hoge huga moe) args[0] = hoge, args[1] = huga, args[2] = moe
※3 大文字と小文字の区別はあるので、Mainなどにすると、コンパイルエラーは起きないが、何も表示されない
・JRE → Java Runtime Environment: Javaの実行環境
・JDK → Java Development Kit : Javaの開発環境
コンパイラが含まれる
・JVM → Java Virtual Machine : Javaプログラムの実行やメモリ管理を行うソフトウェア
具体的にはクラスのロードやバイトコードを解釈する
ガベージコレクション: 不要になったメモリ領域を自動的に解放する機能
Javaのエディションは以下の3つ
・Java SE (Standard) : 基礎となるもの GUI、ネットワーク、スレッド、DBなど基本的なものが揃っている
・Java EE (Enterprise) : 大規模な業務アプリケーションなどに使われる
・Java ME (Micro) : 家電製品やモバイル製品など、リソースの少ないもの向け
Java EE, Java MEを利用するにはJava SEが必要
データ・型
基本データ型
byte : 8bit : -128~127の整数
short : 16bit : 3万くらいまでの整数
int : 32bit : 20億くらいまでの整数
long : 64bit : それ以上の整数
float : 32bit : 少数で代入するときには1.0fとか
double : 64bit : より大きい少数で1.0dとか
※精度が低いので誤差が出る場合がある。(BigDecimalなどで代用)
char : 16bit : Unicodeで表現できる1文字
boolean : true or false
※”true” , “false"などでは文字列になってしまう
int i = ‘x’; は正しい
‘x’(シングルクォーテーションつきの一文字)はchar型で、intには暗黙的に型変換される
× float f = 3.14;
○ float f = 3.14f;
変数を定数として宣言する場合はfinal修飾子
これに代入しようとするとコンパイルエラーとなる
{}で囲まれた範囲をブロックといい、ブロック外のローカル変数にはアクセスできない
配列の宣言の方法(例はintの配列)
・int[] array = new int[3];
・int array[] = new int[5];
配列の長さの取得はarray.length;
配列はarray[0]から入る new int[3]だと array[0] ~ array[2]
※配列にない値を参照しようとすると、コンパイルは通るがArrayIndexOutOfExceptionが発生して強制終了する
new int[3] などで配列を生成すると型ごとに以下の値で初期化される
- byte : 0
- short : 0
- int : 0
- long : 0
- float : 0.0f
- double : 0.0d
- char : ‘¥u0000’ → 出力すると空文字
- boolean : false
- Stringなどの参照型 : null
String a = “100”;
String b = “200”;
a + b → “100200"
※int型であれば、計算されるが、文字列なので単純に結合される
同じ名前のメソッドを複数定義すると、引数が正しいメソッドのみ動作する
(オーバーロード)
演算子・分岐文
int x = ++a;
インクリメントした後に、xに代入される
int y = b++;
xに代入された後に、インクリメントされる
※これによる計算の順序の問題が多いので注意
System.out.println(a > b)
正しければtrue、誤りであればfalseが出力される
String moe = (a < b ? “hoge” : “huga”);
a < bがtrueであれば、1つめの”hoge”。falseであれば、2つめの”huga”が代入される。
条件 && 条件 どちらもtrueであればtrue
条件 || 条件 いずれかがtrueであればtrue
この問題が解けるかで、計算順序をチェックしよう
int a = 3;
int b = 5;
System.out.print((3 + 6 * 8 / 2) + “ “); //27
System.out.print(++a * b++ + “ “); // 4 * 5 = 20
System.out.print(a++ * ++b): // 4 * 7 = 28
if(条件式)
条件式の結果がtrueかfalseになればよい
※処理が1行の場合は、{}をつけなくても良いが、複数行の場合は{}が必要
・if(true)
・boolean hoge;
if(hoge = true){}
※代入式だが、結果がtrueになるためエラーにはならない
Javaでは === は存在しない(javascript使いは注意)
コンパイルエラーは基本的には上から順番だが、Javaの文法として成り立っていないものは優先される。
ifやelse ifが実行されるとelseは実行されない
switch文でbreak;を記述しない場合、処理が下にそのまま流れてしまう
※breakをわざと抜いている問題が多いので注意
どのcaseにも当てはまらない場合、defaultを実行する
switch文で利用できる型は限られており、以下の6つ
- byte
- short
- int
- char
- enum
- String
String型(“A”)とchar型(‘A’)を比較するとコンパイルエラーとなる
ループ文
while(条件式)
条件式がtrueである限りループする break;でループを抜けることが可能
※間違えると無限ループに陥りやすい
※if(a = false), while(flag = true)など代入のひっかけが多いので注意
問われやすいループ文
・for(int i = 3; i < i++; i++){
//1度目のi < i++がfalseになるので実行されない
}
・拡張for文
for(変数宣言: 配列名){
//配列のそれぞれに変数が代入される
}
・for(int i = 1; i % 2 == 1; i += 2){
//真ん中の条件(奇数)がずっとtrueなので無限ループになる
}
・do{
//一度は必ず実行される(実行された後に比較を行う)
}while(条件式);
・do{
int a = 0;
}while(a > 0); ← 変数がスコープ内にないのでコンパイルエラー
・for(int i = 0; i < 3; i++); ← ;(セミコロンで閉じちゃってるひっかけがあるので注意)
System.out.print(i);
オブジェクト指向
■具象クラス、抽象クラス、インタフェースはしっかり理解するには長くなるので、別で勉強しよう(ここではそれを前提にポイントのみ触れる)
- 抽象クラス(abstract)はインスタンス化できない
- 抽象クラスのサブクラスでは抽象メソッドをオーバーライドする
- 抽象クラスでは実装をもつメソッドの定義が可能
- インタフェースとは抽象メソッドと定数のみを定義するもの
- インタフェースはインスタンス化できない
- インタフェースは複数実装可能
※実装を持たないメソッド = 抽象メソッド と言い換えられる
インタフェースの使用用途
- 共通する操作をもつが、クラスごとに実装が異なる場合
- 複数のクラス間で共通した振る舞いを持たせたい場合
- 多重継承の代用として複数の型を持ちたい場合
オブジェクト指向では、属性(変数)は非公開にし、操作(メソッド)は公開する ← データ隠蔽
オブジェクト内に属性とその属性にアクセスする操作をひとまとめにする ← カプセル化
※内部の属性に直接アクセスできないため、内部の変更が外部に影響を与えず、安定性が向上する
ポリモフィズム(多態性、多様性): 各オブジェクトの実装の詳細が異なっていても、内部の違いを意識することなく、共通した呼び出しで利用することができること
オーバーライド: スーパークラスのメソッドをサブクラスで再定義すること
クラス・インスタンス
int a = 10;
float b = 30.0f;
a + b; // → 40.0
String a = “1”;
int b = 5;
a + b; // → “15"
※setterで引数を渡さず、コンパイルエラーになる問題が多い
インスタンスを別変数に渡し、そこから元のインスタンスの変数を上書きしている問題が多い
オーバーロード: 同一クラス内に引数の数やデータ型が異なる同じ名前のメソッドを複数定義すること
※引数が正しいメソッドが自動で動く(他は動かない)
int a = 10;
int b = 20;
1: “hoge: “ + a + b; // “hoge1020” ← 先に10がStringに変換されてしまうため
2: “hoge: “ + (a + b); // “hoge30"
※1と2の違いを意識しよう
コンストラクタについて
- 別クラスからコンストラクタを呼び出すにはpublic修飾子 か 修飾子なし
- クラス名と同じ名前
- static, final修飾子をつけることはできない
コンストラクタ内から、同一クラス内の別コンストラクタを呼び出すにはthis()を使用するが、これは1行目に記述しなければならない。
this.変数名でインスタンス変数を指す
※インスタンス変数とローカル変数の出力の違いを問う問題が多い
抽象メソッドはオーバーライドする必要があるので、private修飾子は不可能
1つのJavaソースファイルに定義できるpublicクラスは1つのみ
クラス修飾子を指定していないと、アクセスできるのは同じパッケージ内
private修飾子を加えると、同一クラス内のメソッドやコンストラクタからのみアクセス可能
カプセル化の例
private int hoge;
public int getHoge(){
return hoge;
}
public void setHoge(){
this.hoge = hoge;
}
※変数(属性)はprivate, getter, setter(操作)はpublic
staticメンバは、複数のインスタンスを生成した場合でも、各staticメンバに対して1つの領域が確保される。
static変数は、クラスに属するため、すべての呼び出し元で共有される
同一クラス内に定義されているメソッドで、static修飾子がついていれば、インスタンス化せず、呼び出すことが可能
継承・ポリモフィズム
継承: サブクラスはスーパークラスの変数とメソッドを継承する
サブクラスでオーバーライドするメソッドにstatic修飾子を指定することはできない
protected修飾子: 同一パッケージ内か、継承したサブクラスからアクセスが可能
オーバーライドする場合の条件
- メソッド名が同じ
- 引数の数、データ型が同じ
- 戻り値の型が同じかサブクラス型
- スーパークラスとアクセス修飾子が同じか広い
サブクラスを定義する際に、スーパークラスの構成要素と同じ名前で宣言できるのは変数とメソッド
インタフェースの実装の場合の書き方:
implements インタフェース名, インタフェース名, ...
例) public class CellPhone extends Phone implements Camera, Display, Audio {}
abstract を指定できるのはクラスとメソッド
・暗黙的にキャストされる
サブクラス型 = スーパークラス型
・明示的にキャストが必要
スーパークラス型 = サブクラス型
super() がスーパークラスを指す
すべてのクラスが暗黙的にObjectクラスを継承している
※サブクラスのコンストラクタを呼ぶ際には、その前にスーパークラスのコンストラクタが呼ばれる
→ 明示的な呼び出しがない場合は、スーパークラスの引数なしのコンストラクタが呼ばれる
スーパークラスの参照情報しか持っていないものをサブクラスに代入しよう(明示的キャスト)とすると、ClassCastExceptionが発生する
packageに分類するには、クラスの1行目でpackege文を宣言する
別のパッケージに分類することにより、クラス名の衝突などを防ぎ、管理しやすくする
他のパッケージに属するクラスを使用する際には、import パッケージ名.クラス名; でインポートする
※IDE(Eclipseなど)を使っていると自動で追加されたりする
コンパイル時に java.langパッケージは暗黙的にインポートされる
import com.hoge.* (ワイルドカード)とすると、com.hoge直下のクラスをすべてインポートする(直下のみで階層が下のものはインポートされない)
これくらい覚えれば、受かるかと思う。
次はJava SE8についてかJava Silverについて書くと思う。