2019年9月8日日曜日

リーマン積分

MathJaxと書くと重いので、Githubにpdfを置きました。

https://github.com/erdes/math/blob/master/integral1.pdf

Java/クラス継承

新しい会社でJavaを新たに学ぶことになり、JavaSilverを勉強中。

勉強の記録したことを、自分の記録としても残しておこうと思う。

可能な限りシンプルな例で、言語の仕様などを理解できるように書いていこうと思う。

前提

JVMはインストールされている前提とする。

開発する環境はいろいろあるとは思うが(実際自分のパソコンにもSTSが入っているが)、愚直にコマンドラインからコンパイルを行っていく。

クラスの継承

Jobsというクラスを継承して、EngineerやPolice、Firefighter、Doctorといった子クラスを作っていくことを考える。

(まずはEngineerをつくるので、Policeなどはまだつくらないかもしれないが)

まず、Jobsクラスをつくる。
//Jobs.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Jobs{
int salary;
}
同様に、Engineerクラスを作る。
//Engineer.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Engineer extends Jobs{
  Engineer(){
    salary = 50;
  }
}
この二つのファイルを作成し、同じディレクトリに置いておく。

コマンドでカレントディレクトリ(この二つのファイルが置いてあるディレクトリ)に移動したら、以下のようにコマンドを打つ。
$javac Engineer.java
そうすると、同じディレクトリに、Jobs.classというファイルと、Engineer.classというファイルが作成される。

今回の場合、何かを行うわけではないので(コンソールに表示したりとか)、「無事コンパイルできました」というところで話は一区切りとなる。
$javac Jobs.java Engineer.java
としてもよいが、Engineer.javaだけでも同じこと。

コンパイルが失敗する例

コンパイルできない例も書いておく。

Jobsクラスは以下のようにする。(フィールドは何も宣言しない。)
//Jobs.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Jobs{
}
Engineerクラスは同じ。(だけどもう一度書いておく。)
//Engineer.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Engineer extends Jobs{
  Engineer(){
    salary = 50;
  }
}
これで、同じく
$javac Engineer.java
と打つ。

そうすると、以下のようなエラーが吐かれる。
Engineer.java:5: エラー: シンボルを見つけられません
    salary = 50;
    ^
  シンボル:   変数 salary
  場所: クラス Engineer
エラー1個
salaryという変数は親クラスでも子クラスでも宣言されていないからだ。

余談

本題とは少し関係ないが、やらかした凡ミスも書いておく。

本当に初歩の初歩のミスだが、extendsのところをsを抜かしてextendにしてしまってコンパイルできなかったことがあった。
//Engineer.javaというファイル名にする。
//クラス名とファイル名は同じにしなければいけない。
public class Engineer extend Jobs{
  Engineer(){
    salary = 50;
  }
}
これでコンパイルをしようとすると以下のようなエラーが出される。
Engineer.java:1: エラー: '{'がありません
public class Engineer extend Jobs{
                     ^
エラー1個