面向對象
面向過程與面向對象的區別
面向過程:側重點流程,從頭到尾一氣呵成,牽一髮而動全身,重構複雜。流水線式。
面向對象:模塊化(類),抽離重複的部分。模塊組合完成業務。上帝視角。
類和對象的區別
類:類是具有相同屬性和方法的一組對象的集合,它爲屬於該類的所有對象提供了統一的抽象描述,其內部包括屬性和方法兩個主要部分。打個比方person類
public class Person {
//屬性
private String xxx;
private int xx;
//方法 (構造器)
public Person(String xxx, int xx) {
this.xxx = xx;
this.xx = xx;
}
......
}
對象:根據圖紙構建出來的具體的事物。以person類實例化一個對象爲例
Person person1 = new Person("dll",22);
person1
這個對象就是以類Person
爲模板 加上具體的信息 所實例化的一個對象
類如何構建
類實現包括兩個部分:類聲明
和類體
。
類聲明
[public][abstract|final] class className [extends superclassName] [implements interfaceNameList]{……}
其中,修飾符public
,abstract
,final
說明了類的屬性,className
爲類名,superclassName
爲類的父類的名字,interfaceNameLis
t爲類所實現的接口列表。
類體
類體可以分爲屬性與方法
屬性
private String name;//姓名
private int age; //年齡
方法
public void move() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在行動!");
}
public void study() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在學習!");
}
public void eat() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在喫飯!");
}
綜合代碼
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void move() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在行動!");
}
public void study() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在學習!");
}
public void eat() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在喫飯!");
}
}
屬性和行爲的權限問題
訪問修飾符
public
:公共的,公開的
private
:私有的,只能自己訪問
//屬性設爲私有的 private
private String name;
private int age;
// 把方法設置爲公開
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void move() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在行動!");
}
public void study() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在學習!");
}
public void eat() {
System.out.println(this.getName() + "年齡:" + this.getAge() + "正在喫飯!");
}
權限擴展:
private
:類中限定爲private的成員,只能被這個類本身訪問。如果一個類的構造方法聲明爲private,則其它類不能生成該類的一個實例。
default
:類中不加任何訪問權限限定的成員屬於缺省的(default)訪問狀態,可以被這個類本身和同一個包中的類所訪問。
protected
:類中限定爲protected的成員,可以被這個類本身、它的子類(包括同一個包中以及不同包中的子類)和同一個包中的所有其他的類訪問。
public
:類中限定爲public的成員,可以被所有的類訪問。
this關鍵字
因爲程序的就近原則,我們有時編寫的代碼如果遵循了見名知意的約定就容易出現以下比較尷尬的情況,自己賦值給自己:
private String name;
private int age; // 0
public void setAge(int age) { //setAge(22)
age = age; // 22
}
上面代碼setAge(22)
運行,其實就只有一個age變量,我們類中的age並沒有被賦值。
正確的寫法,this關鍵字
爲了避免這種情況的發生,Java語言提供了 this
關鍵字來區分類的變量(成員變量)和傳入參數變量(局部變量)的區別。
this
表示當前正在運行的對象。
private String name;
private int age; // 22
public void setAge(int age) { //setAge(22)
this.age = age; // this.age = 22 age = 22
}
構造器
- 根據類創建了對象以後,會默認有一個無參的構造器
- 如果自定義了構造器,則無參構造器會失效,按需改寫
- 構造器可以重載
// 無參構造器
權限修飾符 類名() {
}
// 有參構造器
權限修飾符 類名(參數1, 參數2) {
}
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
Person person1 = new Person("dll",22);
打印所有屬性 toString()
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
static
static:修飾成員變量和成員方法。
特點:被所有對象所共享(所有對象都可以調用該static變量/方法);
可以使用類名調用與賦值(對於變量),可以直接使用類名調用(當然也可以採用對象調用);
靜態的加載優先於對象(可以再對象加載之前加載);
隨着類的加載而加載。
靜態代碼塊:
隨着類(當然,創建對象時會加載類)的加載而加載,只加載一次;用於加載類時做的初始化,
- 特點:當第一次用到本類時,靜態代碼塊執行唯一的一次
- 靜態內容總是優先於非靜態,靜態代碼塊比構造方法先執行。
- 用來一次性的對靜態成員變量進行賦值
public class StaticField {
public static void main(String[] args) {
Person one = new Person();
Person two = new Person();
}
}
public class Person {
static {
System.out.println("靜態代碼塊執行...");
}
public Person() {
System.out.println("構造方法執行");
}
}
先執行。
- 用來一次性的對靜態成員變量進行賦值
public class StaticField {
public static void main(String[] args) {
Person one = new Person();
Person two = new Person();
}
}
public class Person {
static {
System.out.println("靜態代碼塊執行...");
}
public Person() {
System.out.println("構造方法執行");
}
}