【Java】基本

Javaの開発にはJDKが必要

JavaのパッケージJREというものがある。
これはJavaで作られたアプリケーションを実行するためのもの。
JDKにはJREも含まれている。
コマンドプロンプトで以下を入力すると、JDKが正常にインストールされたか確認できる。
cd C:\java\jdk-13.0.1\bin java -version
「java -version」の下に、「java version “1.8.0_101″」、
「Java(TM) SE Runtime Environment・・・」、「Java HotSpot(TM)・・・」 と表示されれば正常にJDKがインストールされている証拠。

環境設定-PATHの設定

javacのコマンドを使うためにはそのコマンドがどこにあるかをWindowsに教えなきゃいけない。
そのために必要なのが環境設定。
Windowsアイコンを右クリック、システムを選択。 システム情報をクリック。
システムの詳細情報を開くとシステムのプロパティが開く。
詳細設定、環境変数を選択。
システム環境変数の中にある「Path」を選択、編集。
新規、追加で「C:\Java\jdk-13.0.1\bin」を追加する。
Windowsの再起動でjavacコマンドが使えるようになる。

クラスパス

使用するクラスファイルの位置を教えるもの。
JavaSEライブラリ(クラスファイル)はrt.jarに格納されている。
これをCLASSPATHに指定しておくことで、javacやjavaコマンドでわざわざ-cp、-classpathの
オプションを指定しなくて済む。
.classだけでなく、.classファイルを1つにまとめた.jarファイルも指定可能。
クラスパスに新しいクラスパスを追加する方法
set classpath=%classpath%;新しいパス
この時、classpathや、=の前後に不要な空白を入れないほうがいい。

Javaの実行手順

(1)JavaソースプログラムはJavaコンパイラによりコンパイルされ、 Javaバイトコードに変換される。

(2)JavaバイトコードはJVM(Java仮想マシン)上で実行される。

JavaバイトコードはOS上で実行されるわけではない。
だからJavaプログラムはJVMがインストールされていれば、OSに依存せず実行できる。

Java API

APIは、Application Programming Interface(アプリケーションを作成する際に、システムが提供する機能を使用するためのインターフェース)の略。
Javaで提供されるAPIは全てクラスやインターフェースの形をとっていて、それらのクラスをnewしてインスタンス化したりクラスメソッドを呼び出すことによって必要な機能を使用することができる。
以下にAPIの例を示す。

・System.out.println
Systemクラスが持つoutというクラスフィールドを取得 outというクラスフィールドに格納されたインスタンスのprintlnメソッドを呼び出し
・Math.sqrt
Mathクラスが持つsqrtというクラスメソッドを取得
・String Stringクラス
length()、charAt(int)などのインスタンスメソッドを持つ。

Javaプラットフォーム

Javaはプログラムが動作する環境によりいくつかのプラットフォームに分類される。

J2EE(Java 2 Platform,Enterprise Edition)
サーバーサイドで動作するアプリケーション向けのJavaプラットフォーム。
オンラインショップ、会員制サイトなどのWebアプリケーションの開発でよく使用される。
主要APIには、サーブレット(Webアプリ開発)、JSP(スクリプトベースWebアプリ開発)、EJB(DB、トランザクション管理)などがある。

J2SE(Java 2 Platform,Standard Edition) 全てのJavaにおいて基本となるプラットフォーム。
一般にデスクトップ環境向けJavaプラットフォームといわれている。
業務用ソフト、アプリ開発ソフトなどクライアントPCで動作するアプリケーションの開発でよく使用される。
主要APIにはSwing(GUIアプリ開発)、Applet(Webブラウザアプリ開発)、JDBC(DB接続)などがある。

J2ME(Java 2 Platform,Micro Edition)
モバイル環境向けJavaプラットフォーム。
処理速度、データ容量など リソースが乏しい環境でもスムーズにJavaアプリが動作するように最適化されている。
主要APIはカーナビ、セットトップボックスなど比較的大きめの端末向けのCDCと、PDA・携帯電話など 比較的小さめの端末向けのCLDCに分かれている。
CLDCの元で動作するJVMは特にKVMと呼ばれ(Kはキロバイトのメモリで動作の意味)、 モバイル端末のリソースに合わせ最適化されている。

JavaCard
スマートカード(IC搭載カード)環境向けJavaプラットフォーム。
JavaCard環境を実装したスマートカードがあれば スマートカード発行会社を問わず、同一のJavaアプリを動作させることができる。

Javaのパッケージ

クラスやインターフェースのまとまりをパッケージと呼び、jarファイルとして1つにまとめることができる。
たくさんのクラスファイルの集団としてアプリケーションを考えたとき、内部で利用しているクラスを他のアプリケーションから利用されたくないことがある。
また、大量のクラスファイルに重複しない名前をつけるのは大変で現実的ではない。
そこでパッケージごとにクラスを管理することで開発が容易になる。

パッケージの作り方
package パッケージ名;

