Java面向?qū)ο箢?lèi)和對(duì)象實(shí)例詳解
1 - Java面向?qū)ο髮W(xué)習(xí)的三條主線(xiàn)
①Java類(lèi)即類(lèi)的成員:屬性 方法 構(gòu)造器 (代碼塊 內(nèi)部類(lèi))
②面向?qū)ο蟮娜筇卣鳎悍庋b性 繼承性 多態(tài)性 (抽象性)
③其他關(guān)鍵字:this supper static final abstract interface 等
2 - 面向過(guò)程與面向?qū)ο?/h2>
二者都是一種思想,面向?qū)ο笫窍鄬?duì)于面向過(guò)程而言的
1-面向過(guò)程:強(qiáng)調(diào)的是功能行為,以函數(shù)為最小單位,考慮怎么做
2-面向?qū)ο螅簩⒐δ芊庋b進(jìn)對(duì)象,強(qiáng)調(diào)具備了功能的對(duì)象,以類(lèi)/對(duì)象為最小單位,考慮誰(shuí)來(lái)做
面向?qū)ο蟾訌?qiáng)調(diào)運(yùn)用人類(lèi)在日常的思維邏輯中采用的思想方法與原則,如抽象,分類(lèi),繼承,聚合,多態(tài)等
/*
人把大象裝進(jìn)冰箱
面向過(guò)程:強(qiáng)調(diào)的是功能行為,以函數(shù)為最小單位,考慮怎么做
①將冰箱門(mén)打開(kāi)
②抬起大象,裝進(jìn)冰箱
③關(guān)閉冰箱門(mén)
面向?qū)ο螅簩⒐δ芊庋b進(jìn)對(duì)象,強(qiáng)調(diào)具備了功能的對(duì)象,以類(lèi)/對(duì)象為最小單位,考慮誰(shuí)來(lái)做
人{(lán)
打開(kāi)(冰箱){
冰箱.開(kāi)開(kāi)門(mén)();
}
抬起(大象){
大象.進(jìn)入(冰箱);
}
關(guān)閉(冰箱){
冰箱.閉合();
}
}
冰箱{
開(kāi)開(kāi)門(mén)(){}
閉合(){}
}
大象{
進(jìn)入(冰箱){}
}
*/
3 - 面向?qū)ο蟮娜筇卣?/h2>
封裝(Encapsulation)
繼承(Inheritance)
多態(tài)(Polymorphism)
4 - 面向?qū)ο蠓治龇椒ǚ治鰡?wèn)題的思路和步驟
/*
* 程序員從面向過(guò)程的執(zhí)行者轉(zhuǎn)化成了面向?qū)ο蟮闹笓]著
* 面向?qū)ο蠓治龇椒ǚ治鰡?wèn)題的思路和步驟:
* 1-根據(jù)問(wèn)題 需要,選擇問(wèn)題所針對(duì)的現(xiàn)實(shí)世界中的實(shí)體
* 2-從實(shí)體中尋找解決問(wèn)題相關(guān)的屬性和功能,這些屬性和功能就形成了概念世界中的類(lèi)
* 3-把抽象的實(shí)體用計(jì)算機(jī)語(yǔ)言進(jìn)行描述,形成計(jì)算機(jī)世界中類(lèi)的定義,即借助某種程序語(yǔ)言,把類(lèi)構(gòu)造成計(jì)算機(jī)能夠識(shí)別和處理的 數(shù)據(jù)結(jié)構(gòu)
*
* 4-將類(lèi)實(shí)例化成計(jì)算機(jī)世界中的對(duì)象,對(duì)象是計(jì)算機(jī)世界中解決問(wèn)題的最終工具
*/
5 - 面向?qū)ο蟮乃枷敫攀?/h2>
1-類(lèi)(Class)和對(duì)象(Object)是面向?qū)ο蟮暮诵母拍睿?/p>
?、兕?lèi)是對(duì)一類(lèi)事物的描述,是抽象的,概念上的定義
?、趯?duì)象是實(shí)際存在的該類(lèi)事物的每個(gè)個(gè)體,因而也稱(chēng)其為實(shí)例(instance)
?、跩ava世界里,"萬(wàn)物皆對(duì)象"
2-代碼示例
/* 設(shè)計(jì)類(lèi) -> 其實(shí)就是設(shè)計(jì)類(lèi)的成員 屬性 = 成員變量 = field = 域、字段 方法 = 成員方法 = 函數(shù) = method 創(chuàng)建類(lèi)的對(duì)象 = 類(lèi)的實(shí)例化 = 實(shí)例化類(lèi) 類(lèi)和對(duì)象的使用(面向?qū)ο蟮乃枷雽?shí)現(xiàn)) 1-創(chuàng)建類(lèi),設(shè)計(jì)類(lèi)的成員 2-創(chuàng)建類(lèi)的對(duì)象 3-調(diào)用對(duì)象的屬性或方法(對(duì)象.屬性 對(duì)象.方法) 如果創(chuàng)建了一個(gè)類(lèi)的多個(gè)對(duì)象,則每個(gè)對(duì)象都獨(dú)立的擁有一套類(lèi)的屬性。(非 static 的) 意味著,我們修改一個(gè)對(duì)象的屬性a,則不影響另一個(gè)對(duì)象的屬性a。 */ // 測(cè)試類(lèi) public class PersonTest { public static void main(String[] args){ // 創(chuàng)建Person類(lèi)的對(duì)象 Person p1 = new Person(); // Scanner scanner = new Scanner(System.in); // 調(diào)用對(duì)象屬性:對(duì)象.屬性 System.out.println(p1.age); // 22 p1.name = "howie"; p1.isMale = true; // 調(diào)用對(duì)象方法:對(duì)象.方法 p1.eat(); p1.sleep(); p1.talk("chinese"); // ******************* Person p2 = new Person(); System.out.println(p2.name); // null 說(shuō)明類(lèi)的初始化默認(rèn)值為 null Person p3 = p1; // 將p1變量保存的對(duì)象空間地址值賦值給p3,導(dǎo)致p1和p3都指向了堆空間的同一個(gè)對(duì)象實(shí)體 System.out.println(p3.name); // howie } } // 創(chuàng)建類(lèi),設(shè)計(jì)類(lèi)的成員 class Person{ // 屬性 String name; int age = 22; boolean isMale; // 方法 public void eat(){ System.out.println("人正在吃飯!"); } public void sleep(){ System.out.println("人可以睡覺(jué)!"); } public void talk(String language){ System.out.println("人可以說(shuō)話(huà),使用的是"+language); } }
6 - 類(lèi)和對(duì)象的創(chuàng)建-內(nèi)存解析
1-內(nèi)存解析
2-對(duì)象內(nèi)存解析
7 - 類(lèi)中屬性的聲明和使用(局部變量與成員變量的區(qū)別)
1-屬性(成員變量)vs 局部變量
* 1-相同點(diǎn)
* ?、俣x變量的格式:數(shù)據(jù)類(lèi)型 變量名 = 變量值
* ?、谙嚷暶?,后使用
* ?、圩兞慷加衅鋵?duì)應(yīng)的作用域
* 2-不同點(diǎn)
* ?、僭陬?lèi)中聲明的位置不同
* 屬性:直接定義在類(lèi)的一對(duì){}內(nèi)
* 局部變量:聲明在方法內(nèi),方法形參,代碼塊,構(gòu)造器形參,構(gòu)造器內(nèi)部的變量
* ?、陉P(guān)于權(quán)限修飾符的不同
* 屬性:可以在聲明屬性時(shí),指定其權(quán)限,使用權(quán)限修飾符。常用的權(quán)限修飾符:private , public , 缺省 , protected
* 目前,大家聲明屬性時(shí),都使用缺省就可以(什么都不加)
* 局部變量:不可以使用權(quán)限修飾符
* ?、勰J(rèn)初始化的值
* 屬性:類(lèi)的屬性,根據(jù)其類(lèi)型,都有默認(rèn)初始值。
* 整型(byte、short、int、long):0
* 浮點(diǎn)型(float、double):0.0
* 字符型(char):0(或'\u00000')
* 布爾(boolean):false
*
* 引用數(shù)據(jù)類(lèi)型(類(lèi)、數(shù)組、接口):null
* 局部變量:沒(méi)有默認(rèn)初始化值,意味著我們?cè)谡{(diào)用局部變量之前,一定要顯示賦值,特別的,形參調(diào)用時(shí)賦值即可。
* ?、茉趦?nèi)存中加載的位置
* 屬性:堆空間(非static)
* 局部變量:棧
public class test1 { public static void main(String[] args) { User u1 = new User(); System.out.println(u1.name); System.out.println(u1.age); System.out.println(u1.isMale); // 調(diào)用形參 u1.talk("English"); } } class User{ // 屬性(或成員變量) String name; int age; boolean isMale; public void talk(String language) {// 形參,也是局部變量 System.out.println("我們使用"+language+"交流"); } public void eat() { String foot = "米線(xiàn)"; // 在方法中定義的局部變量 System.out.println("云南人喜歡吃:"+foot); } }
⑤內(nèi)存解析需要注意兩點(diǎn)
1-內(nèi)存結(jié)構(gòu):棧(局部變量)、堆[new 出來(lái)的結(jié)構(gòu):對(duì)象(非 static成員變量)、數(shù)組]
2-變量:成員變量 vs 局部變量(方法內(nèi)、方法形參、構(gòu)造器內(nèi)、構(gòu)造器形參、代碼塊內(nèi))
8 - 類(lèi)中方法的聲明和使用
類(lèi)中方法的申明和使用
方法:描述類(lèi)應(yīng)該具備的功能
比如 Math類(lèi):aqrt()\random()...
Scanner類(lèi):nexInt() ...
Arrays類(lèi):sort() \ binarySearch() \ toString() \ equals() \ ...
1-舉例
public void eat() {} public void sleep(int hour) {} public String getName() {} public String getNation(String nation) {}
2-方法的聲明
權(quán)限修飾符 返回值類(lèi)型 方法名(形參列表) {
方法體
}
注意:static final abstract 來(lái)修飾的方法,后面在介紹
3-說(shuō)明
①權(quán)限修飾符:Java規(guī)定的4種權(quán)限修飾符:private(私有的) , public , 缺省 , protected
默認(rèn)方法的權(quán)限修飾符先都使用public
?、诜祷仡?lèi)型:有返回值 vs 沒(méi)有返回值
1-如果方法有返回值,則必須在方法聲明時(shí),指定返回值的類(lèi)型。同時(shí),方法中,需要使用時(shí)return關(guān)鍵字來(lái)返回指定類(lèi)型的變量或常量
2-如果方法沒(méi)有返回值,則方法聲明時(shí),使用 void來(lái)表示。通常沒(méi)有返回值的方法中,就不需要使用return關(guān)鍵字了
?、鄯椒簩儆跇?biāo)識(shí)符,遵循標(biāo)識(shí)符的規(guī)則和規(guī)范,見(jiàn)名知意
?、苄螀⒘斜恚悍椒梢月暶?個(gè),1個(gè),或多個(gè)形參...格式:數(shù)據(jù)類(lèi)型1 形參1,數(shù)據(jù)類(lèi)型2 形參2,...
?、莘椒w:方法功能的體現(xiàn)
4-return關(guān)鍵字的使用
?、偈褂梅秶菏褂迷诜椒w中
②作用:1.結(jié)束方法2.針對(duì)于有返回值類(lèi)型的方法,使用 'return 數(shù)據(jù)'方法返回所要的數(shù)據(jù)。
?、圩⒁恻c(diǎn):return關(guān)鍵字后面不可以聲明執(zhí)行語(yǔ)句
5-方法的使用:可以調(diào)用當(dāng)前類(lèi)的屬性或方法
特殊的:方法A中調(diào)用方法A稱(chēng)作 遞歸方法
方法中不可以再定義方法
public class CustomerTest { public static void main(String[] args) { // TODO Auto-generated method stub } } // 客戶(hù)類(lèi) class Customer{ // 屬性 String name; int age; boolean isMale; // 方法 public void eat() { System.out.println("客戶(hù)吃飯"); } public void sleep(int hour) { System.out.println("客戶(hù)休息了"+hour+"個(gè)小時(shí)"); } public String getName() { return name; } public String getNation(String nation) { String info = "我的國(guó)籍是"+nation; return info; } }
練習(xí)題
/* * 1-編寫(xiě)程序,聲明一個(gè)method方法,在方法中打印一個(gè)10*8的*型矩形,在main方法中調(diào)用該方法。 * 2-修改上一個(gè)程序,在method方法中,除打印一個(gè)10*8的*矩形外形,再計(jì)算該矩形的面積,并將其作為方法返回值。 * 在main方法中調(diào)用該方法接受返回的面積值打印。 * * 3-修改上一個(gè)程序,在method方法提供m和n兩個(gè)參數(shù),方法中打印一個(gè)m*n的*型矩形 */ public class Exer3Test { public static void main(String[] args) { Exer3Test test = new Exer3Test(); // 第1題的測(cè)試 // test.method(); // 第2題的測(cè)試 // double s = test.method(); // System.out.println("面積為"+s); // 第3題的測(cè)試 System.out.println(test.method(12,10)); } // 第1問(wèn) // public void method(){ // for(int i = 0;i < 10;i++){ // for(int j = 0;j < 8;j++){ // System.out.print("* "); // } // System.out.println(); // } // } // 第2問(wèn) // public double method(){ // for(int i = 0;i < 10;i++){ // for(int j = 0;j < 8;j++){ // System.out.print("* "); // } // System.out.println(); // } // return 10*8; // 第3問(wèn) public int method(int n,int m){ for(int i = 0;i < n;i++){ for(int j = 0;j < m;j++){ System.out.print("* "); } System.out.println(); } return n * m; } }
9 - 對(duì)象數(shù)組的使用
/* * 對(duì)象數(shù)組題目 * 定義類(lèi)Student,包含三個(gè)屬性:學(xué)號(hào)number(int),年級(jí)state(int),成績(jī)score(int)。創(chuàng)建20個(gè)學(xué)生對(duì)象,學(xué)號(hào)1到20 * 年級(jí)[1-6]和成績(jī)[0-100]都由隨機(jī)數(shù)確定。 * 問(wèn)題1:打印出3年級(jí)(state值為3)的學(xué)生信息 * 問(wèn)題2:使用冒泡排序按學(xué)生成績(jī)排序,并遍歷所有學(xué)生信息 * * 提示: * ①生成隨機(jī)數(shù):Math.random(),返回值類(lèi)型double * ②四舍五入:Math.round(double d),返回值類(lèi)型long. */ public class StudentTest { public static void main(String[] args){ // 聲明Student對(duì)象數(shù)組 Student[] students = new Student[20]; for(int i = 0;i < students.length;i++){ // 給數(shù)組元素賦值 students[i] = new Student(); // 給Student對(duì)象的屬性賦值 students[i].number = i + 1; double value = Math.random(); students[i].state = (int)(value * (6 - 1 + 1) + 1); double v = Math.random(); students[i].score = (int)(v * (100 + 1) + 0); // System.out.print(students[i].score+"\t"); } // 遍歷學(xué)生數(shù)組 for(int i = 0;i < students.length;i++){ // System.out.println(students[i].number+","+students[i].state+","+students[i].score); // System.out.println(students[i].showInfo()); // 問(wèn)題1:打印出3年級(jí)(state值為3)的學(xué)生信息 if(students[i].state == 3){ // System.out.println(students[i].showInfo()); } } // 問(wèn)題2:使用 [冒泡排序] 按學(xué)生成績(jī)排序,并遍歷所有學(xué)生信息 for(int i = 0;i < students.length - 1;i++){ for(int j = 0;j < students.length - 1 - i;j++){ if(students[j].score > students[j+1].score){ Student temp = students[j]; students[j] = students[j+1]; students[j+1] = temp; } } } // 遍歷 排好序的 學(xué)生信息 從最高分打印 for(int i = 0;i < students.length;i++){ System.out.println(students[students.length - i-1].showInfo()); } } } class Student{ int number; // 學(xué)號(hào) int state; // 年級(jí) int score; // 成績(jī) public String showInfo(){ return "學(xué)號(hào):"+number+" "+"年級(jí):"+state+" "+"成績(jī):"+score; } } 對(duì)象數(shù)組使用示例
數(shù)組對(duì)象內(nèi)存解析
10 - 理解 "萬(wàn)物皆對(duì)象"
/*
* 1-在Java語(yǔ)言范疇中,我們都將功能,結(jié)構(gòu)等封裝到類(lèi)中,通過(guò)類(lèi)的實(shí)例化,來(lái)調(diào)用具體的功能結(jié)構(gòu)
* >Scanner,String
* >文件:File
* >網(wǎng)絡(luò)資源:URL
* 2-涉及到Java語(yǔ)言與前端HTML、后端的數(shù)據(jù)庫(kù)交互時(shí)、前后端的結(jié)構(gòu)在Java層面交互時(shí),都體現(xiàn)為類(lèi)、對(duì)象
*/
11 - 匿名對(duì)象
/* * 匿名對(duì)象的使用 * 1-理解:我們創(chuàng)建的對(duì)象,沒(méi)有顯示的賦給一個(gè)變量名,即為匿名對(duì)象 * 2-特征:匿名對(duì)象只能調(diào)用一次 * 3-開(kāi)發(fā)中使用:以下代碼示例 */ public class PhoneTest { public static void main(String[] args) { // TODO Auto-generated method stub Phone p = new Phone(); // p = null; System.out.println(p); p.sendEmail(); p.playGame(); // 匿名對(duì)象 // new Phone().sendEmail(); // new Phone().playGame(); new Phone().price = 199; new Phone().showPrice(); // 0.0 PhoneMall mall = new PhoneMall(); // mall.show(p); // 匿名對(duì)象的使用 mall.show(new Phone()); } } class PhoneMall{ public void show(Phone phone) { phone.sendEmail(); phone.playGame(); } } class Phone{ double price; // 價(jià)格 public void sendEmail() { System.out.println("發(fā)送郵件"); } public void playGame() { System.out.println("打游戲"); } public void showPrice() { System.out.println("手機(jī)價(jià)格為"+price); } } 匿名對(duì)象的使用
12 - 方法的封裝(數(shù)組常用算法的封裝)
注意兩個(gè)Java文件在同級(jí)目錄
①在ArrayUtils.java 文件中 創(chuàng)建類(lèi)并分裝方法
public class ArrayUtils { // 求數(shù)組最大值 public int getMax(int[] array){ int max = array[0]; for(int i = 1;i < array.length;i++){ if(array[i] > max){ max = array[i]; } } return max; } // 求數(shù)組最小值 public int getMin(int[] array){ int min = array[0]; for(int i = 1;i < array.length;i++){ if(min > array[i]){ min = array[i]; } } return min; } // 求數(shù)組總和 public int getSum(int[] array){ int sum = 0; for(int i = 0;i < array.length;i++){ sum += array[i]; } return sum; } // 求數(shù)組平均值 public double getAvg(int[] array){ return getSum(array) / array.length; } // 反轉(zhuǎn)數(shù)組 public void reverseArray(int[] array){ for(int i = 0;i < array.length / 2;i++){ int temp = array[i]; array[i] = array[array.length - i - 1]; array[array.length - i - 1] = temp; } } // 復(fù)制數(shù)組 public int[] copyArray(int[] array){ int[] newArray = new int[array.length]; for(int i = 0;i < array.length;i++){ newArray[i] = array[i]; } return newArray; } // 數(shù)組排序 public void sortArray(int[] array){ /** * 默認(rèn)從小到大排 */ for(int i = 0;i < array.length - 1;i++){ for(int j = 0;j < array.length - i -1;j++){ if(array[j] > array[j+1]){ int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } } // 遍歷數(shù)組 public void print(int[] array){ for(int i = 0;i < array.length;i++){ System.out.print(array[i]+"\t"); } } // 查找數(shù)組指定的元素 public int getIndex(int[] array,int dest){ int head = 0; int end = array.length - 1; // 初始的末索引 boolean isFlag = false; int middle = 0; sortArray(array); while(head <= end){ middle = (head + end) / 2; if(dest == array[middle]){ isFlag = true; break; }else if(dest > array[middle]){ head = middle + 1; }else{ end = middle - 1; } } if(isFlag){ return middle; }else{ return -1; } } } ArrayUtils.java
②在ArrayUtilsTest.java 文件中測(cè)試封裝好的方法
public class ArrayUtilsTest { public static void main(String[] args){ ArrayUtils array = new ArrayUtils(); int[] arr = new int[]{1,5,7,9,845,21,30,12,222,56,-30}; // 獲取數(shù)組最大值 System.out.println(array.getMax(arr)); // 獲取數(shù)組最小值 System.out.println(array.getMin(arr)); // 數(shù)組反轉(zhuǎn) array.reverseArray(arr); for(int i = 0;i < arr.length;i++){ System.out.print(arr[i]+"\t"); } System.out.println(); // 數(shù)組復(fù)制 int[] arr2 = new int[]{1,2,3}; int[] newArray = array.copyArray(arr2); for(int i = 0;i < newArray.length;i++){ System.out.print(newArray[i]+"\t"); } System.out.println(); // 查找元素 int i = array.getIndex(arr2,4); System.out.println(i); // -1 表示沒(méi)有找到此元素 // 數(shù)組排序 int[] array3 = new int[]{1,5,8,77,98,33,0,2}; ArrayUtils a = new ArrayUtils(); System.out.print("排序前:"); a.print(array3); System.out.println(); System.out.print("排序后:"); a.sortArray(array3); a.print(array3); } } ArrayUtilsTest.java
總結(jié)
到此這篇關(guān)于Java面向?qū)ο箢?lèi)和對(duì)象的文章就介紹到這了,更多相關(guān)Java面向?qū)ο箢?lèi)和對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java動(dòng)態(tài)方法調(diào)度實(shí)例分析
這篇文章主要介紹了java動(dòng)態(tài)方法調(diào)度,結(jié)合實(shí)例形式對(duì)比分析了java的動(dòng)態(tài)方法調(diào)度原理、使用方法與注意事項(xiàng),需要的朋友可以參考下2016-06-06Java實(shí)現(xiàn)的圖片上傳工具類(lèi)完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的圖片上傳工具類(lèi),涉及java針對(duì)圖片文件的檢查、上傳、清除等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10從零開(kāi)始Mybatis連接數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Mybatis連接數(shù)據(jù)庫(kù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02Spring 處理 HTTP 請(qǐng)求參數(shù)注解的操作方法
這篇文章主要介紹了Spring 處理 HTTP 請(qǐng)求參數(shù)注解的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友參考下吧2024-04-04如何使用 IntelliJ IDEA 編寫(xiě) Spark 應(yīng)用程序(Sc
本教程展示了如何在IntelliJIDEA中使用Maven編寫(xiě)和運(yùn)行一個(gè)簡(jiǎn)單的Spark應(yīng)用程序(例如WordCount程序),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11使用純java config來(lái)配置spring mvc方式
這篇文章主要介紹了使用純java config來(lái)配置spring mvc方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java 教你如何給你的頭像添加一個(gè)好看的國(guó)旗
這篇文章主要介紹了java 教你如何給你的頭像添加一個(gè)好看的國(guó)旗,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09