ProgateでJavaを学ぶ【コース4はオブジェクト指向】

ProgateでJavaコース4

Progateでjavaコース4

この記事ではProgateというプログラミングの学習サービスで学んだことをまとめています。

Progateはコース2,3あたりの途中から有料になります。

有料はちょっとっていう方は筆者がまとめた記事を読んでいただけるとよいかもしれません↓

本で学びたいっていう人はこちらの本がおすすめです↓

それでは学んだことをかいていきます。

クラスとインスタンス

Progate javaコース4はオブジェクト指向を学んでいくようです。クラスとインスタンスですが、クラスは設計図、インスタンスは実際の物とかいわれたりしますが、最初のうちはまったくピンとこないんですよね。とりあえずクラスから作られるものみたいな感じででとらえておけばいいとは思いますが、結構難しいかもしれません。

クラスを定義する

クラス定義の仕方は

「 class クラス名{} 」のようにします。クラス名は大文字ではじめる必要があります。Javaはプロジェクトで管理されているのでクラスを複数のファイルにわけたとしても読み込みの構文などはありません。

インスタンスの書き方は

「 クラス名 変数名 = new クラス名(); 」 のように書きますが、これを見ても最初はよくわからない可能性があります。インスタンスとかは慣れの問題かと思います。

以下はmain.javaとperson.javaの2つのファイルを書いています

//main.java
class Main {
  public static void main(String[] args) {
    Person person1 = new Person();//インスタンス
    Person person2 = new Person();
  }
}

class Person{
  
}

メンバー

メンバーはクラスに定義する部品のようなもので、コンストラクター、メソッド、フィールドなどがあります。呼び方がもしかしたら違っているかもしれませんが、ようするにインスタンスが使用することができるメソッド、変数、コンストラクター(後述)などがあるということです。

実際にPersonクラスにhello()メソッドを定義してインスタンスで使ってみます↓

//main.java
class Main {
  public static void main(String[] args) {
    Person person1 = new Person();//インスタンス
    Person person2 = new Person();
    person1.hello();//hello
  }
}

class Person{
  public void hello(){
System.out.println("hello");
}
}

フィールド

フィールドとはなにかという、ざっくりいうとインスタンスが使うことができる変数になります。さきほどの例でPersonクラスでメソッドを定義しました今度はフィールドを定義していきます。フィールドは変数と同じように型を指定します

書き方は 「アクセス修飾子 データ型 変数名 」になります

class Person{
public String name;  

public void hello(){
System.out.println("hello");
}
}

さきほどかきわすれましたが、メソッドやフィールドにアクセスするときは、

「インスタンス.メソッド()」、「インスタンス.フィールド」というようにピリオドでアクセスします↓(コードを省略しています。)

//main.java
Person person1 = new Person();
person1.name = "tanaka";

thisキーワード

thisキーワードのthisはインスタンス自身を指すもので、インスタンスが属するクラスのフィールドのアクセスするときによく使います。ようするに自分のクラスの変数(フィールド)にアクセスするときに使うということですね。

class Person {
  public String name;
  public void hello() {
    System.out.println("こんにちは、私は" + this.name + "です");//thisを使う例
  }
}

コンストラクター

コンストラクターは重要です。コンストラクターとはインスタンスが生成されたときに自動でよばれるメソッドになります。よくフィールドの値の初期化をするときに使われます。コンストラクターもクラスのメンバーになります。コンストラクターの書き方は

「 アクセス修飾子 クラス名(){} 」のような書き方をします。

コンストラクターに引数を持たせる

コンストラクターでフィールドを初期化するにはコンストラクターに引数をもたせる必要があります。メソッドと同じように引数の型を指定しなければならない点に注意です。

コンストラクターのよびだしはインスタンスが生成されるときです。どういうことかというと

Person person1 = new Person(“たなか”); newのあとのPerson(“たなか”)の部分がコンストラクターの呼び出しになっているというわけです。

以下はコンストラクターを使ってフィールドを初期化する例です。

//main.java
class Main {
  public static void main(String[] args) {
    Person person1 = new Person("たなか");//インスタンス
    person1.hello();//たなかさんこんにちは
  }
}

class Person{
public String name;
//コンストラクター
public Person(String name){
  this.name = name;
}
  public void hello(){
System.out.println(this.name + "さんこんにちは");
}
}

thisキーワードでメソッドにアクセス

thisキーワードはインスタンス自身をしめすものですが、簡単にいうと自分が属しているクラスの部品を使うための言葉みたいな感じでとらえておくとよいかもしれません。ここではかりにPersonクラスで定義されたメソッドにthisを使ってアクセスする例です。。

