草プログラマー、それはつまり草

CS 会計 法律 サッカー 野球 bitcoin 数学 物理学 などいろいろやってます

Java入門 基本の基本 Javaを始めよう

Javaとは

もっとも普及されている言語のひとつ。

コンパイラによってバイトコードに変換。

バイトコードがJava仮想マシンによってじっこうされるのでWindows、Mac、LinuxなどのOSでコンパイルしなおさずに動作することができる。

オブジェクト指向型の言語。

日本でも使っている人が多いので、日本語の情報も十分あります。英語が苦手ない人でもたぶん大丈夫です。

またRuby、PHPのようなインタープリタ言語より基本的に処理は早いです。

JavaはゲームからWeb、システムまで大概のことができてしまいます。

Javaの求人も多いですから仕事も得やすいです。

開発環境

ここで躓く人が非常に多いです。

Eclipse

eclipseを使う人が多いです。

eclipseはIDE(統合開発環境)で開発に必要なものはたいていそろっています。

無料で使えます。

まあ何でもいいのですが、eclipseはつかいやすいですのでどうやってはじめればいいのかよくわからないよっていう人はとりあえずEclipseを使っておけば大丈夫です。

Eclipse 日本語化 | MergeDoc Project

ここからダウンロードできます。

Java入門

ここでは、初心者向けの内容ですので、すでにJavaの基本について学んだことがある人は、Effective Java とかを読んだ方がいいです

はじめての人向けですのでかなり初歩的な内容から学んでいきます

クラスやインスタンス、継承などの概念を理解することを目標にやっていくといいと思います。

Hello World

まず初めにHello Worldを出力してみましょう。

public class Example {
    public static void main(string[] args){
        // Hello Worldを出力する
        System.out.println("Hello World");
    }
}

このプログラムはHello Worldという文字を画面に表示するプログラムです。

これを、実行すると

Hello World

と出力されます。

いろいろ書いてありますが、ここで重要なのは、

System.out.println("Hello World");

の一文です。

注意点

  • Systemの先頭のSは大文字。
  • 文字は""で囲む

文字を変えると、

System.out.println("Java");

このようにHello WorldのところをJavaとすると、出力も

Java

となります。

System.out.println(1+2);

のようにすると

3

と出力されます。

ここで最初のプログラムの構成を見ていきます。

class クラス名{
    public static void main(String[] args){
        命令文
    }
}

クラス名は自由に自分で決められます。

半角英数字で、頭文字をアルファベットの大文字にする必要があります

ex) Sample, Example とか

その次の行の、

public static void main(string[] args){命令文}

の詳しいことはのちのち説明します。

とりあえずこの文章の { } の間に命令文を書くことを覚えて下さい。

  • 命令文の最後にはセミコロン(;)をつける
  • { } は必ず一対一の対応する。
  • { } で囲まれた範囲をブロックと呼ぶ。
エスケープシーケンス

先ほどのプログラムのなかで、

System.out.println("これから\"Java\"を学んでいきます");

とすると、

これから"Java"を学んでいきます

のように出力することができます。

変数と型

public class Sample{
    public static void main(String[] args){
        int i = 10;
        Ststem.out.println(i);
    }
}

変数は入れ物のようなものです。

int i = 4;

の場合はint型のiという変数に4という数を代入(=)するということになります

プログラミングにおいては=は代入を意味します

変数は型を宣言する必要があります。

自分が変数に整数を入れるのか、文字を入れるのかなどを宣言してその分のメモリを確保します

意味
int 整数 1,4,25,356 etc
double 小数を含む数 3.14
char 一文字 'あ', 'む' etc
boolean 真偽値 true, false

int i = 1.08;

などとするとエラーになります。

double i = 1.08;

のようにする必要があります。

演算子

演算子を用いることで計算をすることができます。

演算子 意味
+ 加算、足し算 2+3(=5)
- 減算、引き算 4-2(=2)
* 乗算、掛け算 4*8(=32)
/ 除算、割り算 8/2(-4)
% 乗余、割ったあまり 7%3(=1)

普通に、

System.out.println(2*6+4/2); //14

のように計算できます。

普通の計算と同じように掛け算、割り算が先に計算されます。

変数で

int i, j;
i = 8;
j = i * 2 + 6;
System.out.println(j);

のようなこともできます。

出力はもちろん、22です。

演算子 意味
+= a += 1の場合 a = a + 1のこと
-= a -= 1 は a = a - 1 のこと
*= a *= 2 は a = a * 2 のこと
/= a /= 2 は a = a / 2 のこと

特に、 += は使う人もおおいです

