開発ノート【java基本文法】
開発ノート【java基本文法】です。
当サイトは、Bootstrap5で製作しています。
java基本文法
ソースコードの入力ルール
- 半角英数字で記述する。(文字列は除く)
- 大文字と小文字は区別される。
- 文末は、;(セミコロン)で終わる。
命名規則
クラス名
-
SampleApp
単語の先頭を大文字にする。
メソッド名、変数名
-
getValue
単語の先頭を小文字にする。
※2番目以降の単語の先頭は大文字にする。(見やすくするため)
メソッド名
-
getValue
名詞+動詞の形にする。
※getのように動詞だけでもok。
定数名
-
FLAG_ON
全て大文字にする。
変数、型、値(リテラル)
-
変数
データ(値、リテラル)の入れ物のこと。 -
型
変数に入る値に応じたデータ属性のこと。(文字、数値) -
リテラル
ソースコードにおいて使用される、定数のこと。
値そのものを指すこともある。
データ型の種類
-
整数型(byte、short、int、long)
byteは、バイトデータを表すための型。
整数目的なら、short、int、longのいずれかを使う。
short、int、longの違いは、表現できる値の範囲だけ。
基本はintを使い、それで不足の場合のみlongを使う。
shortを使うことは殆どない。 -
桁区切りとして、値に「_」を入れることが可能。
これは見やすくした記述で、Javaの処理に影響はない。 -
浮動小数点型(float、double)
float、doubleの違いは、表現できる値の範囲だけ。
基本はdoubleを使う。
floatを特定させたいのなら、「f」又は「F」を値の末尾に記述。
指数表現も可。
「1.234E5」は「1.234×10^5」のこと。
この場合、大文字小文字は区別しない。float f = 1.1234f; double d1 = 1.1234; double d2 = 100.006d double d3 = 1.1234E5; // 指数表現 -
文字型(char、String)
unicode(UTF-16)で表す。
内部的には16ビットの整数(0~65535)で表現。
charは、シングルクォーテーション(')で括る。
Stringは、ダブルクォーテーション(")で括る。
文字そのものを指定する他、uxxxxの形式で文字を表すことも出来る。char c1 = 'あ'; char c2 = 0x5f01; // 16進数の文字コード表現 char c3 = '\u5f01'; // 16進数の文字コード表現String str1 = "abc"; String str2 = "あいうえお"; -
エスケープシーケンス(特殊な文字の表現)
タブや改行といったキーボードから入力できない特殊な文字を表現するための方法。
「\」+特定の文字で表現する。
エスケープシーケンス 説明 \b バックスペース \t 水平タブ \n 改行 \r 復帰(キャリッジリターン) \f 改ページ \' シングルクォーテーション \" ダブルクォーテーション \\ \文字 \ooo 8進数の文字コードが表す文字 \uhhhh 16進数の文字コードが表す文字(unicode) String str1 = "私の名前は\"鈴木\"です"; // 私の名前は"鈴木"です String str2 = "この魚の値段は\\250です"; // この魚の値段は¥250です -
配列型
複数の値を一つの変数で扱うしくみ。
型の後ろに[]を付ける。
または、変数名の後ろに[]を付ける。int[] data = new int[5];int data[] = new int[5];要素のインデックスは0~。
要素数が5の場合、インデックスは0~4。
基本型(プリミティブタイプ)
| 型 | java | 説明 | 使用例 |
|---|---|---|---|
|
整数型 ※接頭辞として0b、0、0xを付けると、それぞれ2進数、8進数、16進数を表す。 |
byte |
8bit:8桁の2進数 (-128~127) |
byte b = -128;
|
| short |
16bit:16桁の2進数 (-32,768~32,767) |
short s = 32767;
|
|
| int |
32bit:32桁の2進数 (-2,147,483,648~2,147,483,647) ※最も使われている。 |
int i1 = 1_380; // 桁区切り記号_利用可(Java SE7~)
int i2 = 0b0010; // 2進数(0b~。Java SE7~)
int i3 = 010; // 8進数(0~)
int i4 = 0xFF; // 16進数(0x~)
|
|
| long |
64bit:64桁の2進数 (-9,223,372,036,854,775,808~9,223,372,036,854,775,807) |
long l1 = 1000;
long l2 = 763L;
|
|
| 浮動小数点型(実数) | float | 32bit:32桁の2進数 |
float f = 1.1234f;
|
| double |
64bit:64桁の2進数 ※最も使われている。 |
double d1 = 1.1234;
double d2 = 100.006d
double d3 = 1.1234E5; // 指数表現
|
|
| 文字型 | char |
16bit/1文字 unicode文字(u0000~uffff) ※シングルクォーテーション(')で括る。 |
char c1 = 'あ';
char c2 = 0x5f01; // 16進数の文字コード表現
char c3 = '\u5f01'; // 16進数の文字コード表現
|
| String | ※ダブルクォーテーション(")で括る。 |
String str1 = "abc";
String str2 = "あいうえお";
|
|
| 論理型(真偽値) | boolean(ブーリアン) |
8bit ※true又はfalseのいずれかしか持たない型です。 |
boolean flag = 1;
|
参照型
| 型 | java | 説明 | 使用例 |
|---|---|---|---|
| クラス型 | データ(フィールド)と手続き(メソッド)を持つデータ構造のこと。 | ||
| インターフェイス型 | |||
| 配列型 | 値の集合のこと。 |
int[] data1 = new int[5]; // 配列を宣言
data1[0] = 10; // data1[0]に値10を代入
System.out.println(data1[0]); // 結果:10
System.out.println(data1.length); // 結果:5
※length:配列の宣言数。インデックスの上限は、length – 1(0~4)。
int[] data2 = { 1, 2, 3 }; // 初期値をセット
System.out.println(data2[0]); // 結果:1
int[][] data3 = { // 初期値をセット(2次元)
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
System.out.println(data3[0][2]); // 結果:3
|
値(リテラル)
-
リテラルの型の特定
数値リテラルでは、型を指定しなかった場合、デフォルトでintと見なされます。
型を特定させたいのなら、「L」(long型)を値の末尾に記述します。System.out.println(2147483648L);
| 型 | java | 説明 | 使用例 |
|---|---|---|---|
|
整数型 ※接頭辞として0b、0、0xを付けると、それぞれ2進数、8進数、16進数を表す。 |
byte |
byte b = -128;
|
|
| short | 1000 |
short s = 32767;
|
|
| int | 1000 |
int i1 = 1_380; // 桁区切り記号_利用可(Java SE7~)
int i2 = 0b0010; // 2進数(0b~。Java SE7~)
int i3 = 010; // 8進数(0~)
int i4 = 0xFF; // 16進数(0x~)
|
|
| long |
1000 763L |
long l1 = 1000;
long l2 = 763L;
|
|
| 浮動小数点型(実数) | float |
0.2 1.25f |
float f = 1.1234f;
|
| double |
0.2 100.006d |
double d1 = 1.1234;
double d2 = 100.006d
double d3 = 1.1234E5; // 指数表現
|
|
| 文字型 | char |
'b' '3' |
char c1 = 'あ';
char c2 = 0x5f01; // 16進数の文字コード表現
char c3 = '\u5f01'; // 16進数の文字コード表現
|
| String |
"Hello" "720p" |
String str1 = "abc";
String str2 = "あいうえお";
|
|
| 論理型(真偽値) | boolean(ブーリアン) |
boolean flag = 1;
|
|
| 8進数 |
0256 ※先頭に0(ゼロ)が付く。 |
||
| 16進数 |
0xBF ※先頭に0x(ゼロエックス)が付く。 |
変数の宣言と初期化
int i1; // 変数を宣言
i1 = 100; // 値を代入
System.out.println(i1); // 結果:100
String str1; // 変数を宣言
str1 = "abc"; // 値を代入
System.out.println(str1); // 結果:abc
配列
int[] data1 = new int[5]; // 配列変数を宣言
data1[0] = 10; // 値を代入
System.out.println(data1[0]); // 結果:10
System.out.println(data1.length); // 結果:5
※length:配列の宣言数。インデックスの上限は、length – 1(0~4)。
int[] data2 = { 1, 2, 3 }; // 配列変数を宣言と初期値をセット
System.out.println(data2[0]); // 結果:1
int[][] data3 = { // 配列変数を宣言と初期値をセット(2次元)
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
System.out.println(data3[0][2]); // 結果:3
コンストラクター
クラスからオブジェクトを作成したとき、自動的に実行されるメソッドのこと。
インスタンスの生成時に、変数の初期化を行える。
変数を宣言したときに初期値を設定することも出来るが、その場合は固定した値しか設定することが出来ない。
そのようなときに、コンストラクターを使う。
class Staff {
String name;
int staffid;
String mail;
public void sayhello() {
System.out.println("Hello " + this.name);
System.out.println("staffid=" + this.staffid);
System.out.println("mail=" + this.mail);
}
// コンストラクターを生成
// ECLIPSEメニューバーから、[ソース]-[フィールドを使用してコンストラクターを生成]
public Staff(String name, int staffid, String mail) {
super();
this.name = name;
this.staffid = staffid;
this.mail = mail;
}
}
public class Staffinfo {
public static void main(String[] args) {
// 個々に初期化を行う(但し、値の変更は不可)
// Staff yamada = new Staff();
// yamada.name = "Taro Yamada";
// yamada.staffid = 12345;
// yamada.mail = "yamada@abc.co.jp";
// コンストラクターを使って、インスタンスの生成と初期化を一度に行う
Staff yamada = new Staff("Taro Yamada",12345,"yamada@abc.co.jp");
yamada.sayhello();
}
}
ゲッターとセッター
インスタンスのメソッドやフィールドに値をセットしたり、参照したり出来るメソッドのこと。
class Staff {
String name;
int staffid;
String mail;
// public void sayhello() {
// System.out.println("Hello " + this.name);
// System.out.println("staffid=" + this.staffid);
// System.out.println("mail=" + this.mail);
// }
// コンストラクターを生成
// ECLIPSEメニューバーから、[ソース]-[フィールドを使用してコンストラクターを生成]
public Staff(String name, int staffid, String mail) {
super();
this.name = name;
this.staffid = staffid;
this.mail = mail;
}
// ゲッターとセッターを生成
// ECLIPSEメニューバーから、[ソース]-[getterおよびsetterの生成]
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStaffid() {
return staffid;
}
public void setStaffid(int staffid) {
this.staffid = staffid;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
}
public class Staffinfo {
public static void main(String[] args) {
// 個々に初期化を行う(但し、値の変更は不可)
// Staff yamada = new Staff();
// yamada.name = "Taro Yamada";
// yamada.staffid = 12345;
// yamada.mail = "yamada@abc.co.jp";
// yamada.sayhello();
// コンストラクターを使って、インスタンスの生成と初期化を一度に行う
Staff yamada = new Staff("Taro Yamada",12345,"yamada@abc.co.jp");
// ゲッターメソッドを使って社員情報を表示
System.out.println("【社員情報】");
System.out.println("氏名: " + yamada.getName());
System.out.println("社員番号: " + yamada.getStaffid());
System.out.println("Email: " + yamada.getMail());
}
}
算術演算子
int a = 18;
int b = 4;
System.out.println(a+b); // 結果:22
System.out.println(a-b); // 結果:14
System.out.println(a*b); // 結果:72
System.out.println(a/b); // 結果:4
System.out.println(a%b); // 結果:2
※「%」は余り。
代入演算子
a += b; // a = a + b;
a -= b; // a = a - b;
a *= b; // a = a * b;
a /= b; // a = a / b;
a %= b; // a = a % b; aをbで割った余りをaに代入
インクリメント演算子
1増やす。
回数を数えるプログラムでよく使う。
b = ++a; // 【前置】aを1増やしてから、bにaを代入する(a=b)
b = a++; // 【後置】bにaを代入してから、aを1増やす(a≠b)
デクリメント演算子
1減らす。
回数を数えるプログラムでよく使う。
b = --a; // 【前置】aを1減らしてから、bにaを代入する(a=b)
b = a--; // 【後置】bにaを代入してから、aを1減らす(a≠b)
比較演算子
条件によって処理を分岐したいときに使用する。
条件式が成立すれば、true。
成立しないと、false。
-
a == b
aとbが等しい。 -
a != b
aとbが異なる。 -
a > b
aはbより大きい。 -
a >= b
aはbと等しいか、大きい。 -
a < b
aはbより小さい。 -
a <= b
aはbと等しいか、小さい。 -
instanceof(オブジェクトの型を動的に判定する演算子)
以下のような用途で使う。
・オブジェクトが、あるクラスのインスタンスか
・オブジェクトが、あるクラスの子クラスのインスタンスか
・オブジェクトが、特定のインターフェースを実装したインスタンスかpublic class InstanceOfDemo { public static void main(String[] args) { // 親クラスのインスタンスを作成する ParentClass p = new ParentClass(); printInstance(p); System.out.println("---"); // 子クラスのインスタンスを作成する ChildClass c = new ChildClass(); printInstance(c); } private static void printInstance(Object obj) { // ParentClassのインスタンスか判定する if (obj instanceof ParentClass) { System.out.println("オブジェクトはParentClassのインスタンスです"); } // ChildClassのインスタンスか判定する if (obj instanceof ChildClass) { System.out.println("オブジェクトはChildClassのインスタンスです"); } } } // 親クラス class ParentClass { } // ParentClassを継承する子クラス class ChildClass extends ParentClass { }実行結果
オブジェクトはParentClassのインスタンスです
---
オブジェクトはParentClassのインスタンスです
オブジェクトはChildClassのインスタンスです
補足
printInstance(p);の実行結果
---
printInstance(c);の実行結果
※「ParentClassを継承する子クラス」は、「オブジェクトはParentClassのインスタンスです」も表示する。
論理演算子
-
&と&&の違い
どちらも「左辺と右辺がtrueの場合にtrueを返す」ということは、左辺がfalseなら右辺は評価するまでも無く、結果はfalseです。
このようなときでも、右辺を評価するのが&、右辺を評価しないのが&&です。 -
|と||の違い
どちらも「左辺と右辺のいずれかがtrueの場合にtrueを返す」ということは、左辺がtrueなら右辺は評価するまでも無く、結果はtrueです。
このようなときでも、右辺を評価するのが|、右辺を評価しないのが||です。 - 「&と&&」、「|と||」は、特別な理由が無い限り、「&&」「||」 を使用した方がいい。
| java | 論理演算子 | 説明 |
|---|---|---|
| & | 論理積(AND) |
左辺と右辺が両方ともtrueのとき、trueを返す。 (左辺がfalseのときでも、右辺を評価する) |
| && | 論理積(AND) |
左辺と右辺が両方ともtrueのとき、trueを返す。 (左辺がfalseのときは、右辺を評価しない) |
| | | 論理和(OR) |
左辺と右辺のどちらかがtrueのとき、trueを返す。 (左辺がtrueのときでも、右辺を評価する) |
| || | 論理和(OR) |
左辺と右辺のどちらかがtrueのとき、trueを返す。 (左辺がtrueのときは、右辺を評価しない) |
| ! | 否定(NOT) | trueのときはfalse、falseのときはtrueを返す。 |
| ^ | 排他的論理和(XOR) | 左辺と右辺が異なるとき、trueを返す。 |
論理積(100までで2と3の共通の公倍数を表示)
public class CommonMultiple {
public static void main(String[] args) {
int i = 1;
while (i < 100) {
if ((i % 2 == 0) && (i % 3 == 0)) {
System.out.println(i);
}
i++; // インクリメント演算子
}
}
}
論理和(50までで2と3の倍数を表示)
public class CommonMultiple2 {
public static void main(String[] args) {
int i = 1;
while (i < 50) {
if ((i % 2 == 0) || (i % 3 == 0)) {
System.out.println(i);
}
i++; //インクリメント演算子
}
}
}
否定(20までで2と3の公倍数以外の数を表示)
public class CommonMultiple3 {
public static void main(String[] args) {
int i = 1;
while (i < 20) {
if (!((i % 2 == 0) && (i % 3 == 0))) {
System.out.println(i);
}
i++; //インクリメント演算子
}
}
}
&&を使わないと不具合を起こす事例
val(String型)がnullでも空でもないという判定を行うとき
// &&を使えば、nullだったとき、右辺は評価されないため正しい判定が出来る。
(val != null && val.equals(""))
// &を使ってしまうと、nullだったとき、NullPointerExceptionが発生してしまう。
(val != null & val.equals(""))
equalsメソッド:参照型の文字列比較をする命令文。(一致:true、不一致:false)NullPointerException:valがnullなのにequalsを実行したために発生したエラー。
クラスの継承
既存のクラスをベースにして継承し、新たなクラスを生成して使用すること。
※tanaka.getName()は、RemoteStaffクラスがStaffクラスを継承しているため、ゲッターメソッドを使うことができる。(68~70行目)
※tanaka.locationは、RemoteStaffクラスに生成した変数。
class Staff {
String name;
int staffid;
String mail;
// コンストラクターを生成
// ECLIPSEメニューバーから、[ソース]-[フィールドを使用してコンストラクターを生成]
public Staff(String name, int staffid, String mail) {
super();
this.name = name;
this.staffid = staffid;
this.mail = mail;
}
// ゲッターとセッターを生成
// ECLIPSEメニューバーから、[ソース]-[getterおよびsetterの生成]
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStaffid() {
return staffid;
}
public void setStaffid(int staffid) {
this.staffid = staffid;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
}
// Staffクラスを継承してRemoteStaffクラスを生成
class RemoteStaff extends Staff {
public String location;
// RemoteStaffのコンストラクターを生成
// ECLIPSEメニューバーから、[ソース]-[スーパークラスからコンストラクターを生成]
public RemoteStaff(String name, int staffid, String mail) {
super(name, staffid, mail);
}
}
public class Staffinfo {
public static void main(String[] args) {
// コンストラクターを使って、インスタンスの生成と初期化を一度に行う
Staff yamada = new Staff("Taro Yamada",12345,"yamada@abc.co.jp");
RemoteStaff tanaka = new RemoteStaff("Hanako Tanaka",12456,"tanaka@abc.co.jp");
tanaka.location = "大阪";
// ゲッターメソッドを使って社員情報を表示
System.out.println("【社員情報】");
System.out.println("氏名: " + yamada.getName());
System.out.println("社員番号: " + yamada.getStaffid());
System.out.println("Email: " + yamada.getMail());
System.out.println("【社員情報】");
System.out.println("氏名: " + tanaka.getName());
System.out.println("社員番号: " + tanaka.getStaffid());
System.out.println("Email: " + tanaka.getMail());
System.out.println("勤務地: " + tanaka.location);
}
}
インスタンスの参照
Computer desktop2 = desktop;
desktopのインスタンス先(リンク先)をdesktop2にコピーしているだけ。(実データのコピーではなく、実データがあるメモリのアドレスをコピーしている)
これを「desktop2は、desktopのインスタンスを参照している」と言っている。
desktopとdesktop2を分けて実データを持ちたいのなら、新たなインスタンスをnewで生成する必要がある。
class Computer {
public String os;
public int memory;
public int storage;
}
public class ComputerInfo {
public static void main(String[] args) {
Computer desktop = new Computer();
desktop.os = "Windows 10";
desktop.memory = 4;
desktop.storage = 256;
System.out.println("OS:" + desktop.os);
System.out.println("Memory:" + desktop.memory + "GB");
System.out.println("Storage:" + desktop.storage + "GB");
// インスタンスの参照
Computer desktop2 = desktop;
desktop2.os = "Ubuntu";
System.out.println("\nOS:" + desktop2.os);
System.out.println("Memory:" + desktop2.memory + "GB");
System.out.println("Storage:" + desktop2.storage + "GB");
System.out.println("\nOS:" + desktop.os);
System.out.println("Memory:" + desktop.memory + "GB");
System.out.println("Storage:" + desktop.storage + "GB");
}
}
実行結果OS:Windows 10
Memory:4GB
Storage:256GB
OS:Ubuntu
Memory:4GB
Storage:256GB
OS:Ubuntu ⟵ 「OS:Windows 10」ではない。
Memory:4GB
Storage:256GB
補足
desktop2.osの値を"Ubuntu"に変えたことで(22行目)、desktop.osの値も変わった。
インターフェイス
初めに具体的な処理内容を書かずに、後からメソッドの実装をする。
後でメソッドの実装をするため、処理を変えたいときに有効。
インターフェイスは、定数とメソッドのみが定義出来る。(13~18行目)
変数は自動的に、public static finalが付けられるため、定数になる。
メソッドは抽象メソッドと同様に、インターフェイスを実装したクラスでメソッドを実装する必要がある。
クラスにインターフェイスを実装する際は、implementsを使う。(21,28行目)
// インターフェースを実装したクラスを実行するクラスを作成
public class Dummy3 {
public static void main(String[] args) {
Add add = new Add();
add.calc();
Sub sub = new Sub();
sub.calc();
}
}
// インターフェイスの作成
interface Calc {
int NUM1 = 1;
int NUM2 = 2;
void calc();
}
// インターフェイスを実装し、足し算するクラスを作成
class Add implements Calc {
public void calc() {
System.out.println(NUM1 + NUM2);
}
}
// インターフェイスを実装し、引き算するクラスを作成
class Sub implements Calc {
public void calc() {
System.out.println(NUM1 - NUM2);
}
}
実行結果3
-1