java

1.Javaについて

(1)学習について

身に付けるのは結構大変だと思います。あるところまでのレベルになるまでが大変です。まず、開発環境を作るものまあまあ手間です。以下のサイトだと、開発環境が不要で、ブラウザ上でコンパイルと実行ができるので便利です。学習するだけなら、手軽さを考えても一つの選択肢になると思います。
https://paiza.io/ja

(2)言葉

・JRE(Java Runtime Environment)
 Javaを使うための環境というかソフト。実行するための必要なライブラリも含んでいる
・JDK(Java Development Environment)
 Javaの開発環境。これがないと、javacなどのコマンドによるコンパイルができません
・Javaのアプリケーションとアプレットとサーブレット
 簡単にいうと、Javaのアプリケーションは、OS上で実行されるプログラム。アプレットは、Web上で動くプログラム、サーブレットは、Webサーバ側で動く。アプレットの場合は、端末側にJavaの環境が必要。サーブレットの場合は、端末側にはブラウザさえあればいいので、サーブレットが今の主流。→JSP
・JavaはAndoroidでも利用されており、スマホアプリはJavaで書かれることが多い。→だから、Javaプログラマにニーズが高まっている。

(3)開発環境Eclipseのダウンロードとインストール

❶ダウンロード
http://mergedoc.osdn.jp/
pleiades-4.7.2-java-win-64bit-jre_20171225.zipをダウンロード。
最新版(左上)を選択して次の画面。Windowsの64bit版の、JavaのFullEditionをダウンロード。
かなり容量が大きい(1.7GB)
❷インストール
なぜか7zipでしか解凍できない。7zipで展開
❸起動
eclipseフォルダにeclipse.exeがあるので、それを起動する

(4)Eclipseの使い方

操作方法は、以下がわかりやすい
https://blog.codecamp.jp/eclipse
プログラムを書いて、
メニュー⇒実行→実行→Javaアプリケーション で画面に出力される

以下、自分でもやってみた
❶Javaプロジェクトの作成
「Javaプロジェクトの作成」をクリックして、プロジェクトの名前を付ける(testとした)
※「ファイル」>「新規」>「Javaプロジェクト」でもいい。項目はデフォルトのまま。
※モジュールも作成するか。→作成する必要はない。必要であれば後から作る
(❷パッケージを作成する) ※作る必要は無し。
 クラスをグループ分けする機能。無くてもいいが、作らなくても勝手に作られる。
 一番上のtestというプロジェクトを右クリックして、「新規」でパッケージを作る
❸作成したパッケージを右クリックして、パッケージの直下にClassを作る
→パッケージを作らなかったら、srcフォルダを右クリック、「新規」「クラス」を作る。
 名前だけを付ける。名前は先頭が大文字 →TestClassとした。すると、TestClass.javaというファイルが作成された。
❹作成したClassに対して、ソースを記述する。※追記する

    public static void main(String[] args) {
        System.out.println("Hello");
    }

❺保存する
Ctl+S
❻メニューバーの「実行」>「実行」>「Javaアプリケーション」

Q.mainじゃなくてもいいの?
A.クラス名は何でもいい。mainメソッドがあればいい。なので、以下で実行できる。
ファイル名:TestClass2.java

package test2;

public class TestClass2 {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

Q.動かなかった
A.上記の package test2; を勝手に消すと、動かなかった

Q.ファイルをインポートするには?
A.普通にドラッグすればいい

Q.classファイル必要?
A.Eclipseが自動でコンパイルしてくれてClassファイルを作っているので、不要。コマンドで実行する場合は、classファイルが必要。

Q.Eclipseで保存したファイルは、どこに保存されているの?
A.上のバーに表示されているところに保存されている。基本的にはEclipseの同じフォルダ

(5)Javaで作成するプログラムファイルとコンパイル

①ソースファイルの作成
プログラムのソースファイルの拡張子は .java とする
(例) Pg1.java

※クラスの名前とファイル名を同じにする必要あり。

public class Pg1 {

としたら、ファイル名はPg1.javaとする。

②コンパイル
 コンピュータが理解できる言葉に変換するために、コンパイルをする
 このときのコマンドはjavac 

(例)

> javac Pg1.java