インクリメント

i++ // i = i + 1 のこと、つまりiを1増やす
i-- // i = i - 1 のこと、つまりiを1減らす

のようなものです。

インクリメントは非常によく使うので必ず覚える必要があります

条件分岐(if else)

if, else はよく使いますので必ず理解する必要があります。

if(条件式){
    条件式が満たされれば実行される。
} else {
    条件式が満たされなければ実行される。
}

実例を見た方が分かりやすいですね。

if(age < 20){
    // ageが20未満であれば実行される
    System.out.println("未成年です");
} else {
    // ageが20以上であれば実行される
    System.out.println("成人です");
}

みれば何となくわかりますよね?

switch

これも実際にコードを見ればすぐにわかります。

String week = "Monday"
switch (week){ 
    case "Sunday":
        // WeekがSundayの時に実行される
        System.out.println("日曜日");
        break;
    case "Monday":
        System.out.println("月曜日だよ、仕事しないと");
        break;
    case "Tuesday":
        System.out.println("火曜日だよ");
        break;
    case "Wednesday":
        System.out.println("水曜日だよ");
        break;
    case "Thursday":
        System.out.println("木曜日だよ");
        break;
    case "Friday":
        System.out.println("金曜日だよ");
        break;
    case "Saturday":
        System.out.println("土曜日だよ");
        break;
    default:
        System.out.println("ちょっとなにいってるかわからない");
}

説明を書くよりコード見た方がずっとわかりやすいです。

ちゃんとbreak;を書かないと抜け出せませんので注意



for の繰り返し

public class Main(){
     public static void main(String[] args) {
        // Hello World を十回出力する
        for (int i = 0; i < 10; i++){
            System.out.println("Hello World");
        }
    }
}

for文は繰り返す時に使います。

for ( 初期化処理; 繰り返し条件; 繰り返し時の処理 ){
    命令文;
}

このような形になっています。先ほどのように

for ( i = 0; i < 10; i++ ) {
    System.out.println("Hello World");
}

の場合、最初に i = 0 が実行されて、i に 0が代入されます。

その後、繰り返し条件が評価されます。ここでは i < 10 ですね。今は i = 0 ですので、この条件式は true になりますので、命令文である System.out.println("Hello World"); が実行されます。

そして、それが終わった直後に繰り返し時の処理、 i++ が実行されます。つまり i = i + 1 が実行されて i が 0 から 1 となります。

これを十回繰り返すと i = 10 となり i < 10 が false となって for文 を抜け出します。