パッケージの利用方法
パッケージ内の特定のクラスを使う場合
import パッケージ名.クラス名;
指定したパッケージの全てのクラスを利用する場合
import パッケージ名.*; コアパッケージ
Javaでは便利な機能を持ったクラスを標準クラスライブラリとして実装する。
これらはカテゴリごとにパッケージ化されており、コアパッケージと呼ばれる。

代表的なコアパッケージ
・Java.lang
Javaプログラム言語の設計にあたり基本的なクラスを提供。 全てのクラスのルートとなるObjectクラス、文字列を参照するStringクラス、基本データ型のラップクラス(Integer、Characterなど)が含まれる。
・Java.io
データストリーム、直列化、ファイルシステムによるシステム入出力用に提供。
Java.applet
アプレットの作成、およびアプレットとアプレットコンテキストとの通信に使用するためのクラスの作成に必要なクラスを提供。
Java.awt
ユーザーインターフェースの作成と、グラフィックとイメージのペイントのためのクラスが含まれている。JDK1.2(Java2)からSwingに拡張された。
Java.beans
JavaBeansの開発に関連するクラスが含まれている。
Java.net
ネットワーク対応アプリケーションを実装するためのクラスを提供。
Java.util
コレクションフレームワーク、従来のコレクションクラス、イベントモデル、日付と時刻の機構、国際化、および 様々なユーティリティクラス(文字列トークナイザ、乱数ジェネレータ、ビット配列)が含まれている。
Javax.swing
GUI(Graphical User Interface)コンポーネント、JFC(Java Foundation Classes)の一部。 全てのプラットフォームで可能な限り同じように機能する「軽量」(Java共通言語)コンポーネントのセットを提供する。 AWT(Abstract Window Toolkit)の機能強化(継承)として実装。AWTが実行環境のウィンドウシステム特有のコードを利用しているのに対し、 Swingは完全にJavaだけで作られたコンポーネント。
org.omg.CORBA OMG CORBA
APIのJavaプログラミング言語(ORBクラスを含む)へのマッピングを提供する。

デフォルトパッケージ

javaにおいて、クラスはすべてパッケージの中に収められるが、
テストとしてとりあえずコードを動かしたいときなどに使うようとして、
パッケージに入らないクラスを作ることができる。
そのクラスを、デフォルトパッケージのクラスという。

module-info

どのパッケージが、どのパッケージから参照されるかの繋がりを表すもの。
これがないと、想定外のパッケージをimportしてしまい、エラーへとつながる可能性がある。

クラス

変数やメソッドを持ったもの。
クラスからオブジェクト(インスタンス)を作り、それぞれに変数の値やメソッドの実装を持たせて処理を行う。
class クラス名{
  変数やらメソッドを書く
}
インスタンスの作り方
クラス名 インスタンス名 = new クラス名();
()の中に引数を入れることで、あらかじめ値を持ったインスタンスを作ることができる。

コンストラクタ

インスタンスが作られるときに呼ばれる処理。
クラスメイト同じ名前を持つ。
class クラス名1{
  クラス名1(){
    これがコンストラクタ。
  }
}
コンストラクタはメソッドと違って引数の返り値を設定しなくていい。

継承 extends

class 子クラス extends 親クラス{
  実装
}
こう書くことで、親クラスを継承した子クラスを作れる。
子クラスは親クラスのメソッドや変数を使える。

Javaの修飾子

アクセス修飾子

private
自分のクラス内からしかアクセスできない。

protected
同じパッケージ及び継承するサブクラスからしかアクセスできない。

public
全ての場所からアクセス可能。

パッケージアクセス(デフォルト)
同じパッケージに属するクラス内からしかアクセスできない。

アクセス修飾子以外の修飾子

abstract
抽象クラス、抽象メソッド。
継承されて、実装を記述されて初めてインスタンス化可能となる。

static
インスタンス化してもしなくても利用可能なクラス固有のメンバー。
クラス内に1つしか存在せず、すべてのインスタンスで共有される。

final
継承できずオーバーライドできないメンバー。
コアパッケージのクラスはほとんどfinal。
一度代入した値を変えることができない。定数?

strictfp
浮動小数点数がCPUの処理系に依存せずに厳密に同じ演算結果となる。

transient
直列化(シリアライゼーション)不可能。JVMの外部に書き出し不能なメンバー。

volatile
マルチスレッドによるアクセス時に、必ずマスターコピーと同期をとる。

変数の宣言の違い

クラスメンバ変数、クラスメソッド
そのクラス内で1つという位置づけ。
そのクラスからいくつオブジェクトを生成しても1つだけ存在しない。
それぞれのオブジェクトにメンバ変数、メソッドが割り当てられることはない。

インスタンスメンバ変数、インスタンスメソッド
オブジェクトごとに存在する変数、メソッド。
クラスからオブジェクトが生成されるとそれぞれのオブジェクトに対し、インスタンスメンバ変数、インスタンスメソッドが割り当てられる。

クラスメンバ変数、クラスメソッドの宣言方法
static String s=”クラスメンバ変数の宣言方法”;
static void classM(){
   System.out.println(“クラスメソッドの宣言方法”);
}
staticな変数やメソッドは、インスタンスを作らなくても使用できる。

abstract 抽象クラス、抽象メソッド

