Javaについて


## Javaについての前に

Javaを使って何をするのか。

Javaを使って、3層構成の場合には、動的な処理が必要な場合に、アプリケーションサーバへリクエストを送り、受け取った結果をWebブラウザに返します。

そこで、必要となってくるポート番号。ポート番号とはサーバが提供するサービスを特定するためのものです。代表的なポート番号を記します。


以下の文章は、「<a href="http://amzn.to/2cUJwak" target="_blank">やさしいJava 第5版 (「やさしい」シリーズ) : 高橋 麻奈 </a>」から引用しています。


### Javaで使用知っておくべき備忘録

- コメントはコンパイルされると取り除かれる。
- avaではobjectクラスを筆頭に様々なクラスを用意されていますが、これらもすべてパッケージで管理されています。import の時に *(アスタリスク)でimportしてやると、そのパッケージ内のクラスをすべて利用することができます。



## Lesson 8クラスの基本

#### メソッドを呼び出す

```
//オブジェクトをさす変数名.メソッド名（引数リスト）;
```

## Lesson 9クラスの機能

### 9.1 メンバへのアクセス制限
praivateメンバには、クラスの外から勝手にアクセスできなようなメンバとしておく。


```java
Class Car
{
    private int num;
    private double gas;
}

class Sample1
{
     public static void main(String[] args) {
     //このようなアクセスはできなくなります。
     //car1.num = 1234;
     //car1.gas = -10.0;
     }
}
```

#### カプセル化のしくみを知る


privateの値を取得するには、同一クラスないで「get」を使って取得。（getの後は大文字からはじまる。）

```java
getHogehoge(){
    return this.name
}
```

コンストラクタとゲッターとセッターを設定

```java
public class Nurse {
    private String name;

    public Nurse(String name) {
    	//newをしたらコンストラクタで引数を指定。
    	//コンストラクタは、戻り値を指定できない。
        this.name = name;
    }

    public String getName() {
    	//引数がが入って、値を取得。宣言された文字列型のname。
    	//getterは値を取得するだけで、書き換えられないので、下のsetNameセッターで書き換える。
        return name;
    }

    //順番は、コンストラクタで引があるものをセッターで値を変更し、ゲッターで値を取得して表示。
    public void setName(String name) {
    	//引数を受け取ってその値をフィールドに入れてセッターをNurseクラスのpublicメンバとして作成。
    	//nameは仮引数として、String方の値を受け取れるようにします。
        this.name = name;

    }
}
```




### 9.3コンストラクタの基本

#### コンストラクタの仕組みを知る

- コンストラクタには戻り値がありません。（戻り値を指定できません。）
- クラス名をを名前として使います。

#### コンストラクタの役割を知る

そのクラスのオブジェクトが作成されたときに、定義しておいたコンストラクタ内の処理が自動的に行われる。
newしたときに、1回だけ実行。
メソッドと違って自由に自分で呼び出す記述することはできません。

このためコンストラクタは、__オブジェクトのメンバに自動的に初期値を設定する__などの処理を書いておくのが普通です。

たとえば、__ナンバーやガソリン量の初期値として0を代入する。__

```java
class Car
{
    private int num;
    private double gas;
    
    public Car()
    {
        num = 0;
        gas = 0.0;
        System.out.println("車を作成しました。");
    }
}


class Sample4
{
    public static void main(String[] args) {
        Car car1 = new Car();
        //車を作成しました。とnum,gasに値が格納されている。
    }
}

```

#### コンストラクタに修飾子をつける
コンストラクタにはメソッドと同じように、publicまたはprivateという修飾子をつけることができます。これをprivateにすると、クラスの外でそのコンストラクタが呼び出されるようなオブジェクトの作成ができなくなります。

#### コンストラクタにはvoidは不要

void は何も値を返さないという意味ですが、コンストラクタはそれ以前に戻り値の指定をしません。

### 9.5 クラス変数、クラスメソッド


#### クラス変数とクラスメソッド

実はクラスでは、オブジェクトに関連づけられていないメンバを持つことができます。これを、__クラス全体に関連づけられている__ということがあります。クラスに関連づけられているフィールドをクラス変数、メソッドをクラスメソッドといいます。
これらのフィールドやメソッドは、宣言、ていぎするときに__static__という修飾子をつけることになっています。

```java
class クラス名
{
  static 型名 クラス変数名;
}
```

クラス変数にアクセスする時は、

```java
クラス名.メンバ
```
↓
```java
Test test1 = new Test();
System.out.print(Test.count_Test);
```



## Lesson11 新しいクラス

### 11.1継承

あるクラスを元にクラスを拡張する（extends）ができます。
例は、車を元にレーシングカーです。

```java
class 車
{
    //ナンバー;
    //ガゾリン量;
    //ナンバーとガソリン量を表示する機能・・・
}

class レーシングカー 拡張する 車 
{
    //競技用コース;
    //競技用コースを表示する機能・・・
}
```

「車」クラス    →　スーパークラス
「レーシングカー」クラス    →　サブクラス

#### クラスを拡張する

サブクラスの宣言

```java
class サブクラス名 extends スーパークラス名
{
    //サブクラスに追加するメンバ・・・
    //サブクラスのコンストラクタ（引数リスト）
    {
    }
}
```


### 11.4 Objectクラスの継承

サブクラスをさらに拡張して、さらに新しいサブクラスを作成することはできます。
しかし、Javaでは、複数のスーパークラスのメンバを1つのサブクラスで継承することができません。

スーパークラス1とスーパークラス2を合わせてサブクラスの継承です。この場合は、インターフェイスを利用。

