BNBのプログラミング勉強記録

ガチのプログラミング初心者が駆け上がっていくブログ

メモ(Java IV)

基本

  • オブジェクト指向で大事なのはクラスとインスタンス
  • インスタンスというのはオブジェクトの別名
  • クラスはインスタンスの設計図
  • 例えば、「名前」「年齢」という情報と「あいさつする」「歩く」という振る舞いを持つ人間のインスタンスを作るのであれば、Personというクラスにそれらの情報と振る舞いを定義する。
  • インスタンスは実体という意味。
  • オブジェクトの別名がインスタンスなのは、設計図から実際に生み出された実体であるため
  • インスタンスは変数に代入して用いる
  • これまでは変数名の前にデータ型を指定してきた(例:String name="aaa";)が、インスタンスの代入ではクラス型を指定→クラス名がそのままクラス型になる。(例:Person person = new Person())
  • インスタンスは、1つのクラスから何個でも生成できる。設計図を元に同じようなオブジェクトを簡単に大量に作ることができる(前項の例だと、person1=,person2=,という感じ)
  • 同じクラスから作られたインスタンスは、すべて同じ種類の情報(中の値はインスタンスごとに変わり得る)と振る舞いを持つ
  • インスタンスの情報にあたるもの「インスタンスフィールド」
  • 振る舞いにあたるもの「インスタンスメソッド」
  • インスタンスメソッドはクラスに定義しても、実際は各インスタンスに属する→インスタンスメソッドはインスタンス(を代入した変数)に対して呼び出す(例:person1.hello();)
  • クラスに属する、クラスフィールドというものもある。
  • クラスフィールドは、staticをつけて「public static データ型 変数名」と定義する
  • フィールドには、定義時に初期値を設定しておくことができる
  • カプセル化=publicではなくprivate
  • フィールドのアクセス権をprivateにすると、フィールドにクラスの外からアクセスすることができなくなる
  • 一方、privateでも、クラス内からはアクセスすることが可能
  • ゲッター・・・フィールドの値を返すだけのメソッドを定義すること。
  • ゲッターは「getフィールド名」のように命名するのが一般的
  • 最初のうちは、①フィールドはprivateに、②メソッドはpublicに、という2点沿っておけば、基本的に問題はない、とのこと。ほんと?
  • 正直、現時点で思ったのは「priveteでも結局書き換え可能じゃん!」ということ。理解が追いつかない・・
  • セッターは値を書き換え。set〇〇とやる感じ

this(頭こんがらがる)

  • メソッド内でインスタンスフィールドにアクセスするためには「this」という特殊な変数を用いる
  • thisはクラス内のメソッドの定義の中でのみ使用できる
  • thisはメソッドが呼ばれた時に、そのメソッドを呼び出しているインスタンスに置き換えられる
  • this()はコンストラクタを呼び出すための特別なメソッドで、()に引数を渡すことも可能
  • thisはコンストラクタの先頭でしか呼び出せない

コンストラクタ(ちょっと理解が追いつかないかも・・)

  • コンストラクタとは、newを使ってインスタンスを生成した後に自動で呼び出される特別なメソッドのこと。
  • コンストラクタは特別なメソッドのため、定義方法が決まっている。以下2つ。
  • コンストラクタ名はクラス名と同じにする
  • 戻り値を書いてはいけない(voidも書かない)
  • newでインスタンスを作る際、「new クラス名()」の()には引数を渡すことができる。
  • その引数は直後に呼び出されるコンストラクタに受け渡される。→コンストラクタに任意の情報を渡すことができるようになる。

インスタンスメソッドとインスタンスフィールドの基本の基本

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

    Person person1 = new Person();
    person1.hello();
    person1.name="Kate Jones";
    System.out.println(person1.name);

    Person person2 = new Person();
    person2.hello();
    person2.name="John Christopher Smith";
    System.out.println(person2.name);
    
  }
}
class Person {
  public String name;

  public void hello() {
    System.out.println("こんにちは");
  }
}

this(前項の下段をこのように書き換える)

class Person {
  public String name;

  public void hello() {
    System.out.println("こんにちは、私は"+this.name+"です");
  }
}

コンストラクタの基本

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

    Person person1 = new Person("Kate Jones");
    person1.hello();
    
    Person person2 = new Person("John Christopher Smith");
    person2.hello();
  }
}
class Person {
  public String name;

  Person(String name) {
    System.out.println("インスタンスが生成されました");
    this.name=name;    
  }

  public void hello() {
    System.out.println("こんにちは、私は" + this.name + "です");
  }
}

総合演習(クラス、インスタンスインスタンスメソッド、インスタンスフィールド、コンストラクタ、クラスメソッド、クラスフィールド、カプセル化、ゲッター、セッター)

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

    Person person1 = new Person("Kate", "Jones", 27, 1.6, 50.0,"医者");
    person1.printData();
    Person person2 = new Person("John", "Christopher", "Smith", 65, 1.75, 80.0,"教師");
    person2.printData();
    System.out.println("----------------------");

    person1.setJob("獣医");
    System.out.println("person1の仕事を"+person1.getJob()+"に変更しました");    
    person1.printData();
  }
}
class Person {
  private static int count = 0;
  private String firstName;
  private String middleName;
  private String lastName;
  private int age;
  private double height;
  private double weight;
  private String job;
  
  Person(String firstName, String lastName, int age, double height, double weight,String job) {
    Person.count++;
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.height = height;
    this.weight = weight;
    this.job = job;
  }
  
  Person(String firstName, String middleName, String lastName, int age, double height, double weight,String job) {
    this(firstName, lastName, age, height, weight,job);
    this.middleName = middleName;
  }

  public String getMiddleName() {
    return this.middleName;
  }
  
  public String getJob() {
    return this.job;
  }


  public void setMiddleName(String middleName) {
    this.middleName = middleName;
  }
  
  public void setJob(String job) {
    this.job = job;
  }
  

  public String fullName() {
    if (this.middleName == null) {
      return this.firstName + " " + this.lastName;
    } else {
      return this.firstName + " " + this.middleName + " " + this.lastName;
    }
  }

  public void printData() {
    System.out.println("私の名前は" + this.fullName() + "です");
    System.out.println("年齢は" + this.age + "歳です");
    System.out.println("BMIは" + Math.round(this.bmi()) + "です");
    System.out.println("仕事は" + this.job + "です");
    
  }

  public double bmi() {
    return this.weight / this.height / this.height;
  }

  public static void printCount() {
    System.out.println("合計" + Person.count + "人です");
  }
}