5.オブジェクト指向プログラミング

(1)オブジェクト指向プログラミング オブジェクト指向プログラミングとは、プログラムをオブジェクト(物)の集まりとして考え、プログラム全体をオブジェクトとオブジェクトとの関連で記述することによって処理を構築していくプログラミング言語。オブジェクト指向プログラミングによる実際のプログラム開発は、部品単位で恣意佐奈プログラムを作成し、これらを組み合わせて大規模なプログラムを作成することです。 (2)クラスの仕組み クラスとはオブジェクトの設計図(型)のようなもので、その設計図にはオブジェクトがどのような性質や機能を持っているかが宣言されていると考えれば理解しやすいと思います。 ①クラスの宣言   class クラス名 class display{ ②フィールド クラス情報を保持するものをフィールドと呼びます。 class クラス名{   型 フィールド名; } ③フィールドにアクセス 「.」ドット演算子を使用する。例えばplaneのオブジェクトにアクセスする場合は次のとおり。 オブジェクト名.フィールド名 (3)カプセル化 カプセル化とは、クラスを利用する場合に、そのクラスのフィールドを直接操作することを禁止し、クラスのメソッドを使用して間接的にフィールドを操作するように制限してクラスの独立性、安全性を高めることです。 ①クラス外からアクセスできないメンバの作成 「private」を指定することでクラス外からアクセスできないメンバとなります。

class airplane {											
	private double fuel;										
	private String iro;										
	void dataset(double num,String str){										
		fuel=num;									
		iro=str;									
	}										
											
	double getfuel(){										
		return fuel;									
	}										
	String getiro(){										
		return iro;									
			}								
											
	}										
class sample {				
	public static void main(String args[]) {			
		airplane plane = new airplane();		
		plane.dataset(100, "赤");		
		double num = plane.getfuel();		
		System.out.println("飛行機の燃料は" + num + "です");		
		String str = plane.getiro();		
		System.out.println("飛行機の色は" + str + "です");		
	}			
}				
②クラス外からアクセスできるメンバpublicの作成
class airplane {											
	private double fuel;										
	private String iro;										
	public void dataset(double num,String str) {										
		fuel=num;									
		iro =str;									
	}										
											
public double getfuel() {											
	return fuel;										
}											
											
public String getiro() {											
	return iro;										
}											
}											
public class sample {			
	public static void main(String[] args) {		
	airplane plane=new airplane();		
	plane.dataset(100,"赤");		
	double num=plane.getfuel();		
	System.out.println("飛行機の燃料は"+num+"です");		
	String str=plane.getiro();		
	System.out.println("飛行機の色は"+str+"です");		
	}		
}		
③メソッドのオーバーロード  一つのクラスの中に同じ名前の複数のメソッドを宣言することを、メソッドのオーバーロードと呼びます。 Javaでは書くメソッドの引数の数や引数のデータ型が異なれば、同じ名前のメソッドを作成できます。
class airplane {			
	private double fuel;		
	private String iro;		
			
	public void dataset(double num, String str) {		
		fuel = num;	
		iro = str;	
	}		
			
	public void dataset(double num) {		
		fuel = num;	
	}		
			
	public void dataset(String str) {		
		iro = str;	
	}		
			
	public void display() {		
		System.out.println("飛行機の燃料は" + fuel + "です");	
		System.out.println("色は" + iro + "です");	
	}		
}			
public class sample001 {		
	//オーバーロード メインメソッドでフィールドに値を設定	
	public static void main(String[] args) {	
		airplane plane = new airplane();
		plane.dataset(100, "赤");
		plane.display();
		
		plane.dataset(500, "黄色");
		plane.display();
		
		plane.dataset("青");
		plane.display();
		
	}	
		
}		
④コンストラクタ コンストラクタはクラスのオブジェクトが作成されたときに、自動的に実行される処理のことです。初期値を設定したい場合に使用します。
class airplane {		
	private double fuel;	
	private String iro;	
		
	//コンストラクタを宣言する	
	public airplane() {	
		fuel = 0;
		iro = "未指定";
	}	
		
	//ディスプレイメソッドの宣言	
	public void display(){	
		System.out.println("飛行機の燃料は"+fuel+"です");
		System.out.println("色は"+iro+"です");
	}	
}
public class sample002 {			
			
	public static void main(String[] args) {		
		//コンストラクタが呼び出される	
		airplane plane=new airplane();	
		plane.display();	
	}		
}			
⑤コンストラクタをthisで呼び出す
class airplane {		
	private double fuel;	
	private String iro;	
		
	public airplane() {	
		fuel = 100;
		iro = "未指定";
	}	
		
	public airplane(double num) {	
		//引数のないコンストラクターを呼び出す
		this();
		fuel = num;
	}	
		
	public void display(){	
		System.out.println("飛行機の燃料は"+fuel+"です");
		System.out.println("色は"+iro+"です");
	}	
}		
public class sample003 {		
		
	public static void main(String[] args) {	
		airplane plane=new airplane();
		plane.display();
	}	
}		
⑥コンストラクタを宣言しない場合
class airplane {	
	private double fuel;
	private String iro;
	
	//デフォルトコンストラクタを明示的に宣言
	public airplane() {
	}
	public void display() {
	
	}
}	
class sample004 {	
	public static void main(String[] args) {	
	}
}	
⑥コンストラクタをカプセル化 コンストラクタにprivate修飾子をつけると、コンストラクタをカプセル化することでができます。 呼び出し元のクラスではコンストラクタを呼び出されるようなオブジェクトの作成ができなくなります。その代わりにpublic修飾子をつけた引数のあるコンストラクタの中で、this()を使用してこのコンストラクタを呼び出しています。
class airplane {											
	private double fuel;										
	private String iro;										
											
	//private修飾子を指定したコンストラクタ										
	private airplane() {										
		fuel = 0;									
		iro = "未指定";									
	}										
											
	public airplane(double num) {										
		//private修飾子を指定したコンストラクタを呼び出す									
		this();									
		fuel = num;									
	}										
											
	public void display(){										
		System.out.println("飛行機の燃料は"+fuel+"です");									
		System.out.println("色は"+iro+"です");									
	}										
}
public class sample005 {		
	public static void main(String[] args) {	
	}
}	
(4)クラス変数/クラスメソッド ①クラス変数 クラスに関連付けられている変数をクラス変数と呼ぶ。クラス変数の値は、そのクラスから作成したすべてのオブジェクト間で共通で使用することができ、staticという修飾子をつけて変数を宣言します。
public class hensu {			
	//クラス変数を宣言		
	public static int num = 1;		
	}		
public class sample001 {				
				
	public static void main(String[] args) {			
		//クラスメソッドを呼び出す		
		int hen=hensu.display();		
		System.out.println("クラス変数の値は"+hen+"です");		
	}			
}				
②クラスメソッド クラスメソッドは、そのクラスからオブジェクトが作成されていなくても呼び出すことができるメソッド。staticという修飾子をつけてメソッド宣言します。
class hensu {											
	private static int num = 10;										
	//クラスメソッド										
	static int display() {										
		return num;									
	}										
}											
public class sample001 {				
	public static void main(String[] args) {			
		//クラスメソッドを呼び出す		
		int hen=hensu.display();		
		System.out.println("クラス変数の値は"+hen+"です");		
	}			
}				
③メソッドにオブジェクトを渡す メソッドのオブジェクトを渡すとオブジェクト参照が渡されます。メソッド内のコードがオブジェクトのメンバにアクセスできるようになります。参照でわたされているので、渡されたオブジェクトを変更すると元のオブジェクトも変更されます。
		
class intData {			
	public int num1;		
	public int num2;		
	public int num3;		
			
	intData(int n1, int n2, int n3) {		
		num1 = n1;	
		num2 = n2;	
		num3 = n3;	
	}		
}			
class compute {			
	public void add(intData i) {		
		//オブジェクトのメンバであるフィールドにアクセス	
		System.out.println("計算結果は");	
		System.out.println((i.num1 + i.num2 + i.num3) + "です");	
	}		
}			
class sample001 {			
	public static void main(String[] args) {		
		intData data = new intData(1, 2, 3);	
		compute comp = new compute();	
		//オブジェクトを渡している	
		comp.add(data);	
	}		
}			
④メソッドからオブジェクトを返す
class DataClass {	
	public int num1=1;
	public int num2=2;
	public int num3=3;
}	
	
class ObjectClass {	
	public DataClass getObject() {
	
	}
}	
public class sample003 {				
	public static void main(String[] args) {			
		ObjectClass obj=new ObjectClass();		
		//メソッドからオブジェクトが返されています。		
		DataClass data=obj.getObject();		
		System.out.println("計算結果は");		
		System.out.println((data.num1+data.num2+data.num3));		
		System.out.println("です");		
	}			
}				
(5)スーパークラスとサブクラス javaではすでに存在するクラスを元にしてそれに新しいフィールドやメソッドを追加したり、すでに存在するメソッドを上書きしてクラスを拡張したりします。 ●スーパークラス  別のクラスによって拡張された、その拡張元のクラスのこと。 ●サブクラス  別のクラスによって拡張してできるクラス。 ①継承 継承とは、サブクラスがスーパークラスのフィールドとメソッドをすべて受け継ぐことができます。 ②継承を使ってクラスを作成(extends)
class airplane {					
	private double fuel;				
	private String iro;				
					
	public void setdata(double num,String str){				
		fuel=num;			
		iro=str;			
	}				
	public void display(){				
		System.out.println("飛行機の燃料は"+fuel+"です");			
		System.out.println("色は"+iro+"です");			
	}				
}					
class jumbojet extends airplane {		
	private int runway;	
	public void setrunway(int way) {	
		runway = way;
	}	
	public void displayrunway() {	
		System.out.println("滑走路は" + runway + "番です");
	}	
}		
		
class sample005 {		
	public static void main(String[] args) {	
		jumbojet jumbo = new jumbojet();
		jumbo.setdata(100, "赤");
		jumbo.display();
		jumbo.setrunway(1);
		jumbo.displayrunway();
	}	
}		
③スーパークラスのフィールドにアクセス スーパークラスのフィールドにアクセスするには、スーパークラスのフィールドにprotectedを指定します。
class airplane {					
	protected double fuel;				
	protected String iro;				
					
	public void setdata(double num,String str){				
		fuel=num;			
		iro=str;			
	}				
}					
					
class sample006 {					
	public static void main(String[] args) {				
		jumbojet jumbo = new jumbojet();			
		jumbo.setdata(100, "赤");			
		jumbo.display();			
		jumbo.setrunway(1);			
	}				
}					
class jumbojet extends airplane {				
	private int runway;			
	public void setrunway(int way) {			
		runway = way;		
	}			
				
	public void display() {			
		System.out.println("滑走路は" + runway + "番です");		
		System.out.println("飛行機の燃料は" + fuel + "です");		
		System.out.println("色は" + iro + "です");		
	}			
}
④メソッドのオーバライド メソッドのオーバーライドとは、スーパークラスのメソッドの機能をサブクラスで背年限しなおし、サブクラスで宣言し直したメソッドがスーパークラスのメソッドにかわって機能すること。
class airplane {			
	protected double fuel;		
	protected String iro;		
			
	public void setdata(double num, String str) {		
		fuel = num;	
		iro = str;	
	}		
	public void display() {		
		System.out.println("飛行機の燃料は" + fuel + "です");	
		System.out.println("色は" + iro + "です");	
	}		
}			
			
class sample007 {			
	public static void main(String[] args) {		
		jumbojet jumbo = new jumbojet();	
		jumbo.setdata(100, "赤");	
		jumbo.setrunway(1);	
		jumbo.display();	
	}		
}			
class jumbojet extends airplane {				
	private int runway;			
				
	public void setrunway(int way) {			
		runway = way;		
	}			
	//スーパークラスのメソッドをオーバーライドしている			
	public void display() {			
		System.out.println("飛行機の燃料=" + fuel);		
		System.out.println("色=" + iro);		
		System.out.println("滑走路=" + runway);		
	}			
}				
⑤インターフェースの実装 インターゲースとはフィールドとメソッドを持ち、フィールドは「public static final」が指定された定数、メソッドは「public abstract」が指定された抽象メソッドであり、インターフェースのオブジェクトは作成することはできないといった特徴をもちます。 interface インターフェース名 { 型 フィールド名=式; 戻り値の型 メソッド名(); }
interface display {				
	//フィールドを宣言(定数)			
	int num1 = 100;			
	int num2 = 10;			
	//メソッドを宣言(抽象メソッド)			
	void disp();			
}				
				
class minus implements display {				
	public void disp() {			
		System.out.println(num1 + "-" + num2 + "=");		
		System.out.println((num1 - num2) + "です");		
	}			
}				
class plus implements display {		
	public void disp() {	
		System.out.println(num1 + "+" + num2 + "=");
		System.out.println((num1 + num2) + "です");
	}	
}		
		
		
class sample {		
	public static void main(String[] args) {	
		plus obj1 = new plus();
		obj1.disp();
		minus obj2 = new minus();
		obj2.disp();
	}	
}