面向對象編程1(類)
緒論:面向對象與面向過程
- 面向對象(OOP)與面向過程(POP)
- 二者都是一種思想,面向對象是相對於面向過程而言的。
- 面向過程,強調的是功能行爲。
- 面向對象,將功能封裝進對象,強調具備了功能的對象。
- 面向對象更加強調運用人類在日常的思維邏輯中採用的思想方法與原則,如抽象、分類、繼承、聚合、多態等。
- 面向對象的三大特徵
封裝 (Encapsulation)
繼承 (Inheritance)
多態 (Polymorphism)
ps:
OOP: Object Oriented Programming
面向過程:procedure oriented programming
一、類的語法格式
- 修飾符 class 類名
{
屬性聲明;
方法聲明;
}
說明:
①修飾符public:類可以被任意訪問
②類的正文要用{ }括起來
- 步驟:
- 定義類(考慮修飾符、類名)
- 編寫類的屬性(考慮修飾符、屬性類型、屬性名、初始化值)
- 編寫類的方法(考慮修飾符、返回值類型、方法名、形參等)
③類的成員變量可以先聲明不用初始化,有默認值
舉例1:
/**
* 人
* @author 才子先生
*
*/
public class Person
{
// 屬性,成員變量
String name;//類的成員變量可以先聲明不用初始化,因爲有默認值String——null
int age;//默認值爲0
// 行爲,方法 函數
/**
* 打印姓名
*/
public void showName()//方法的命名使用駝峯命名法
{
System.out.println("姓名:"+name);
}
/**
* 返回一個年齡
* @return
*/
public int getAge()//如果有返回值的方法那麼方法體有return返回定義的類型
{
return age;
}
}
舉例2:
public class Animal
{
String name;
int eye;//方法局部變量(方法內的)
int legs;
public void eat(String food)//方法的參數,即形參。可並列多個形參,以逗號分隔
{
System.out.println("此物種的食物是:"+food);
}
public void move(String moveType)
{
System.out.println("此動物的移動方式爲:"+moveType);
}
}
二、類的實例化(即創建類的對象)
對象的創建和使用
- 使用new +構造器創建一個新的對象;
- 使用“對象名.對象成員”的方式訪問對象成員(包括屬性和方法);
(下面舉兩個例子,分別對應上面的的兩個類)
舉例1:
public class test2
{
public static void main(String[] args)
{
//實例化person類(創建person對象)
Person person=new Person();
//前半句聲明一個Person類的對象,名稱是person;new Person()實例化person類;整句實例化Person類,並且給person賦值爲當前的實例
person.name="張三";//給person對象的屬性賦值
person.showName();//對象方法的調用。
int i=person.getAge();//有返回值的方法再返回後有一個值,這個值就是方法中return返回的值
System.out.println(i);
person.age=155;//給person對象的age屬性賦值
int a=person.getAge();//有返回值的方法再返回後有一個值,這個值就是方法中return返回的值
System.out.println(a);
}
}
結果:姓名:張三
0//未給age賦值所以默認爲0
155
舉例2:
public class test1
{
public static void main(String[] args)
{
//實例化一個Animal的對象
//創建對象和使用對象
Animal ani=new Animal();
ani.eat("炸雞塊");
ani.move("八條腿飛");
}
}
結果:此物種的食物是:炸雞塊
此動物的移動方式爲:八條腿飛
三、類的成員之一:屬性
- 語法格式:
修飾符 類型 屬性名 =初值 ; - 說明:
- 修飾符private:該屬性只能由該類的方法訪問。
- 修飾符public:該屬性可以被該類以外的方法訪問。
- 類型:任何基本類型,如int、boolean或任何類。
舉例:
public class Person{
private int age; //聲明private變量 age
public String name = “Lila”; //聲明public變量 name
}
補:變量的分類:成員變量與局部變量
- 成員變量:在方法體外,類體內聲明的變量
- 局部變量:在方法體內部聲明的變量稱爲局部變量。
見一中的例子
具體分類見:http://naotu.baidu.com/file/8c9d75765a7a98da6b3c01e30a11046d?token=24f3e7debb73eedd百度腦圖
注意:
- 1.類變量是靜態的不需要實例化成對象就可以使用可以通過:類名.屬性 使用
- 2.實例變量得new一個對象才能使用。
- {int a=1;}爲代碼塊局部變量
辨析:成員變量(屬性)與局部變量的區別
成員變量:
- 成員變量定義在類中,在整個類中都可以被訪問。
- 成員變量分爲類成員變量和實例成員變量,實例變量存在於對象所在的堆內存中。(即實例變量只能在類實例化後的對象中使用)
- 成員變量有默認初始化值。
- 成員變量的權限修飾符可以根據需要,選擇任意一個
局部變量:
- 局部變量只定義在局部範圍內,如:方法內,代碼塊內等。(即局部變量只能在他所屬的方法範圍內可以使用)
- 局部變量存在於棧內存中。
- 作用的範圍結束,變量空間會自動釋放。
- 局部變量沒有默認初始化值,每次必須顯式初始化。
- 局部變量聲明時不指定權限修飾符。(public等)
四、類的成員之二:方 法
- 什麼是方法(函數)?
方法是類或對象行爲特徵的抽象,也稱爲函數。
ps:Java裏的方法不能獨立存在,所有的方法必須定義在類裏。
語法格式1(無形參):
修飾符 返回值類型 方法名 ( 參數列表)
{
方法體語句;
}
- 說明:
- 修飾符:public, private, protected等。
- 返回值類型:return語句傳遞返回值。沒有返回值:void。
舉例:
public class Person
{
private int age;
public int getAge()
{
return age;
} //聲明方法getAge
public void setAge(int i) //形參i
{ //聲明方法setAge
age = i; //將參數i的值賦給類的成員變量age
}
}
語法格式2(有形參):
修飾符 返回值類型 方法名(參數類型 形參1,參數類型 形參2,….)
{
** 程序代碼**
** return 返回值;**
}
其中:
- 形式參數:在方法被調用時用於接收外部傳入的數據的變量。
- 參數類型:就是該形式參數的數據類型。
- 返回值:方法在執行完畢後返還給調用它的程序的數據。
- 返回值類型:方法要返回的結果的數據類型。
- 實參:調用方法時實際傳給函數形式參數的數據。
具體實例見animal例。
ps:方法內可以調用方法卻不能定義方法
同一個類中所有方法可以直接相互調用,不用new一個對象
五、對象的創建和使用
普通對象
如果創建了一個類的多個對象,對於類中定義的屬性,每個對象都擁有各自的一套副本,且互不干擾。
下面是一個學生和老師信息輸出的例子:
public class Teacher
{
public String name;
public String major;
public String cause;
public int teachingtime;
public void showInfo()
{
System.out.println("姓名:"+name);
System.out.println("專業:"+major);
System.out.println("教授的課程:"+cause);
System.out.println("教齡:"+teachingtime);
}
}
public class Student
{
public String name;
public String interest;
public String cause;
public int age;
public void showInfo()
{
System.out.println("姓名:"+name);
System.out.println("興趣:"+interest);
System.out.println("學習的課程:"+cause);
System.out.println("年齡:"+age);
}
}
public class Testinfo
{
public static void main(String[] args)
{
//教師實例化
Teacher tea=new Teacher();
tea.name="王鐵柱";
tea.major="大熊貓的產後護理";
tea.cause="大熊貓的繁殖保護";
tea.teachingtime=20;
tea.showInfo();
//學生實例化
Student stu=new Student();
stu.age=20;
stu.cause="大熊貓的繁殖保護";
stu.interest="擼貓";
stu.name="李二蛋";
stu.showInfo();
}
}
輸出結果:
姓名:王鐵柱
專業:大熊貓的產後護理
教授的課程:大熊貓的繁殖保護
教齡:20
姓名:李二蛋
興趣:擼貓
學習的課程:大熊貓的繁殖保護
年齡:20
匿名對象
-
我們也可以不定義對象的句柄,而直接調用這個對象的方法。這樣的對象叫做匿名對象。
如:new Person().shout(); 不給賦予某個變量 -
使用情況
1.如果對一個對象只需要進行一次方法調用,那麼就可以使用匿名對象。
2.我們經常將匿名對象作爲實參傳遞給一個方法調用。 (即將這個對象當成參數傳到方法中)
計算圓的面積
public class Area
{
// public double radius;
// public static void main(String[] args)
// {
// Area a=new Area();
// a.radius=15;
// double s=3.14*a.radius*a.radius;
// System.out.println("圓的面積爲:"+s);
// }
public double area(double r)
{
return 3.14*r*r;
}
public static void main(String[] args)
{
double s=new Area().area(15);
System.out.println("圓的面積爲:"+s);
}
}
圓的面積爲:706.5
註釋部分是自己寫的,另一種辦法是老師給的例子。
類的訪問機制:
-
在一個類中的訪問機制:類中的方法可以直接訪問類中的成員變量。(例外:static方法訪問非static的成員變量[l例如:static int a],編譯不通過。)
-
在不同類中的訪問機制:先創建要訪問類的對象,再用對象訪問類中定義的成員。
面向對象思想“落地”法則(一)
1.關注於類的設計,即設計類的成員:屬性 、方法
2.類的實例化,即創建類的對象(比如:Person p = new Person())
3.通過“對象.屬性” 、 “對象.方法” 執行
六、方法的重載(overload)
重載的概念
在同一個類中,允許存在一個以上的同名方法,只要它們的參數個數或者參數類型不同即可。(與參數的名稱無關.參數順序不同也可以構成重載)
重載的特點:
與返回值類型無關,只看參數列表,且參數列表必須不同。(參數個數或參數類型)。調用時,根據方法參數列表的不同來區別。
重載示例:
//返回兩個整數的和
int add(int x,int y){return x+y;}
//返回三個整數的和
int add(int x,int y,int z){return x+y+z;}
//返回兩個小數的和
double add(double x,double y){return x+y;}
練習
判 斷:
與void show(int a,char b,double c){}構成重載的有:
a) void show(int x,char y,double z){} //no
b) int show(int a,double c,char b){} //yes順序不同也是重載
c) void show(int a,double c,char b){} //yes順序不同也是重載
d) boolean show(int c,char b){} //yes
e) void show(double c){} //yes
f) double show(int x,char y,double z){} //no
g) void shows(){double c} //no