 すると、pg1.classという売クラスファイルが作成される。.classのファイルは中間コード(バイトコード)と呼ばれる

③プログラムの実行
 コンパイルしたファイルを実行する。このとき、クラス名だけでよく、拡張子の.classは不要

> java pg1

2.基礎の基礎

(1)とにかく、プログラムを書いて、動かしてみよう!

おまじない系の文字列が多い。
以下のように、classを定義して、mainメソッドが必要であったりするのであるが、以下のサイトだと、オマジナイ系をすでに書いてくれているから便利だ。
https://paiza.io/ja/projects/new

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        
        System.out.println("XXXXXXXX");
    }
}

余分なものを消して、Helloと表示するだけだと以下

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

これを実行すると、以下のようにHelloと出る。

Hello

ちなみに、pythonと違って、{を使っているため、インデントは適当でもいい。
もう少し複雑?にしてみる。コメントを入れたり、変数を使ったりしている。

public class Main {
 /**
  * hell という文字を表示する
  変数aに入れた値1を表示
  */
 public static void main(String[] args) {
  System.out.println("hello");
  int a=1;
  System.out.println("aの値は、" + a + "です。");
 }
}
(2)もろもろ

・命令を1行にまとめるには、 ; でつなげる。たとえば、int a = 1; int b = 2 ;
・インデントは必要がない。ただ、インデントをしないと見づらい。インデントはソフトに任せた方がいい。
・たまに、以下のように、最後の最後で}の前に空行がある場合があるが、あまり意味はない。ちなみに、paizaは自動で空けてくる。

    }
 
}

❶エスケープシーケンス

\n //改行
\'     //   'の意味。\をつけないと、プログラム上の意味で利用される

❷コメントの書き方

// 1行のコメント
/*
    この間に複数行のコメントを書く
*/

❸プログラムの正常終了
使い方がよくわかっていないが
System.exit(0); 

3.文字列などの表示

(1)System.out.println

・表示するにはSystem.out.printlnを使う
・変数を記載すると値が表示される。
・文字は(と)で囲うに加え、"と"で囲うことで、そのまま表示する。文字や変数をつなぎ合わせるのに+を使う。

  int a=1;
  System.out.println("aの値は、" + a + "です。");

・System.out.printを使うと、最後に改行コードが入らない。つまり、printlnのlnは改行(line)の意味である。まあ、厳密には、改行はLF(Line Feed)だと思う。

4.変数とデータ型

(1)変数とデータ型について

❶型の宣言
・型の宣言は必ず必要。
・なぜ型が必要か。それは、変数ごとに値を格納するメモリ領域を確保するため。メモリ領域にどれだけのサイズを確保するかを決めるために型がある。
たとえば、intは4バイト、longは8バイト、charは2バイト、など。
・型が違うと代入できない。たとえば、int型の変数に3.2の小数を入れることはできない。ただ、逆というか、大きなサイズに小さなサイズの型は入る。たとえば、float型の変数に、整数3を入れることは可能。ただ、実際には3.0などのfloat型に変換されている。

❷変数
・大文字小文字は区別される
・小文字で作成するのが一般的というか慣習。単語をつなげる場合、2つ目は大文字にすることが多い。newDataなど
・変数には、intやchar、double、booleanなどの基本型とString型、配列などの参照型がある。基本型は値がそのまま入っているが、参照型は、データを格納している場所の情報を格納している

(2)数字

整数の型は、int(4バイト) とlong(8バイト)があるが、厳密にはshort(2バイト)とbyte(1バイト)がある。一般的にはintを使いましょう。
※また、Integer型もある。
techacademy.jp

❶int 4バイト整数
・4バイト=32ビットなので、そこそこの大きな数が扱える。1ビットは符号に使うが、31ビットあるので、-2147483648~2147483647の数。
・書き方は以下です。

int n;
n=123;

または

int n = 123;

intは整数型なので、i =5/2 とすると、2.5であるが、小数点は切り捨てられて2になる。
たとえば、以下を実行すると、2が表示される。

public class Main {
    public static void main(String[] args) {
        // Your code here!
        int i=5;
        i=i/2;
        System.out.println(i);
    }
}

❷long 8バイト整数
・符号が1ビットあるが、2の64乗の数が扱える。
・末尾にlongを意味するLまたはlを付ける。小文字lだと1と間違えやすいので、大文字Lがいいだろう。ただ、intで扱える範囲の数であれば、Lを付与しなければintとして扱われるので、エラーにはならない。