class Person {
  public String firstName;
  public String lastName;

  Person(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public String fullName() {
    return this.firstName + " " + this.lastName;
  }

  public void printData(){
    System.out.println("私の名前は" + this.fullName() + "です");//thisがつかわれている
  }
}

staticキーワード(クラスフィールド、クラスメソッド)

クラスフィールド、クラスメソッドは別名で静的フィールドとか静的メソッドとかいわれたります。これはなにかというと通常はインスタンス化しないとメンバー(フィールドやインスタンスメソッドのこと)は使えないのですが、クラスフィールドはインスタンス化しなくても使うことができます。

クラスフィールドの定義

クラスフィールドやクラスメソッドもそうですがstaticキーワードをつける必要があります。書き方は

「アクセス修飾子 satatic データ型 静的フィールド名」のように書きます。

クラスフィールドやクラスメソッドを呼び出す

クラスフィールドはインスタンス化しなくてもよいのですがかわりにクラス名をつけて呼び出すルールがあります。

「クラス名.静的フィールド名」→このようにアクセスします。
メソッドも同様で「クラス名.静的メソッド名」のようにします。

静的フィールドの例

静的メソッドや静的フィールドのつかいどころは別にインスタンス化するまでもないようなところで使います。たとえばカウンターとかです。カウント用のフィールドを静的フィールドにした例です↓

//main.java
class Main {
  public static void main(String[] args) {
    Person person1 = new Person("Kate", "Jones", 27, 1.6, 50.0);
    System.out.println("合計" + Person.count + "人です");//静的フィールドへアクセス
  }
}
//person.java
class Person {
  // int型のクラスフィールドcountを定義し、0を代入してください
  public static int count = 0;//←これが静的フィールド
  public String firstName;
  public String lastName;

  Person(String firstName, String lastName, int age, double height, double weight) {
    Person.count++; // 変数countに1を足してください
    this.firstName = firstName;
    this.lastName = lastName;
  }

コンストラクターをthisキーワードで呼び出す

コンストラクターをmain.javaからではなく同じクラスから使いたいときあります。そういうときは

this()とすると自分のコンストラクターにアクセスすることができます。オーバーロードをしたときとかに重複する部分があるのでそういうときに使うようですが、コードが多いのでコードは省略します。

null

nullは値がないときという意味のようです。

  public String fullName() {
    // 以下を、middleNameがない場合とある場合で条件分岐を行ってください
    if(this.middleName == null){
      return this.firstName + " " + this.lastName;
    }else{
      return this.firstName + " " + middleName + " " +  this.lastName;
    }
  }

カプセル化

カプセル化はクラスの外部からフィールドの値を変更できなくするやつです。具体的にはフィールドのアクセス修飾子にprivateを設定し値へのアクセスと変更はゲッターとセッターというメソッドを定義して行います。簡単な例を下記に示したいと思います。main.javaはmainメソッドとかのコードを省略しています。

class Person{
private Stirng name;//プライベートなフィールド(クラス外部からアクセスできない)
//コンストラクター
public Person(String name){
  this.name = name;
}
//ゲッター
public String getName(){
  return this.name;
}
//セッター
public vois setName(String nmae){
  this.name = name;
}
}

//main.java
Person person1 = new Person("tanaka");
System.out.println(person1.getName() + "さんこんにちは");//tanakaさんこんにちは
person1.setName("suzuki");
System.out.println(person1.getName() + "さんこんにちは");//suzukiさんこんにちは

Progate Javaコース4まとめ

ProgateのJavaコース4は学ぶことがおおいですね。学んだ内容を下記にまとめてみます。

  • クラス: 設計図 | class クラス名{}
  • インスタンス: 設計図から作られるもの | クラス名 インスタンス名 = new クラス名();
  • フィールド: 部品 | アクセス修飾子 データ型 フィールド名
  • インスタンスメソッド: 部品 | アクセス修飾子 void メソッド名(){}
  • コンストラクター: インスタンス生成時に自動で呼ばれるメソッド | アクセス修飾子 クラス名(){}
  • thisキーワード: 自分のクラスの部品を使うための言葉 | this.フィールド名, this.メソッド名. this()
  • staticキーワード: インスタンス化しなくても使える部品
  • カプセル化: クラス外部からアクセスできないようにする | private修飾子
  • ゲッターとセッター: カプセル化でフィールドにアクセスするためのメソッド

こうみるとかなり学ぶことが多いように感じますが、ここらへんは結構慣れの部分が多いかと思います。

次の記事はProgateでJavaを学ぶ【コース5はクラスの継承など】 | 初心者のプログラミング