Java Basic 総復習
今まで、Javaを学習してきて、なんとなくはわかったけどクラスとかオブジェクトという言葉が出てきたら頭がこんがらがってきた。という事象があるかと思います。
<プログラミングのチュートリアル(説明)動画>
自分も昔そうでした。。。そうだったような気がします。
それならば、整理すれば良いのです。簡単な話です。
復習内容リスト
- プログラムの流れ
- 変数の扱い
- 式と演算子
- if文
- switch文
- while文
- for文
プログラムの流れ
まずは、プログラムの流れについて復習します。クラスやメソッドなどが出てきて処理があちこちに飛ぶように感じられると思いますが、そんなことはありません。順序立てて動いています。
まずは、メインメソッドが動く
どのクラスにも作成することができますが、1つのアプリケーションとして動かすときは、「必ずメインメソッドが動く」ということを忘れないでください。
例えば、下のようなコードがあったとします。
public class First {
public static void main(String[] args) {
System.out.println("Hello World");
First main = new First();
main.hello();
}
public void hello() {
System.out.println("Second Hello World");
}
}
この時に、メインメソッドの中では、クラスをnewしてやらないとメンバメソッド(インスタンスメソッド)は起動できません。
それは、「static」がついているメソッドは、特別なメソッドなので、インスタンスメソッドと区別されます。
ここでの、処理の順番は、以下のようになります。
- メインメソッドが動く
- 「Hello World」をコンソールに出力
- Firstクラスをインスタンス化
- インスタンスメソッドの「hello()」を呼び出す
このように動きます。ここでの注意ポイントは「First」クラス型の変数「main」です。
変数の扱い
変数はプログラムを動かすために必要になるものですが、あまり細かいところまで解説をすることが少ないです。
実際に、覚えることはint型は「整数」とか、「double」型は少数。。。
というように、データ型の用途に対する説明のみになってしまうからです。
変数には「プリミティブ型」と「参照型(クラス型)」がありますが、参照型に関しては自作クラスも参照型として分類されるので
プリミティブ型のように「これは整数型です」というような言い方ができません。
ただし、String型はクラス型です。他にも、int型を参照型にしたものがあります。それぞれ下のようになっています。
<プリミティブ型 -> 参照型>
- int -> Integerクラス
- double -> Doubleクラス
- boolean -> Booleanクラス
- long -> Longクラス
- float -> Floatクラス
<リテラルに関する解説>
変数の定義方法は全て同じ
今までよく目にしている、下のような変数の宣言は理解できていると思います。
int num = 0;
String str = "はじめの一歩";
変数の宣言・初期化は必ず「データ型 変数名 = 代入する値」という形で行います。
これは変数のデータ型がどんなものになっても変わりません。
<変数の扱い方>
データ型とは
以下のものがあります。
- int, double, float, lognなどのプリミティブ型と呼ばれる(分類される)変数の型
- String, 配列(int[], double[], String[], クラス名[])などの参照型と呼ばれる(分類される)変数の型
例. 変数宣言(初期化)
int num = 0;
String str = "はじめの一歩";
First main = new FIrst();
List<String> list = new ArrayList<String>();
Scanner scan = new Scanner(System.in);
Random rnd = new Random();
上から順に
- int型の変数numを0で初期化
- 文字列型(String型)の変数strを"はじめの一歩”で初期化
- First型の変数mainをFirstクラスのインスタンスを生成して初期化
- List\<String>型の変数listをArrayList\<String>クラスをインスタンス化して代入
- Scanner型の変数scanにScannerクラスをインスタンス化して代入
- Random型の変数rndにRandomクラスをインスタンス化して代入
式と演算子
演算子には以下のようなものがあります。
算術演算子:「+」 「-」 「*」 「/」 「%」 「^」 「++」 「--」
比較演算子:「==」 「!=」 「「<」 「>」 「<=」 「>=」
論理演算子:「&&」 「||」
そのほかの演算子
「instanceof」:クラス型の比較を行います。
String st = "aa";
if (st instanceof String) {
System.out.println("同じString型です。");
}
代入演算子:「=」値を代入します。
int num = 0; // int型の変数に0を代入
First first = new First(); // First型の変数firstにFirstクラスのインスタンスを代入
String st = "aaa"; // String型の変数stに文字列「aaa」を代入
ここで注意して欲しいのが、「1」と「"」がついていないもの、リテラル(値)は「数値」として扱われる。
逆に「"」で囲われているもの、リテラル(値)は文字列としてある変われる。
この「=」が、いまいち、ピンとこない人に向けて例を以下に書きます。
public static void main(String[] args) {
String st = getString();
}
public static String getString() {
return "String";
}
上のコードは、クラスを省略して書いていますが、メインメソッドから「getString()」というメソッドを呼び出します。
この「getString()」は返り値(戻り値)にString型(文字列型)を定義しています。
なので、「getString()」のメソッドを呼び出したらString型の値を受け取ることができます。
これに対して、クラスをnewして実行した時に関しても同じです。ちょっと長いですが。。。
public class Sample {
/** フィールド変数 */
private int field_int = 0;
private String field_String = "もじれつ";
//////// 注意(教科書の書き方はほぼ使わない) /////
// String package_String = "使わない";
public static void main(String[] args) {
// Sampleクラス型の変数mainにSampleクラスをインスタンス化して代入
Sample main = new Sample();
// 返り値(戻り値)が「void」の場合は変数を受け取る必要がない
main.hello();
staticHello();
// 返り値(戻り値)が定義されている場合(voidになっていない場合)
// 返り値(戻り値)を受け取ることができる
Sring result = getString();
System.out.println("getString()の戻り値は" + result);
}
public static void staticHello() {
System.out.println("Hello World");
}
/**
* <コンストラクタの書き方>
* アクセス修飾子 クラス名(引数) { ... }
*
* newした時の処理を書く
*/
public Sample() {
this.field_int = 5;
this.field_String = "aaaa時の値";
}
/**
* コンストラクタのオーバーロード
* @param num
* @param str
*/
public Sample(int num, String str) {
this.field_int = num;
this.field_String = str;
}
/**
* ハローメソッド
*/
public void hello() {
System.out.println(this.field_String);
this.hello("こんにちは、フィールド変数:" + this.field_int);
this.hello2();
}
/**
* ハローメソッド
*/
public void hello2() {
System.out.println(this.field_String);
this.hello("こんにちは、フィールド変数:" + this.field_int);
String st = "aa";
String gg = "ss";
if (st instanceof String) {
System.out.println("同じString型です。");
}
}
public String getString() {
return "String";
}
}
上記のコードのうち戻り値が「void」のものは以下になります。
- helllo()
- hello2()
- staticHello()
そして。返却値(戻り値)の指定があるもの(voidではないもの)は以下の通りです。
- getString()
このgetString()メソッドはString型の値を返しますので、呼び出し元(メインメソッド)ではString型の変数resultで受け取っています。
当然受け取らなくても良いので、下のように書いてもエラーは出ません。
getString();
上記の場合は、String型の値を受け取っても、変数に代入していないのでメインメソッドでは使用することができません。
使用する必要がなければ、このようなメソッドの呼び出しもOKです。
if文
条件分岐処理の構文です。
if (論理式) {
// trueの場合の処理
} else {
// falseの場合の処理
}
実際に使用するときは下のように書く
String st = "aa";
if (st instanceof String) {
System.out.println("同じString型です。");
}
if ("aa".equals(st)) {
System.out.println("stはaaです。");
} else if ("bb".equals(st) ) {
System.out.println("stはbbです。");
} else {
System.out.println("stはその他の値です。");
}
それぞれ
の「論理式」の部分で値が「true / false」が帰ってきたところで処理の流れが変わります。if (論理式) { ... }
論理式
返り値としてbooleanが返される式のことです。以下の指揮がそれにあたります。
boolean isTrue = "aaa".equals("aaa");
boolean isFalse = "aAb".equals("aaa");
isTrue = 1 == 1;
isFalse = 2 == 1;
isTrue = 1 < 2;
isFalse = 1 != 2;
「返る」というのは「=」の反対側に値を渡すという意味です。
switch文
上記のif文と同じ処理がかけます。下のようになります。
switch(st) {
case "aa":
System.out.println("stはaaです。");
break;
case "bb":
System.out.println("stはbbです。");
break;
default:
System.out.println("stはその他の値です。");
}
while文
繰り返し処理の最もシンプルなものです。
下のように論理式の結果が「true」の間繰り返し処理を行います。
int num = 0;
while (num < 10) {
System.out.println("num = " + num);
num++;
}
上のコードは「num = 0」〜「num = 9」までを表示します。
for文
繰り返し処理の最もおポピュラーなものです。
for (int i = 0; i < 10; i++) {
System.out.println("num = " + num);
}
上のコードは「num = 0」〜「num = 9」までを表示します。
大まかに基本文法と変数の扱い方などを記載しました。