1. 程式人生 > >Java 面向物件基礎

Java 面向物件基礎

由於對此概念產生了模糊,所以再來總結學習一下,不對之處,請指正。

說起面向物件,首先要說明一下Java類,其本質是用來描述事物型別的。關於Java方法的建立和過載和類的定義、宣告,由以下演示:

class  類名{//類名一般大寫
	屬性;
	方法:
	訪問修飾符 返回值型別 方法名(){
	方法主體	
}
}
其中,注意Java方法的返回值型別,如果沒有特殊要求返回值型別,可以定義為void,這樣就不需要在此方法結束的時候return一個該返回型別的值,除void以外的int、String、float等均需要返回對應型別的數值。

關於過載Java方法,即方法名相同,只是引數型別或者個數不同而已,如下。

public void Person(int age) {
}
public void Person(String name) {
}
從上邊兒的示例可以看出,僅僅改變了Person傳入引數的型別,即實現了Java方法的過載。

接下來看類與物件的關係:

1.類:就是對現實生活中事物的描述,主觀抽象,是物件的模板,可以例項化物件。//對映到java中,描述就是class定義的類。

習慣上,類的定義中除了上文闡述的,還有一個預設的建構函式(或者稱為構造器)。建構函式的作用主要是給物件進行初始化,當一個建構函式建立時,就會呼叫與之相對應的建構函式。而如果類中沒有定義建構函式,則系統會預設給該類加入一個空引數的建構函式。建構函式的建立方法和Java方法的建立相似,因為其本質也屬於一個Java方法。但在執行時有很大的區別,建構函式在物件建立時就會立即執行,給物件初始化,而一般Java方法則在物件呼叫該方法時才會被執行,同時,建構函式只執行一次。

class Person
{
	//Person(){}  空引數建構函式。
	private String name;
	private int age;
	public void main( String[] args)
	{
		System.out.println("person code run");
	}
	//函式的過載
	Person()
	{
		System.out.println("A:name="+name+"..age="+age);
	}
}
上述程式碼中,註釋掉的Person(){},即為空引數建構函式,因為下面將該函式進行了過載,空引數Person()就不能再出現。

2.物件:就是這類事物,實實在在存在的個體,類的個體。//new 對映到堆記憶體中的一個實體。

先看一個簡單的例子:
class  Demo
{
	public static void main(String[] args) 
	{
		Person per;//宣告
		per = new Person();//例項化
		Person per = new Person();//宣告並例項化
	}
}
class Person{
	
}
其中,包含了一個類的宣告、例項化方法。這裡需要對例項化的過程說明一下,就拿
Person per = new Person("zhangsan",25);
這句程式碼來看,它具體的執行了哪些操作?

首先,new用到了Person.class,所以先找到該檔案並載入到記憶體中。如果該類中有相對應的靜態方法,則執行該方法對Person.class進行初始化。然後在堆記憶體中開闢空間,分配記憶體地址,其中的Person per是在棧記憶體中指向堆記憶體的,使用new開闢一個堆記憶體空間來對記憶體中建立的物件per進行預設初始化。對per屬性進行初始化,比如name、age等,然後對物件進行對應建構函式的初始化,最後將記憶體地址賦予變數per。


3.面向物件的特徵:封裝、繼承、多型

1>封裝,顧名思義,就是將一個事物自我封裝起來,外界看不到內部,只有自己可以看到自己內部,比如一個快遞,用箱子封裝起來一樣,你不拆開箱子,你是看不到內部有什麼東西的,而箱子內部的東西知道內部有什麼(What the hell?我用了擬人的手法[手動滑稽])。而Java中的封裝也一樣,是為了不讓外部訪問到內部,只是提供一個介面,可以讓外部來進行呼叫,具體內部的方法不會讓你去修改,典型的封裝就是jar包。

2>繼承,也很簡單,就是將父類的東西傳承下來,在定義和實現一個子類的時候,不用再去重複的書寫已有的方法,繼承和封裝的區別在於,前者可以對父類的一些方法進行復寫和修改,而後者只能呼叫不能修改。繼承提高了程式碼的擴充套件性和重複使用性。

3>多型,這個目前本人沒有用到多,所以也不好說怎麼使用,希望在以後的使用中再來完善。

4.說完了上述的一些基本內容,索性再來鞏固一下基礎知識,接下來,簡單總結一下變數和訪問修飾符等一些基礎知識。

1>變數分為區域性變數和全域性變數,從名稱就可以看出,二者的作用範圍不同,如下

class  Demo
{
	String name;
	int age;
	public static void main(String[] args) 
	{
		float num;
		char ch;
	}
}
其中,name和age均作為全域性變數存在,作用於整個類,而num和ch僅僅在main方法中可以呼叫。

2>幾種訪問許可權
public:此種修飾,表示任何地方均可以訪問。

protected:在此類內部,或者同一個包中,子類中均可以訪問到,是介於public和private兩者之間的一種訪問修飾符。

private:僅限當前類內部訪問。

public class TestDemo{
	public void main(String[] args){
		sop(t.getNum());
	}
	
	public void sop(Object object){
		System.out.println(object);
	}
}
class Num{
	public int a = 1;
	protected  b = 2;
	private int c = 3;
	public int getNum(){
		return c;
	}
}
可以看出,編譯失敗,因為c定義為private,僅限於內部類訪問,所以不能被外部的class訪問到,但是getNum()方法因為是public定義的,所以TestDemo可以訪問到。

3>其他的一些修飾符

static:使用static修飾的方法屬於類的方法,在載入類以後就可以自己呼叫,不需要建立任何類的例項物件,使用方法:類名.方法名。

如:int abc = Num.getNum();
final:final修飾的類不能再被繼承,其修飾的方法也不能被覆蓋,而其修飾的變數在初始化後就不允許再修改了。

this:這個有必要重點說一下,乍一看,this是代表當前的意思,是處理區域性變數和全域性變數的重名,而什麼時候使用this呢?當定義類中函式功能時,該函式內部要用到呼叫該函式的物件時,這時用this來表示這個物件,簡單來說,哪個物件在呼叫this所在的函式,this就代表哪個物件。(this的作用,其實是在類之間相互呼叫的時候傳入某個相同變數名的值時使用)。

class Person
{
	private String name;
	private int age;
	Person(String name)
	{
		this.name=name;
	}
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public void speak()
	{
		System.out.println("name="+this.name+"..age="+this.age);
		show();//省略this.
	}
	public void show()
	{
		System.out.println(this.name);
	}

	public boolean compare(Person p)
	{
		return this.age==p.age;
	
	}
}
class PersonTest 
{
	public static void main(String[] args) 
	{
		Person p1=new Person("張三",20);
		Person p2=new Person("李四",25);
		boolean b=p1.compare(p2);
		System.out.println(b);
		//Person p = new Person("李四");
		//p.speak();
	}
}