1. 程式人生 > >JAVA基礎之類抽象類,介面,內部類

JAVA基礎之類抽象類,介面,內部類

1.抽象類

抽象類往往用來表達對問題的抽象。

定義抽象類應該注意:

(1)abstract是定義抽象類的關鍵字,放在class的前面。

(2)abstract在方法中宣告,則該方法則是抽象的方法,抽象方法是沒有方法體的,即為實現。

(3)一個抽象類可以可以包含多個抽象方法,也可含有已實現的方法。

看一個例子:


public class Circle extends Shape{

	public Circle(double dim) {
		super(dim);
		// TODO Auto-generated constructor stub
	}

	public double callAres() {
		// TODO Auto-generated method stub
		return 3.14*dim*dim;
	}

	public double callPerimter() {
		// TODO Auto-generated method stub
		return 2*3.14*dim;
	}
	public static void main(String[] args) {
		Shape shape = new Circle(3.0);
		System.out.println(shape.callAres());
		System.out.println(shape.callPerimter());
	}

}

需要注意的是:為實現的方法和空方法是不同的,

空方法是有函式體的,而為實現的方法是沒有函式體的。

Shape類是一個抽象類,Circle繼承了Shape。一個類在繼承抽象類的時候必須實現他的所有的抽象方法,如果沒有那麼這個類也要申明為抽象類。

抽象類是不能例項化物件的,但可以定義一個抽象類的物件,並引用器非抽象子類的物件。

2.介面

interface是介面的關鍵字

介面是一種特殊的抽象型別,是對抽象類的進一步強化。

一般情況介面中的方法都是沒有實現的,但是在jdk1.8以後可以出現實現的方法,需要使用default關鍵字。

介面的實現,使用implements關鍵字可以實現多個介面,介面之間用逗號隔開、

一個類實現一個介面時,需要實現介面中定義的所有沒有方法體的方法。

在介面中只能定義常量,而且是public static final形式的。且必須要付出值。

例子:


public interface MyInterface {
	public void add(int x,int y);
	public void volume(int x,int y,int z);
}

public interface MultiInterface {
	public static final double PI=3.1415;
	public void callArea();
}	

public class MyClass implements MyInterface {


	public void add(int x, int y) {
		// TODO Auto-generated method stub
		System.out.println(x+y);
	}

	public void volume(int x, int y, int z) {
		// TODO Auto-generated method stub
		System.out.println(x+y+z);
	}
	public static void main(String[] args) {
		MyInterface mi = new MyClass();
		mi.add(3, 4);
		mi.volume(1, 2,3);
	}
}

public class MyClass2 implements MyInterface,MultiInterface{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyClass2 myclass = new MyClass2();
		myclass.callArea();
		myclass.add(3,1);
		myclass.volume(1, 2,3);
	}

	public void callArea() {
		// TODO Auto-generated method stub
		System.out.println("哈哈,例子沒舉好,尷尬!");
		
	}

	public void add(int x, int y) {
		// TODO Auto-generated method stub
		System.out.println(x+y);
	}

	public void volume(int x, int y, int z) {
		// TODO Auto-generated method stub
		System.out.println(x+y+z);
	}

}

3.instanceof運算子:

<引用型別變數>instanceof<引用型別>   如果這個表示式為真(Boolean型別),左側引用型別變數所引用的物件的實際型別是右側給出的型別或者其子類的型別。

例子:

package com.dh.ch05;

//定義IBase介面
interface IBase {
	public void print();
}

// 定義Derive類實現IBase介面
class Derive implements IBase {
	int b;

	public Derive(int b) {
		this.b = b;
	}

	public void print() {
		System.out.println("In Derive!");
	}
}

// 定義Derive的子類Derive1
class Derive1 extends Derive {
	int c;

	public Derive1(int b, int c) {
		super(b);
		this.c = c;
	}

	public void print() {
		System.out.println("In Derive1!");
	}
}

public class InstanceofDemo {
	// 判斷物件型別
	public static void typeof(Object obj) {
		if (obj instanceof Derive) {
			Derive derive = (Derive) obj;
			derive.print();
		} else if (obj instanceof Derive1) {
			Derive1 derive1 = (Derive1) obj;
			derive1.print();
		}
	}

	public static void main(String[] args) {
		IBase b1 = new Derive(4);
		IBase b2 = new Derive1(4, 5);
		System.out.print("b1 is ");
		// 呼叫typeof()判斷b1物件型別
		typeof(b1);
		System.out.print("b2 is ");
		// 呼叫typeof()判斷b2物件型別
		typeof(b2);
	}
}
b1 is In Derive!
b2 is In Derive1!

4.物件的轉換

4.1自動轉換:

子類轉換成父類(或者實現類轉換成介面)時,裝換可以自動完成。

4.2強制裝換:

父類轉換成子類(介面裝換成實現類)時,必須使用強制轉換。

5.內部類:

