JavaSE基礎系列之面向物件(上)
面向物件
1,什麼是面向物件?
面向物件(Object Oriented,OO)是軟體開發方法,是一種對現實世界理解和抽象的方法。
面向物件的思想已經涉及到軟體開發的各個方面。如,面向物件的分析(OOA,Object Oriented Analysis),面向物件的設計(OOD,Object Oriented Design)、以及我們經常說的面向物件的程式設計實現(OOP,Object Oriented Programming)。
我們寫程式就相當於OOP。
面向物件中有兩個概念,類和物件,這兩個可以理解為面向物件的一個基石。
馬雲說,要讓天下沒有難做的生意,那麼面向物件的思想,就是讓我們能夠做到,天下沒有難寫的程式。
2,面向物件的三大特徵1,封裝性
2,繼承性
3,多型性
類和物件
1,什麼是類?
類,對某一類事物的抽象描述(抽象化),用於描述一組物件的共同特徵和行為,例如,貓和狗,統稱為動物。 人民幣和美元,統稱為貨幣。
2,什麼是物件?(面向物件的核心,畢竟是面向物件嘛!)
物件,對於某類事物的具象描述(例項化),例如,人民幣是貨幣的一種,貓是動物的一種。
3,類和物件之間的關係?
如上所述,類是對具有相同特徵的物件的描述,而物件是對類的一種具體化的解釋。
通俗點講,包含與被包含的關係,Java是一種程式語言,程式語言中有Java這個分支。4,類的組成
類由成員變數和成員方法組成,其中成員變數(屬性)可以理解為對物件特徵的描述,成員方法(方法)可以理解為對物件行為的描述。
例如:人都有國家(屬性),人都會花錢(行為),一個名詞,一個動詞。
public class Person {
String nationality;
void spendMoney() {
System.out.println("大家好,我今天花了" + nationality + "的錢");
}
}
5,物件的建立與使用
類名 物件名稱 = new 類名();
eg:Person p1 = new Person();
其中:“new Person()” 用於建立Person的一個例項,p1相當於Person的一個引用,儲存的是一個地址,指向記憶體的堆區中的Person例項。
通過物件的引用來訪問物件的所由成員的格式:物件引用.物件成員
需要注意的是,成員變數(屬性)如果不手動賦值的話,系統會預設為其賦值,根據其不同的型別,需要注意的是char型別的預設賦值為一個空字元,"\u0000"。
public class ObjectDemo {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.nationality = "中國";
System.out.println(p1.nationality);
p1.spendMoney();
p2.spendMoney();
}
}
結果:
中國
大家好,我今天花了中國的錢
大家好,我今天花了null的錢
6,類的封裝
類的封裝就是在定義一個類的時候,將類中的屬性私有化,不讓外部隨意對其進行操作,外界需要對私有化物件操作的時候,需要呼叫類中有關私有屬性的方法。通俗點講,世界上有那麼多國家,在中國(這個類中),只能消費人民幣(私有化),美元在這不流通,那美國人在中國消費是不是需要把美刀兌換成人民幣呢(外部操作)?所以中國提供了貨幣兌換(中國這個類提供的方法)。
//舉個例子
class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age <= 0 || age > 150) {
System.out.println("你輸入的年齡有問題,能不能長點心?");
} else {
this.age = age;
}
}
}
public class Demo1 {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
s1.setName("張三");
s1.setAge(20);
System.out.println("姓名:" + s1.getName() + ",年齡:" + s1.getAge());
s2.setName("李四");
s2.setAge(-10);
System.out.println("姓名:" + s2.getName() + ",年齡:" + s2.getAge());
}
}
7,通過上邊的例子可以知道,我們在建立物件的時候,是需要new一下的,通過new呼叫類中的構造方法,那麼什麼是構造方法呢?
1,構造方法的定義
類中的一個特殊成員,在類例項化的時候自動被呼叫。
構造方法需要滿足的條件:方法名和類名相同,無返回值型別,不能使用return返回值。
2,為何上邊那麼例子沒有構造方法,卻可以建立物件呢?
因為Java中,如果沒有顯示建立構造方法的話,那麼系統會自動提供一個無參構造方法。但是如果顯示建立之後,Java將不再提供。
簡單點說,就是,你在中國出生,如果你爸媽不給你修改國籍的話,你就是一箇中國人了,但是你爸媽主動給你修改了國籍,那麼中國憑什麼還要再給你提供中國國籍?一個道理。
3,既然是方法,那麼就會有方法的過載,構造方法也一樣,一個類中允許有多個構造,正如一個地球上,有多個國籍,可以選擇。
4,構造方法不要使用private()修飾,修飾了之後,將無法通過該構造方法例項化物件。
class Student {
int age;
String name;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Demo1 {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student("張三", 20);
System.out.println(s1.name + ":" + s1.age);
System.out.println(s2.name + ":" + s2.age);
}
}