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();
}
}