#### Objectクラスのしくみを知る
Javaでは、クラスを作成するときにスーパクラスを指定しない場合__そのクラスは、Objectクラスというクラスをスーパークラスにもつ__というきまりになっています。このため、Javaのクラスはすべて、Objectクラスのメンバを継承していることになっています。

#### toStringメソッド
__オブジェクトを文字列であらわしたものを戻り値として返す。__
オブジェクトの出力処理をするときには、このメソッドが呼び出されます。
特に何も準備ぜすに、Objectクラスから継承したtoStringメソッドが呼びだされます。そしてこのtoString()メソッドの戻り値となっている「パッケージ名クラス名@数値」という文字列が表示されます。

しかし、toString()メソッドは、自分で設計したクラスで定義しておく（オーバーライドする）と、オブジェクトを表す文字列を定めることができます。

## lesson12 インターフェイス

### 12.1 抽象クラス

#### 抽象クラスのしくみを知る

抽象クラス。ここでは、抽象クラスではオブジェクト作成はできません。

__処理内容が定義されてないメソッドを持っている__。

```java
abstract class クラス名
{
	//フィールドの宣言;
	//abstract 戻り値の型 メソッド名(引数リスト);

}
```

#### 抽象クラスを利用する

__抽象クラスは継承した抽象メソッドの内容をサブクラスできちんと定義してオーバーライドする。__
抽象は継承を前提にしている。

### 12.2 インターフェイス

Javaでは、抽象クラスと同じようなしくみを、インターフェイス（interface）というものを使ってあらわすことができます。

インターフェイスの宣言

```
interface iVehicle
{
	void show();
}

↓

interface インターフェイス名
{
	型名 フィールド名 = 式;
	戻り値の型 メソッド名();
}
```

インターフェイスは、フィールドとメソッドを持つことができます。
__ただし、コンストラクタはもちません。__
また、インターフェイスはクラスによく似ているのですが、オブジェクトを作成することはできません。
つまり、newを使ってオブジェクトを作成することはできないのです。

#### インターフェイスを実装する

```
class Car implements iVehicle
//class クラス名 implements インターフェイス名
{

}
```

CarクラスではiVehicleインターフェイスを実装するには、このように記述します。
すると、CarクラスはiVehicleインターフェイスがもっているフィールド（定数）とメソッド名を受け継ぐことになります。

インターフェイス型の配列は、そのインターフェイスを実装しているサブクラスのオブジェクトをさすことができます。

インターフェイスのフィールドはすべて定数で、メソッドはすべて抽象メソッドとなります。抽象クラス（Vehicle）のように、__値を変更できるフィールドspeedや、処理が定義されているsetSpeedメソッドのようなメンバをもたせることはできないので、注意しておいていだくさい。__

### 14 例外と入出力処理

メソッド内のtry内に変数を入れないと、変数を使用できない。

####　大まかな例外の種類

- try{}catch(exception)→try内で発生した例外をcatchで対応。catchは、無限に対応可能。

- throw→exceptionを発生させる。意図的にその場で発生。

- throws→メソッドの引数の右に書いて、呼び出し元に丸投げする。

- RuntimeException→対応OKな例外。


### 14.2 例外とクラス

#### 例外の種類を知る
![exception.png](https://qiita-image-store.s3.amazonaws.com/0/47909/cb73ff6f-38ff-1348-8bda-f00a2972452c.png)
引用元：<a href="http://marunomaruno.web.fc2.com/exception01.html?c=idx" target="_blank">Java - 例外処理</a>

Trowableクラスからは、ErrorクラスとExceptionクラスが拡張されています。Errorクラスは、プログラムの実行が続行できないようなエラーをあらわしているので、通常例外処理は行いません。

#### 14.3 例外の送出
自分で例外クラスをつくるには、Throwableクラスのサブクラスを拡張して例外クラスを宣言することが必要です。

```java
class CarException extends Exception
//Exceptionクラスを拡張して独自の例外クラスを宣言しています。
```

Throwable
↓
CarException

Throwableクラスのサブクラスを拡張して、独自の例外クラスを宣言することができます。

#### 独自の例外クラスの場合

```java
//例外のロジックだけを別の例外クラスに記述。
public  take testMethod(判定したいクラス 値) {
    throws CriticaltestMethod {
    //testMethodは例外を送出するメソッド。throwsが例外を送出するメソッドと宣言。CriticaltestMethodは例外クラス。
    if(0 > child.getAge()) {
        //例外でーす。
        throw new CriticaltestMethod();
        //条件にあったので、例外の送出。
    } else {
        //例外ではありません。
    }
}
```

### 備忘録

#### void
型を持たないという意味。

#### コンストラクタに修飾子をつける

##### protected
スーパークラスのpraivateメンバにはアクセスできません。そこでprotectedを指定して、フィールドにアクセスができます。

#### インスタンスとオブジェクトの違い
Car car1 = new Car();
上記は、car1がインスタンス。Carクラスを抽象化したもの。Carクラスは設計図。


### 修飾子

#### クラス宣言時にfinalを使用

final修飾子を付与してクラスを宣言するとそのクラスはサブクラスで継承できなくなります。finalを使用する理由の一つとしてセキュリティ上の問題があります。プログラムに不正動作を与えようとするハッカーたちの一つの手段としてあるクラスのサブクラスを作成し、そのサブクラスに不正な動作を行う処理を記述すると言うのがあります。サブクラスを作成することにより、スーパークラスで想定される動作とはまったく異なる動作を行わせるものです。

また、セキュリティ上の観点だけからでなく、技術力のあまりない人がサブクラスを作成し、予期せぬ動作をするプログラムが作成されることを防ぐためにも使用します。Javaで初めから用意されているStringクラスや、Mathクラスはfinalが付与され宣言されており、サブクラスが作成されないようにしています。