抽象メソッド
実装を持たないメソッド。
抽象メソッドは、それぞれのサブクラスでオーバーライドして使われる。

抽象クラス
抽象メソッドを持ったクラス。

抽象メソッド、抽象クラスの宣言方法
abstract 戻り型 メソッド名(引数型 引数名); ※実装を持たないから{}はいらない。
abstract class クラス名{
}

抽象クラスのルール
1.抽象クラスのオブジェクトは生成できない。
2.抽象メソッドがあるクラスは必ず抽象クラスとして宣言しなければならない。
3.抽象メソッドがない抽象クラスを宣言することもできる。
必ず継承が行われ、何らかのメソッドの変更があることを表す。
4.抽象クラスを継承したサブクラスで抽象メソッドを実装(オーバーライド)しない場合、
そのサブクラスは抽象クラスとして宣言される。

オーバーライド

スーパークラスにおいて定義されているインスタンスメソッドを、サブクラス内で再定義すること。
スーパークラスのメソッドを書き換えるのでなく、サブクラスで新しいメソッドとして定義する感じ。

オーバーライドの定義に必要な条件

1.オーバーライドが適用されるのはアクセスレベルがprivate以外のインスタンスメソッドのみ。

private修飾子は同一クラス内のみ参照可能だから、クラスをまたぐオーバーライド概念にはあてはらまない。
スーパークラスで定義されているクラスメソッド、メンバ変数をサブクラスで再定義することは
隠ぺいといわれ、オーバーライドとは区別される。

2.オーバーライドする側とされる側で戻り値、メソッド名、引数型、引数の数を合わせなければいけない。

どれか1つでも異なる場合はオーバーライドとはみなされない。

3.オーバーライドされる側よりも厳しいアクセスレベルを設定することはできない。

オーバーライドされる側のメソッドにprotectedが指定されている場合、オーバーライドする側でprivateを指定することはできない。

4.final修飾子のメソッドをオーバーライドすることはできない。

5.abstract修飾子が付与されたメソッドは必ずオーバーライドしなければならない。

オーバーライドしない場合は、そのサブクラス全体がabstractクラスになる。

オーバーロード

同一クラス内でメソッド名が同一で引数の型、数、並び順が異なるメソッドを複数定義すること。

(例)
会員登録を行うシステムで、名前と国名を登録させたいとする。
国名を入力しなかった会員は国名を日本として登録するとする。
その場合、引数の数によってメソッドを異なる名前で2つ設定するよりも、同じ名前で引数の数を変えて作成したほうがいい。
同じ機能を持つものは同じメソッド名にしたほうがプログラムがきれいに見える。

引数の型、引数の数、引数の並び順が異なっていれば、異なるメソッドと認識される。
戻り型、アクセスレベル、引数名、throws節が異なっていても異なるメソッドとは認識されず、コンパイルエラーとなる。

インターフェース

インターフェースは処理内容を具体的に書かず実装するもの。
後から実装を書いて使う。

interface Calc{
   void calc();
}

インターフェースには、定数とメソッドのみを記述できる。
インターフェースのメンバ変数は、自動的にpublic static finalがつけられるから定数になる。

インターフェースのメソッドは、抽象メソッドと同じように、インターフェースを実装したクラスでメソッドを実装する必要がある。
クラスにインターフェースを実装するにはimplementsを記述する。

class jissosaki implements Calc{
    public void Calc(){
       実装を書く
    }
}

クラスをtashizan、hikizanと2つ作って、それぞれCalcを実装。
tashizanでは足し算を行う実装、hikizanでは引き算を行う実装を書くことで、
同じ「Calc」という名前でも別の処理を持ったメソッドにできる。
tashizan.Calchikizan.Calc

superによる親クラスの呼び出し

子クラスから、
super(引数の値)
と書くと、親クラスのコンストラクタを呼び出せる。
呼び出すコンストラクタは、引数の値によって決まる。

引数の値にintを指定しているコンストラクタを呼び出したいときは
super(1)
などと書き、引数の値にstringを指定しているコンストラクタを呼び出したいときは
super(“aaaa”)
という風に書く。

また、super.変数名と書くと、親クラスの変数を参照することができる。
super.メソッド名で、親クラスのメソッドを呼び出すこともできる。

jar

jarとは、いろんなクラスやその中で使われる画像などをまとめて
1つのファイルにしたもの。

jarファイルには、マニフェストファイルが必要になる。
マニフェストファイルとは、どのクラスがメインメソッドを持っているかを記述するもの。

カプセル化

クラスが、他のクラスやパッケージから直接変数などを変更されないようにすること。
privateの修飾子などをつけてカプセル化を行う。

ユーティリティクラス

汎用性のある変数やメソッドをstaticに定義して、いろんなクラスで便利に使えるようにするクラス。
staticに定義されたメソッドは、インスタンスを作らなくても使用できるので、ユーティリティクラスをimportするだけで、メソッドが気軽に使用できる。

javaの文字列の比較

javaはString型を
str1 == str2 で比較することはできない。
str1.equals(str2)がtrueのとき、この2つの文字列は同じであると判断できる。

タイトルとURLをコピーしました