面向對象基礎
基本知識
開發方法
結構化開發 (面向過程)
面向對象開發
案例
面向過程的做飯
買菜 - 洗菜- 切菜- 炒菜- 吃菜- 刷鍋洗碗
面向對象的做飯
訂外賣
面向對象概念 :
直觀而且程序結構簡單的程序設計方法, 比較複合人類認識現實世界的思維方式
基本思想是 : 把問題看成是由若干個對象組成, 這些對象之間是相互獨立的,但又可以相互配合.連接和協調, 從而共同完成整個程序要實現的任務和功能
使用字符串 打印數組的每一個元素
int [] arr = {1,2,3,4,5};
// 使用打印語句 把arr 用字符串的方式 打印出來
String s = "[";
for(int i = 0 ; i < arr.length ; i++){
s += arr[i];
if(i == arr.length-1){
break;
}
s += ", ";
}
s += "]";
System.out.println(s);
// 以上是 面向過程的方式
// 以下 是面向對象的方式
System.out.println(Arrays.toString(arr));
類與對象
對象
萬物皆對象
你身邊的 電腦 水杯 桌子 椅子 文具
屬性: 一個對象 有什麼
方法: 一個對象 能做什麼
類
分類是人認識世界的一個很自然的過程 (把對象抽取成爲類的過程)
張三 , 李四 是具體的對象 ==> 人類
筆 , 本子 ==> 文具類
對象是用來描述客觀事物的一個實體
類: 具有相同屬性和方法的一組對象的集合, 類是對象的抽象, 對象是類的具體
類和對象的關係
- 類是抽象的概念, 僅僅是模板
- 對象是一個實實在在的具體實體
- 類和對象的關係就如同是模具和用這個模具製作出的物品之間的關係,一個類給出他的全部對象的統一定義, 而他的每個對象則是符合這種定義的一個實體因此,類與對象的關係就是抽象和具體的關係
類包含的內容
屬性: 對象所擁有的特徵在類中的表示 (有什麼)
方法: 對象執行操作的行爲 (能做什麼)
將現實生活中的類型 使用計算機模擬
現實生活中 人
Person 類名 | |
---|---|
name :String age : int birthday : String |
|
void eat(); void play(); |
定義類的格式
class 類名{
類型 屬性名;
方法(){};
}
創建對象的格式
類名 對象名 = new 類名();
Person per1 = new Person();
Person per2 = new Person();
int a = 10;
int b = 20;
對象調用屬性和方法
對象名.屬性名
對象名.方法名();
案例
定義學員類 和 教員類
方法的定義
四種不同類型
無參無返回值
玩
public void play(){}
無參有反
借書
public String 借書(){
return 書籍;
}
有參無反
// 還書 void 表示 沒有返回值
public void 還書(把要換的書帶上){
還書的具體步驟
不需要 ruturn ;
}
有參有反
public 返回值類型 方法名(參數列表){
return 該方法的返回值;
}
public String buy(帶着錢去商店){
return "中華煙";
}
// 使用計算器
public int 加法(需要參與運算的兩個值){
return 把兩個數的計算結果;
}
方法間允許相互調用
public void play(){
System.out.println("玩");
}
public void study(){
System.out.println("學習");
}
public void sleep(){
System.out.println("休息");
}
// 學生自定義一個計劃
public void plan(){
play();
study();
sleep();
}
案例
景區門票根據不同年齡收取不同價格
// < 8歲 免費
8 - 18 半價
> 18 全價 20元
根據用戶名和密碼登錄案例
在學生數組中查找指定名稱的學生
public class School {
String [] stus = {"張三","李四","王五","趙六"};
// 查找一名學生是否存在的方法 (需要得到是否存在的結果)
// 該方法需要先獲取一個學生姓名, 才能執行 查找的方法
public boolean searchStu(String name){
// 假設 沒有該學生
boolean flag = false;
// 依次遍歷數組 查找是否有指定學生名存在
for(int i = 0 ; i < stus.length ; i++){
if(name.equals(stus[i])){
// 一旦發現有名稱一樣的學生
flag = true;
}
}
return flag;
}
}
添加一名學生到數組中
/**
* 添加一名學生
* 如果學生存在 不添加
* 如果學生不存在 添加
*/
public boolean addStu(String name){
// 添加學生 需要使用到 查找學生的方法
boolean flag = searchStu(name);
// 需要根據查詢的結果, 決定是否添加該學生到學校中
if(flag){
// 學生存在 , 不予入校
return false;
}
// 學校中添加學生 , 數組擴容
stus = Arrays.copyOf(stus,stus.length + 1);
stus[stus.length-1] = name;
// 遍歷新數組
for(int i = 0 ; i < stus.length; i++){
System.out.println(stus[i]);
}
// 學生添加成功, 返回真
return true;
}
方法重載
方法名相同 , 參數列表不同, 與返回值類型,訪問修飾符無關
計算器案例
// 計算器類
public class Computer {
// 兩個數加法
public void add(int a, int b){
System.out.println("和爲"+(a+b));
}
// 三個數的加法
public void add(int a,int b,int c){
System.out.println("和爲"+(a+b+c));
}
}
基本類型和引用類型傳參
案例
public class Student {
String name;
int age;
}
// 傳參爲 整數類型
public void change1(int num){
num=num + 1;
}
// 傳參爲 對象類型
public void change2(Student student){
student.age = student.age + 1;
}
// 測試方法
//測試類
Test test=new Test();
int n=8;
test.change1(n);
Student stu=new Student();
stu.age=18;
test.change2(stu);
System.out.println(n+"---"+stu.age);
參數傳遞
基本數據類型 值傳遞 不會改變原來的值
引用數據類型 地址傳遞 會改變對象空間中的值
基本數據類型,操作傳遞的是變量的值,改變一個變量的值不會影響另一個變量的值。引用數據類型(類、數組和接口),賦值是把原對象的引用(可理解爲內存地址)傳遞給另一個引用
案例 冒泡排序
// 書寫一個方法, 功能 可以把一個數組 按照從小到大的順序排列
public class ArrDemo {
public static void main(String[] args) {
int [] arr = {5,9,7,3,4,6,8,1,4,9,7,6,2,1,4};
ArrDemo ad = new ArrDemo();
System.out.println(Arrays.toString(arr));
ad.sort(arr);
System.out.println(Arrays.toString(arr));
}
//
public void sort(int [] arr){
// 比較的輪數
for( int i = 1 ; i< arr.length ; i++){
// 每一輪比較的次數
for(int k = 0 ; k < arr.length - i; k++){
if(arr[k] > arr[k+1]){
int m = arr[k];
arr[k] = arr[k+1];
arr[k+1] = m;
}
}
}
}
}
局部變量和成員變量
成員變量 定義在 類的內部 方法外部
局部變量 定義在方法內部的變量
臨時變量 for循環中的 int a
區別
- 作用域不同
只能在各自的定義範圍內 生效
- 初始化
成員變量 系統自動初始化
局部變量 必須手動初始化之後才能使用
- 同一作用域範圍內中不允許有同名的變量
- 不同的作用域範圍內允許重名, 就近原則
// 想要在方法內部使用外部 變量 需要添加this 做區分
public class Student { // 總公司
// 學生的名字
String name = "張三";
public void study(){ // 分公司
// 老師的名字
String name = "孔子";
System.out.println(this.name + "正在"+name+"學習");
}
}
this 關鍵字
指代對象本身 = 調用者
class Student{
String name;
public void study(){
System.out.println(this.name+ "正在挑燈夜戰!");
}
}
public class Demo {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "張三";
stu.study();
Student stu2 = new Student();
stu2.name = "李四";
stu2.study();
}
}
構造方法
在創建對象過程中執行的方法就是構造方法, 他的作用就是給對象的屬性進行初始化
構造方法 格式
public (沒有返回值) 類名(可以傳遞參數){ 給對象的屬性賦值 }
所有的構造方法, 方法名都是類名, 只有參數列表不同
構造方法典型的方法重載
通過 反編譯工具 XJad 軟件
// 如果程序員不寫任何構造方法 java 會自動創建一個無參構造
public Student(){}
// 如果程序員寫了一個有參構造方法 java 不會創建默認構造
給屬性賦值的方式
通過對象點屬性
// 創建學生對象
Student stu = new Student();
stu.name="張三";
stu.age=20;
stu.sex="男";
stu.birthday="2000-07-05";
通過自定義方法來賦值
public void set( String name1,int age1,String sex1,String birthday1){
name = name1;
age = age1;
sex = sex1;
birthday = birthday1;
}
Student stu = new Student();
stu.set();
通過構造方法賦值
// 有參構造
public Student(String name1,int age1,String sex1,String birthday1){
name = name1;
age = age1;
sex = sex1;
birthday = birthday1;
}
Student stu = new Student("張三",20,"男","2000-07-05");
通過之前學習的this 關鍵字優化
public class Student {
String name;
int age;
String sex;
String birthday;
// 參數列表 類似於局部變量
public Student(String name,int age,String sex,String birthday){
// 把參數列表中的值 賦值給 Student 的屬性
this.name = name;
this.age = age;
this.sex = sex;
this.birthday = birthday;
}
}
方法重載
因爲 程序員寫了一個有參構造方法 java 不會創建默認構造 , 需要在創建有參構造方法, 手動創建無參構造
要求: 要麼一個也不寫, 要麼一次寫兩個
public Student(){}
public Student(String name){
this.name = name;
}
問題總結
- 基本數據類型和引用數據類型在參數傳遞時的區別是什麼?
- 成員變量和局部變量有何區別?
- 方法重載有何特點?
- 構造方法有何作用?如何定義?