ここで学ぶ、クラスやインスタンス、継承、ポリモーフィズムなどの概念は他のオブジェクト指向型の言語(Python,Ruby,C#とか)でも使えます。

クラスとインスタンス

クラス

オブジェクトに共通する属性を抽象化したもの

インスタンス

個々のオブジェクト

class Human {
    // nameはHumanクラスのインスタンス変数
    string name;
}


インスタンスの生成はnewを使用して。

new Class名

と書きます。

//Human型の変数nにHumanクラスのインスタンスを参照
Human n = new Human();
//インスタンス変数nameに
n.name = "Mike";
System.out.println(n.name);

Human n2 = new HUman();
n2.name = "Marisa";
System.out.println(n2.name);

例えば、

class Enemy{
    String name;
    int hp;
    int mp;
    String item; 
}

class sample{
    Enemy m1 = new Enemy();
    m1.name = "スライム";
    m1.hp = 100;
    m1.mp = 0;

    Enemy m2 = new Enemy();
    m1.name = "wizerd";
    m1.hp = 2500;
    m1.mp = 100;
}

配列を使うこともできます。多くのインスタンスを作る場合は配列を使った方が管理しやすいときもあります。

Enemy[] Enemys = new Enemy[4];
Enemy[0] = new Enemy();
Enemy[1] = new Enemy();
Enemy[2] = new Enemy();
Enemy[3] = new Enemy();

クラスメソッド

メソッドとは関数のことです

メソッドは宣言するときは、

public static void メソッド名(){
    命令文
}

呼び出す際は

メソッド名();

とします。

//関数を定義
public static void methodName(){
    System.out.println("何らかの処理");
}
//関数を実行
methodName();//何らかの処理 が出力される。
引数のあるメソッド

宣言

public static void メソッド名(型 変数名, 型 変数名){
    命令文
}

呼び出し(実行)

メソッド名(値, 値);

引数は三個目以降も同じようにカンマ(,)でつなげていけば大丈夫です。

public static void methodA(int a){
     System.out.println("methodAは引数 " + a + " を受け取りました")
}

methodA(5);

とすると出力は、

methodAは引数 5 を受け取りました

となります。

返り値

返り値がある場合はその型を

// cの型がint なのでmethodA の前にint を書く
public static int methodA(int a, int b){
    int c = a + b;
    // 変数cが返り値
    return c;
}

上は引数で二つの整数(int)を受け取って足して返すメソッドですね。

他も同じです。

public static void methodA{
    System.out.println("methodAにはreturnがないのでvoidです。");
}

public static int methodA{
    System.out.println("methodAはreturnで整数を返すのでint");
    return 5;
}

public static String methodA{
    System.out.println("methodAはreturnで文字列を返すのでString");
    return "Hello";
}
public static boolean methodA{
    System.out.println("methodAがreturnでtrue(またはfalse)を返す時はboolean");
    return true;
}

voidはメソッドmethodAが何も返さないときに使います。



メソッドの引数に参照を渡す

インスタンスメソッド

class Human{
    // nameがインスタンス変数
    String name;
    int age;
    void greeting(){
        // this.変数名で自身のインスタンス変数を参照できる
        System.out.println("私の名前は " + this.name + " です。 " + age " 歳です。");
    }
}

Human a = new Human();
a.name = "れいむ";
a.age = 20
a.greeting();

出力は

私の名前は れいむ です。20 歳です。

となります。

コンストラクタ

インスタンスを生成するときにインスタンス変数を初期化できる。

class Human{
    String name;
    int age;

    //コンストラクタ、newされたとき実行
    //クラス名と同じ
    Human(String n, int i){
        this.name = n;
        this.age = i;
    }
    
    void greeting(){
        System.out.println("私の名前は" + this.name + " です。年齢は " + this.age + " です。");
    }
}

public class Sample{
    public static void main(String[] args){
        Human a = new Human("まりさ", 18);
        a.greeting();
    }
}

出力は

私の名前は まりさ です。年齢は 18 です。

継承

継承によって、何か新しく機能を作る際に前に作った機能と同じ機能がある場合に、共通部分は一つにまとめて繰り返し利用できるようになります。つまり、何度も同じようなプログラムを書く必要がなく、作業の効率化、ソースコード全体を見やすくさせることができます。

public class Human{
    String name;
    sleep(){ }
}

public class Student extends Human {
    study(){ }
}

Humanクラスのことを親クラス、スーパークラス、基底クラスのように呼びます。

StudentクラスはHumanクラスを継承していますので name と sleep関数も持っています。

Javaの場合は親クラスは一つだけです。

ポリモーフィズム

最も上位のクラスはObjectクラス


アクセス修飾子

  • アクセスを制御するためのもの
アクセス修飾子 意味・機能
public どのクラスからもアクセス可能
protected サブクラスor同じパッケージ内のクラスからしかアクセス可能
なし 同じパッケージ内のクラスからアクセス可能
private 同じクラス内からアクセス可能

アクセッサ

メソッドをpublicにするなら、クラスもpublicにしないとあんまり意味ない

public class Sample {
    // private にして直接扱えないようにする
    private int age;
    private String name;;

    // こっちの関数から操作する
    public int getAge() {
        return this.age;
    }
    public String getName() {
        return this.name;
    }
    public void setAge(int a) {
        this.age = a;
    }
    public void setName(String n) {
        this.name = n;
    }
}

抽象クラス

abstractクラスとは、抽象メソッドを1つ以上持つクラスのことです。

抽象メソッドは abstractとついているメソッドのことです。

普通のメソッドは、

アクセス修飾子 戻り値の型 メソッド名(引数){
    命令文;
}

となりますが、抽象メソッドの場合は命令文をここで定義せずに継承先で定義します。

abstract 戻り値の型名 メソッド名(引数);

次に、抽象クラスです。

抽象クラスとは、抽象メソッドを1つ以上持つクラスのことです。

abstract class クラス名 {
    abstract 戻り値の型名 メソッド名(引数);
}

抽象クラスの意義は開発者側にメソッドのオーバーライドを強制するということができることです。

継承先で抽象メソッドをオーバーライドして処理内容を書くことになります。

abstract class 抽象クラス名 {
    abstract 戻り値の型名 メソッド名(引数);
}
 
class 派生クラス名 extends 抽象クラス名 {
    // 抽象メソッドをオーバーライドする
    戻り値の型名 メソッド名(引数) {
        処理内容;
    }
}

抽象クラスは

  • インスタンス化できない
  • 抽象メソッドを必ずオーバーライドする必要がある
Copyright © 2016 へなちょこプログラマー All rights reserved.