內部類分為成員內部類,區域性內部類,靜態內部類,匿名內部類。

5.1成員內部類的例子:

package com.dh.ch05;
public class OuterClass1 {
	private int i = 10;
	private int j = 20;
	private static int count = 0;

	public static void func1() {
	}

	public void func2() {
	}

	// 成員內部類中,可以訪問外部類的所有成員
	class InnerClass {
		// 成員內部類中不允許定義靜態變數
		// static int inner_i = 100;
		int j = 100; // 內部類和外部類的例項變數可以共存
		int k = 1;

		void innerFunc1() {
			// 在內部類中訪問內部類自己的變數直接用變數名
			System.out.println("內部類中k值為:" + k);
			System.out.println("內部類中j值為:" + j);
			// 在內部類中訪問內部類自己的變數也可以用this.變數名
			System.out.println("內部類中j值為:" + this.j);
			// 在內部類中訪問外部類中與內部類同名的例項變數用 "外部類名.this.變數名"
			System.out.println("外部類中j值為:" + OuterClass1.this.j);
			// 如果內部類中沒有與外部類同名的變數,則可以直接用變數名訪問外部類變數
			System.out.println("外部類中count值為:" + count);
			// 直接訪問外部類中的方法
			func1();
			func2();
		}
	}

	public void func3() {
		// 外部類的非靜態方法訪問成員內部類時,必須通過建立成員內部類的物件才能訪問
		InnerClass inner = new InnerClass();
		inner.innerFunc1();
	}

	public static void main(String[] args) {
		// 內部類的建立原則是,首先建立外部類物件,然後通過此物件建立內部類物件
		OuterClass1 out = new OuterClass1();
		OuterClass1.InnerClass outin1 = out.new InnerClass();
		outin1.innerFunc1();
		// 也可將建立程式碼合併在一塊
		OuterClass1.InnerClass outin2 = new OuterClass1().new InnerClass();
		outin2.innerFunc1();
	}
}
內部類中k值為:1
內部類中j值為:100
內部類中j值為:100
外部類中j值為:20
外部類中count值為:0

5.2區域性內部類

package com.dh.ch05;

public class OuterClass2 {
	private int s = 10;
	private int k = 0;

	public void func1() {
		final int s = 20;
		final int j = 1;
		// 區域性內部類
		class InnerClass {
			int s = 30;// 可以定義與外部類同名的變數

			// static int m = 20;//不可以定義靜態變數
			void innerFunc() {
				// 如果內部類沒有與外部類同名的變數,在內部類中可以直接訪問外部類的例項變數
				System.out.println("外圍類成員:"+k);
				// 可以訪問外部類的區域性變數(即方法內的變數),但是變數必須是final的
				System.out.println("常量:"+j);
				// 如果內部類中有與外部類同名的變數,直接用變數名訪問的是內部類的變數
				System.out.println("常量:"+s);
				// 用this.變數名訪問的也是內部類變數
				System.out.println("常量:"+this.s);
				// 用外部類名.this.內部類變數名訪問的是外部類變數
				System.out.println("外部類成員變數:"+OuterClass2.this.s);
			}
		}
		new InnerClass().innerFunc();
	}

	public static void main(String[] args) {
		// 訪問區域性內部類必須先定義外部類物件
		OuterClass2 out = new OuterClass2();
		out.func1();
	}
}
外圍類成員:0
常量:1
常量:30
常量:30
外部類成員變數:10

5.3靜態內部類

package com.dh.ch05;

public class OuterClass3 {
	private static int i = 1;
	private int j = 10;

	public static void func1() {
	}

	public void func2() {
	}

	// 靜態內部類可以用public,protected,private修飾
	static class InnerClass {
		// 靜態內部類中可以定義靜態或者非靜態的成員
		static int inner_i = 100;
		int inner_j = 200;

		static void innerFunc1() {
			// 靜態內部類只能訪問外部類的靜態成員(包括靜態變數和靜態方法)
			System.out.println("Outer.i=" + i);
			func1();
		}

		void innerFunc2() {
			// 靜態內部類不能訪問外部類的非靜態成員(包括非靜態變數和非靜態方法)
			// System.out.println("Outer.i"+j);
			// func2();
		}
	}

	public static void func3() {
		// 外部類訪問內部類的非靜態成員:例項化內部類即可
		InnerClass inner = new InnerClass();
		inner.innerFunc2();
		// 外部類訪問內部類的靜態成員:內部類.靜態成員
		System.out.println(InnerClass.inner_i);
		InnerClass.innerFunc1();
	}

	public static void main(String[] args) {
		new OuterClass3().func3();
		// 靜態內部類的物件可以直接生成
		OuterClass3.InnerClass inner = new OuterClass3.InnerClass();
		inner.innerFunc2();
	}
}
100
Outer.i=1

下一篇是異常處理:

https://blog.csdn.net/sunshunli/article/details/84401428