long m;
m=123456789L; //末尾にLまたはlをつける。

または、

long m=123456789L;

❸小数
1.234などの小数(浮動小数点)を扱う場合は、float、double型を使う。一般的にはdoubleを使う。floatを使う場合は、longでLを付けたように、最後にF(またはf)をつける。

(3)文字および文字列

・文字(char)と文字列(String)で囲い方が違う。シングルか、ダブルクォーテーションか。
・改行コードは \r 

❶char 文字(1文字) 
文字はシングルクォーテーション(')で囲う

char c;
c= 'A'; // 'で囲う(Stringは")

❷String 文字列  
・先頭のSは大文字
・文字列はダブルクォーテーション(")で囲う

String mojiretsu = "Hello!";
(4)その他

⑤bolean型
boolean型(ブーリアンと読む)は、trueかfalseを表す

5.演算

(1)演算について

・3+5=8という式において、3や5をオペランド、+や=を演算子という。数字の代わりに変数や文字であってもオペランドという。
・リテラルは、まずは「値」のこと、と考えよう。たとえば、x=5の5という値や、x='Hello'のHelloという文字がリテラルである。
リテラルは型を持ち、上の5というのは整数型(?)のリテラルで、Helloというのは文字型(?)のリテラル。
・簡単な演算をやってみよう

public class Main {
    public static void main(String[] args) {
        int a;
        int b;
        a = 10;
        b = a * 5;
        System.out.println("a = " + a + ", b = " + b); // ===> a = 10, b = 50
    }
}
(2)演算子

❶普通の演算子

演算子 内容
+
-
/
% 余り。たとえば、a%3 であれば、aを3で割った余り

❷代入演算子、インクリメント・デクリメント演算子
・以下の上2つは、演算子の右のオペランドを左の変数に代入するから、代入演算子と言われる。
・下2つは、増やしたり減らしたりするので、インクリメント・デクリメント演算子と言われる。

n += 5;  // n=n+5
n -= 5;  // n=n-5
n++;       // n=n+1
n--;         // n=n-1
(3)文字の演算

文字列でも使える。文字を結合することができる。

public class Main {
    public static void main(String[] args) {
        String a;
        a="こん"+"にちは";
        System.out.println(a);
        }
}

※残念ながら、引き算や他の演算はできない・・・。まあ、当然か。

(4)その他

❶大きい値を出力
Math.max命令を使う

public class Main {
    public static void main(String[] args) {
        int a = 10; int b = 20;
        int x = Math.max(a, b);
        System.out.println(x); // ===> 20
    }
}

5.キーボードから値を入力する

書き方はいろいろあるみたいだが、簡略化するためにutil.Scannerをインポートしておこう。

import java.util.Scanner;

以下は、入力した値をnumという変数に入れる場合。

int num = new java.util.Scanner(System.in).nextInt();

※数字の入力なので、 nextInt()を使っている

(1)数字の入力

・数字の入力なので、 nextInt()を使う
・System.out.printlnを使って入力に関する説明をするメッセージを出す
・入力された数字をnumに入れる
・その結果をSystem.out.printlnを使って出力

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.println("好きな数字は?");
        int num = new java.util.Scanner(System.in).nextInt();
        System.out.println("あなたの好きな数字は " + num + " です!");
    }
}

このとき、printlnではなく、printを使うと、改行されないので、カーソルがすぐ横に表示される。このあたりは好みもあるだろう。
では、実行してみよう。
2を入力すると、出力結果は以下。

好きな数字は?
あなたの好きな数字は 2 です!
(2)文字の入力

・Javaの場合は、変数によって命令が変わる。数字(int型)の場合はで、 nextInt()を使ったが、文字(String)の場合は、String型にして、nextInt()の代わりにnext()、またはnextLine()を使う
・以下がそのソースであるが、入力値が文字列なので、 String word にしている。wordは変数の名前。こうしないとエラーになるので、良かったら試してほしい。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.println("好きな文字は?");
        String word = new java.util.Scanner(System.in).next();
        System.out.println("あなたの好きな文字は " + word + " です!");
    }
}

6. if文による条件分岐

(1)基本構文
条件式 解説
if (n >= 10) nが10以上なら
if (n == 10) 【数字限定】nが10なら。=を2つ 【文字】==の代わりに、equalsを使う
if (n != 10) nが10でないなら
if (moji.equals("終わり") mojiが「終わり」だったら。文字列の場合は==ではなく、.equalsを使う
if (value != false) valueがfalseでなければ

・文字列(String)の場合は、equalsを使う

public class Main {
    public static void main(String[] args) {
        String you="Pa";
        if (you.equals("Pa")) {
            System.out.print("負け");
        } else if(you.equals("Choki")){
            System.out.print("勝ち");
        } else if(you.equals("Gu")){
            System.out.print("アイコ");
        }
    }
}
(2)オプション(論理演算子)
条件式 解説
&& 2つの条件のAND
|| 2つの条件のOR
条件の否定  →(例) if (!n==0) {

たとえば、

 if (age >= 20 && sex.equals("男") {
(3)三項演算子

a>b ? 1:2 a>bであれば1そうでなければ2を返します。

(4)基本構文

❶ifだけ

        if (条件式) {
            命令など;
        } 

たとえば、20歳以上なら「大人」と表示するだけは以下。

public class Main {
    public static void main(String[] args) {
        int age = 35;
        if (age >= 20) {
            System.out.print("大人"); // ====> 大人
        } 
    }
}

❷if else if else

        if (条件式1) {
           命令など;
        } else if(条件式2){
            命令など;
        } else {
            命令など;
        }

たとえば、年齢で大人か子供を判断する場合

public class Main {
    public static void main(String[] args) {
        int age = 15;
        if (age >= 20) {
            System.out.print("大人");
        } else if(0 <= age){
            System.out.print("子供");
        } else {
            System.out.print("正しく入力してください");
        }
    }
}

⇒⇒この場合は書きにくいが、if文をswitchでも書くことができる。
  switch(条件)
 case 条件の値1: //ここはコロン:
   処理;
   break;
  switch(条件)
 case 条件の値2: //ここはコロン:
   処理;
   break;

7. forやwhileによるループ

(1)forによる繰り返し

サンプルは、以下で、iの値を0~4まで表示する。

public class Main {
    public static void main(String[] args) {
        for (int i=0;i<5;i++){
            System.out.println("iの値は" + i);
        }
    }
}

・減らしていく場合は i--

(2)Forによるループの詳細

続きです。
forによる繰り返しを中断、またはスキップする方法があります。
①break 
 breakはswitchでも使いました。
 これを入れると、ループを中断して抜けます。

public class Main {
    public static void main(String[] args) throws Exception {
        for (int i=0;i<5;i++){
            System.out.println("iの値は" + i);
            if (i*10 >= 15) { //ループを抜ける条件としてif文とbreakを使った
                break;
            }
        }
    }
}

②continue
 continueは、1回だけ処理を抜ける場合に使います。ループ処理は継続されます。

(2)while、forを使った繰り返し

簡単な例で、i=1 から5として、順に表示してみましょう。
(1)前判定

public class Main {
    public static void main(String[] args) {
        int i=1;
        while(i<=4){
            System.out.print(i); //改行コードを入れていません。入れる場合はprintln
            i++;
        }
    }
}

実行結果は以下です。

1234

これは前判定で、後判定にすることも可能です。
その場合は、do whileを使います。
(2)後判定
int i=1;
  do{
System.out.print(i); //改行コードを入れていません。
i++;
} while(i<=4);

(3)forを使う場合

public class Main {
    public static void main(String[] args) {
        for (int i=1;i<=4;i++){
            System.out.print(i); 
        }
    }
}

※こっちの方が、スッキリ書けますね。

8. 配列

・どの言語でもある便利な配列。
・要素というか添え字は0から始まる。
・配列に入れることができるのは、同じ型のデータだけ。

(1)配列の宣言

・new によって、初期化するのと同時に、メモリ領域を確保する。このあたりがPythonとは違って面倒ではあるが、メモリ管理をきっちりしているということであろう。配列の個数のよって、確保するメモリが全く違うので、やむを得ないコマンド。たとえば、int型が4つであれば、int(はたしか4バイトだったので)に必要なメモリを確保する。
以下は、3つの要素数の配列を宣言。

int[] data; 
data[]= new int[3];  

※注意点として、配列を宣言するだけのときには、要素数は指定できない。
つまり、int data[3]; とはできない。
または、以下のように1行で書くことも可能

int[] data = new int[3]; 

(2)配列の要素への初期値の代入

以下は、dataという配列に、値を入れて、最後に2つ目の要素を表示した。
書き方はいくつかある。面倒な方法から、最後に単純な書き方を紹介する。
❶一つ一つ書く

public class Main {
    public static void main(String[] args) {
        int[] data;
        data = new int[3];
        data[0] = 10;
        data[1] = 20;
        data[2] = 30;
        System.out.println(data[1]); //----> 20
    }
}

❷省略してみよう
以下のように、データの値を宣言時に指定する。int[3] としていたが、要素数は後ろの数を数えればわかるので書かない。書くと、逆に不整合になる可能性がある。たとえば、4と宣言したのに3つしかないとか。

public class Main {
    public static void main(String[] args) {
        int[] data;
        data = new int[]{10,20,30};
        System.out.println(data[1]); //----> 20
    }
}

❸さらに短く

public class Main {
    public static void main(String[] args) {
        int[] data = new int[]{10,20,30};
        System.out.println(data[1]); //----> 20
    }
}

❹シンプルな書き方
以下はわずか1行で宣言と値のセットを行っている。

public class Main {
    public static void main(String[] args) {
        int[] data = {10,20,30};
        System.out.println(data[1]); //----> 20
    }
}
(3)配列でループ

❶通常の書き方
以下のように、配列の長さの指定をdata.lengthで指定し(今回は3)、要素を表示させる。

public class Main {
    public static void main(String[] args) {
        int[] data = {10,20,30};
        for (int i = 0; i < data.length; i++){
            System.out.println("data[" + i + "] = " + data[i]);
        }
    }
}

結果は以下である。

data[0] = 10
data[1] = 20
data[2] = 30

❷拡張forを使った書き方
以下のようにスッキリ書ける

public class Main {
    public static void main(String[] args) {
        int[] data = {10,20,30};
        for (int value : data){
            System.out.println(value);
        }
    }
}

結果は以下である。

10
20
30
(4)多次元配列

2次元の配列の場合は、以下のイメージ

[0][0] [0][1] [0][2] [0][3]
[1][0] [1][1] [1][2] [1][3]

9. 型変換(キャスト)

・型変換はときに便利である。
❶intをdouble型に
・ (double)a/b とすると、int型の値を割り算してdouble型にできる
例は以下。iはintなので整数。jは小数点なので、double型。型変換をしないと、i/2の結果の小数点が破棄されて2.0となってしまう。

public class Main {
    public static void main(String[] args) {
        int i=5;
        double j=i/2;
        System.out.println(j); // ===> 2.0
        }
}

以下のように、(double)をつけることで、double型に変換している。結果は2.5と正しい値になる。

public class Main {
    public static void main(String[] args) {
        int i=5;
        double j=(double)i/2;
        System.out.println(j); // ===> 2.5
        }
}

❷文字を数字に
・int i = Integer.parseInt(a); //文字列を数字に変換する
以下をみてみよう。aは文字列であるが、intに型変換をしているので、数字として演算される。

public class Main {
    public static void main(String[] args) {
        String a="1";
        int i = Integer.parseInt(a);//文字列を数字に変換する
        System.out.println(i*3); //====> 3
        }
}

10. 乱数

(1)書き方

おまじないとして、1行目に以下を入れよう。

import java.util.Random;

以下のようにすると、kに0-9までの乱数が入る

int k = new Random().nextInt(10);

試しに書いてみる。

import java.util.*;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int k = new Random().nextInt(10);
        System.out.print("乱数は" + k + "です");
    }
}

11.コマンドライン引数

main関数に引数を渡すことができます。渡した引数は、argsの配列に格納されます。
※argsは、arguments(引数)という意味。

class Test {
public static void main(String[] args) {
  System.out.print(args[0]);
  System.out.print(args[1]);
 }
}

実行しましょう

> java Test orange apple
orange
apple

12.ファイルのオープン

以下に記載がある。
https://www.sejuku.net/blog/24744
paizaでもファイルを置くことができて、横のタブにファイル名を記載して、以下のようにファイルを置ける。
f:id:seeeko:20210522170137p:plain
上記のコピペであるが、以下のようにすれば、読み込める。

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
 
public class Main {
    public static void main(String[] args) {
        try {
            File file = new File("a.txt");
            if(file.exists()) {
                FileReader filereader = new FileReader(file);
                int data;
                while((data = filereader.read()) != -1) {
                    System.out.print((char) data);
                }
                filereader.close();
            } else {
                System.out.print("ファイルは存在しません");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

余談だが、入出力処理の例外のIOExceptionを使う場合、tryが必要。だから、上記のソースでtryをなくすとエラーになる。
仮に、tryを無くして書く場合は、以下のように書く throws(投げる)

public class Main {
    public static void main(String[] args) throws IOException {

paiza.ioでも、デフォルトのコードには throws Exception が記載されている。IOExcepitionでなくても、Exceptionでもうまくいくはずだ。
念のため、ソースを書いておく。例外処理が無いので、少しすっきりかける。

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {

            File file = new File("a.txt");
            if(file.exists()) {
                FileReader filereader = new FileReader(file);
                int data;
                while((data = filereader.read()) != -1) {
                    System.out.print((char) data);
                }
                filereader.close();
            } else {
                System.out.print("ファイルは存在しません");
            }
    }
}

12.メソッド

・処理を部品化できるので便利である。プログラムの保守性は格段に上がる。
・public class Main{ で始まるのもMainメソッドである。
・これ以降は憶測なので、余談として。
広い意味のメソッドと、狭い意味ではメソッド(=手続き)があると思う。(確証はない)
狭義のメソッドの場合、クラスの中の処理の部分、つまり手続きという意味。広い意味のメソッドは、複数のメソッドも束ねた処理のひとまとまり。クラスで記載されるひとまとまりである。
MainがあることからわかるようにSubもある。サブメソッドを定義できる。このサブメソッドは、Mainから呼び出され、プログラムをまとめた部品となる。

(1)シンプルなメソッドを作ってみましょう。

❶以下のように、文字を表示するプログラムがある。

public class Main {
    public static void main(String[] args) {
        System.out.println("こんちくわ");
    }
}

これを、methodAというメソッド(プログラムの部品)で、処理を分けてみる。
❷メソッドの書き方
これまでと書き方は同じで、先はmainと書いたところに、新しいメソッド名をつけて、()をつける。
その下に、処理を書く(このあたりはこれまでと同じ。

public static void methodA(){
    System.out.println("こんちくわ");
}

❸呼び出す側
mainからメソッドを呼び出す。
以下のように。

    public static void main(String[] args) {
        methodA();
}

❹やってみる
・このとき、mainメソッドの順番を上にする必要はなく、必ずmainメソッドから実行される。

public class Main {
    public static void methodA(){ //呼び出されるメソッド
        System.out.println("こんちくわ");
    }
    public static void main(String[] args) {  //呼び出す側のメインメソッド
        methodA(); //====>こんちくは
    }
}
(2)引数を使う

先のプログラムで、今度は引数を渡す。
以下は、xとyに値を渡す
❶以下のように、文字を表示するプログラムがある。

public class Main {
    public static void main(String[] args) {
        int x = 10;
        int y = 20;
        System.out.println(x);
        System.out.println(y);
    }
}

出力結果は以下

10
20

❷部品にする
ここで、受け取る引数の型を定義する。今回は数字なのでint xとしている。

    public static void methodA(int x) {
        System.out.println(x);
    }

❸部品(メソッド)を使って書き直す

public class Main {
    public static void methodA(int x) {
        System.out.println(x);
    }
    public static void main(String[] args) {
        methodA(10);
        methodA(20);
    }
}
(3)戻り値を返す

これまでは、戻り値が無かったのでvoidを使った。※void は避けるなので、戻り値を避ける(返さない)と考えればいいだろう。
戻り値を返す場合は、voidのとこで、受け取る戻り値の型を宣言する。

実際にやってみるが、流れとしては以下
・Main関数で、数字を2つ与える
・メソッド(methodA)で数字を足す。結果(ans)を戻り値として返す
・main関数では、その値を表示する。

public class Main {
    public static void main(String[] args)  {
        int ans = methodA(10,20);
        System.out.println("sum = " + ans);
    }
    public static int methodA(int x, int y){
        int ans = x + y;
        return ans;
    }
}

methodAを見てもらうとわかるように、戻り値を返しているので、voidではなくintにしている。
もちろん、数字ではなく文字を返すのであればStringにする。

(4)メソッドのオーバーロード

似たようなメソッドだからといって、同じ名前を付けることはできません。
かといって、引数(渡す値)の型や数が違うごとに、新しい名前をつけていると、
プログラムとしては複雑になります。
オーバーロードは引数の型や個数が異なるだけの場合は、同じ名前をつけていいというものです。


13.クラスとメソッド

(1)言葉や決め事など

❶クラス
・オブジェクトに共通する性質を定義したものがクラス。
・言い方を変えてみると、同一のデータ構造(変数)と同一の手続を(メソッド)もつオブジェクトをまとめて表現する。こうしてできたものがクラス。
・違う言い方をしてみると、オブジェクトは、データ(変数)と手続き(メソッド)をまとめたもの。
・クラスを作ることで、int型やString型などに限定されない、新しい型を作ることができる。たとえば、生徒の名前、住所、年齢、成績などを保持するStudentというClassである。
❷インスタンス
・クラスの定義に基づいてインスタンスが生成される
・一つのクラスに対して,複数のインスタンスが対応する。たとえば、生徒(student)というクラスのインスタンスとして、user1,user2などのインスタンスを定義できます。
・「オブジェクト」と「インスタンス」を同じものようにして説明されることがある。たまに、「オブジェクト」と「クラス」も同じもののように説明されることもある。

(2)クラスを作ってみる

・クラス名の先頭は大文字にする
・クラスには、変数(メンバ変数または属性)や操作(メソッド)を記載する
・クラスで定義した変数をフィールドと呼ぶこともある

❶空のクラスを作る

class Student {
}

❷クラスに変数(フィールド)と操作を記載する

class Student {
    String grade = "Hi school"; // nameという文字列を定義
    void hello(){ // メソッドを記載
        System.out.println("こんちくわ");
    }
}

※フィールドが固定の場合は、finalをつける。また、わかりやすいように大文字にする
final int KEN="Tokyo"

❸インスタンス化する
クラスを作ったら、インスタンス化します。
メモリ領域を割り当てるためにnewを使います。

class Student { //この場合はpubicは付けない
    String grade = "Hi-school"; // nameという文字列を定義
    void hello(){ // メソッドを記載
        System.out.println("こんちくわ");
    }
}
public class Main {
  public static void main(String[] args) {
    Student ito; // itoというインスタンスをStudentクラスの中に作る
    ito = new Student();  //メモリ領域が割り当てられていないので、インスタンス化
    System.out.println(ito.grade); //gradeという値を呼び出して表示
    ito.hello(); //helloというメソッドを呼び出して実行
  }
}
(3)クラスとインスタンス

クラスを実体にしたのがインスタンス
インスタンス化(=クラスをインスタンスにする)にはnewを使う

class Fruits {
double size;
}
・・・  {

Fruits orange = new Fruits();
Fruits apple = new Fruits();}

■その他、事例
public class Main {
public static void main(String[] args) {
Main abc = new Main(); //Mainクラスのインスタンスをnewで作成
abc.print("A");//手続き
}
void print(String moji){
System.out.println(moji);
}
}

※シングルクォーテーション’にした場合、つまり obj.show('A') にしたら、以下に変更する。
void show(char sign)

16.例外処理

(1)基本構文

try
catch
finally

(2)まずはやってみる

❶割り算の処理
以下のようにaをbで割るプログラムがある

public class Main {
    public static void main(String[] args) throws Exception {
        int a = 12; int b=3;
        int c;
        c = a / b;
        System.out.println(c);
    }
}

実行すると、4と表示される。
ここで、b=0とすると、以下のように、ゼロで割っているというエラーがでる。

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Main.main(Main.java:7)

❷例外処理
そこで、例外処理を入れる。上記のArithmeticExceptionというエラーメッセージをcatchで受け取る。

public class Main {
    public static void main(String[] args) throws Exception {
        try{
            int a = 12; int b=0;
            int c;
            c = a / b;
            System.out.println(c);
        } catch(ArithmeticException e) {
            System.out.println("ZeroDivisionError");
            
        } 

    }
}

こうすると、0で割ってもエラーにならず、プログラムとしてきちんと実行される。