編程的本質(zhì)是邏輯,編程思維的培養(yǎng)很重要。首先我們要理解面向過(guò)程和面向?qū)ο笥惺裁磪^(qū)別:
面向過(guò)程:
面向過(guò)程是一種以“事件”為中心的編程思想,把解決問(wèn)題的過(guò)程拆成一個(gè)個(gè)方法彩匕,通過(guò)一個(gè)個(gè)方法的執(zhí)行解決問(wèn)題。需要實(shí)現(xiàn)一個(gè)功能的時(shí)候媒区,看重的是開(kāi)發(fā)的步驟和過(guò)程驼仪,
面向?qū)ο螅?/strong>
面向?qū)ο笫且环N以“對(duì)象”為中心的編程思想掸犬,把要解決的問(wèn)題分解成各個(gè)對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟绪爸,而是為了描敘某個(gè)對(duì)象在整個(gè)解決問(wèn)題的步驟中的屬性和行為湾碎。
當(dāng)需要實(shí)現(xiàn)一個(gè)功能的時(shí)候,看重的并不是過(guò)程和步驟奠货,而是關(guān)心的是對(duì)象介褥,對(duì)象能做什么。
面向?qū)ο蠛兔嫦蜻^(guò)程最本質(zhì)的區(qū)別在于考慮問(wèn)題的出發(fā)點(diǎn)不同递惋,面向過(guò)程是以事件流程為考慮問(wèn)題的出發(fā)點(diǎn)柔滔,而面向?qū)ο髣t是以對(duì)象為考慮問(wèn)題的出發(fā)點(diǎn)。
面向?qū)ο蟪绦蛟O(shè)計(jì)中代碼間的相關(guān)性低(低耦合特性)萍虽,使得代碼很容易被復(fù)用和擴(kuò)展睛廊,面向?qū)ο箝_(kāi)發(fā)的程序一般更易維護(hù)、易復(fù)用贩挣、易擴(kuò)展。面向過(guò)程的代碼重用性低没酣、擴(kuò)展能力差王财。
現(xiàn)在主流的思想是面向?qū)ο螅鴮?shí)際的情況是軟件設(shè)計(jì)的宏觀層面是面向?qū)ο蟮脑1悖⒂^層面依然是面向過(guò)程的(方法內(nèi)部的代碼還是按照步驟編寫(xiě)的)绒净。
※面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming,OPP):
面向?qū)ο笕筇匦裕?br> 1.封裝 偿衰、 2.繼承 挂疆、 3.多態(tài)
1.對(duì)象
1.1.什么是對(duì)象
萬(wàn)事萬(wàn)物皆對(duì)象,對(duì)象強(qiáng)調(diào)的是一個(gè)具體的個(gè)體下翎,例如:楊樹(shù)就不是對(duì)象缤言,我家門(mén)前第一顆楊樹(shù)就是對(duì)象。
1.2.對(duì)象由什么構(gòu)成
對(duì)象由狀態(tài)和行為構(gòu)成视事。
對(duì)象的狀態(tài)是指對(duì)象的數(shù)據(jù)胆萧,對(duì)象的狀態(tài)由變量表示,也叫對(duì)象的屬性俐东。
對(duì)象的行為是指對(duì)象的功能跌穗,對(duì)象的行為由方法表示。
1.3.對(duì)象是怎么創(chuàng)建的
對(duì)象是由類(lèi)實(shí)例化時(shí)創(chuàng)建的虏辫,因此創(chuàng)建對(duì)象必須先定義類(lèi)蚌吸。
2.類(lèi)
2.1.什么是類(lèi)
類(lèi)是具有相同的狀態(tài)和相同的行為的一組對(duì)象的集合。
2.2.類(lèi)的構(gòu)成
類(lèi)是由屬性和方法構(gòu)成的砌庄。
※類(lèi)和對(duì)象是什么關(guān)系
類(lèi)和對(duì)象的關(guān)系就如同模具和用這個(gè)模具制作出來(lái)的物品之間的關(guān)系羹唠。
一個(gè)類(lèi)給出它的全部對(duì)象的一個(gè)統(tǒng)一的定義奕枢,而它的每個(gè)對(duì)象則是符合這種定義的一個(gè)實(shí)體(也稱(chēng)作實(shí)例),因此類(lèi)和對(duì)象的關(guān)系就是抽象和具體的關(guān)系肉迫。
類(lèi)是對(duì)象的模板验辞,對(duì)象是類(lèi)的的具體實(shí)例。類(lèi)中定義了什么屬性和方法喊衫,由這個(gè)類(lèi)實(shí)例化的對(duì)象就有什么屬性和方法跌造。
類(lèi)是一次性定義,對(duì)象可以多次創(chuàng)建族购。
- 類(lèi)是對(duì)某一類(lèi)事物的抽象描述壳贪,不是具體的個(gè)體。
- 對(duì)象是對(duì)某一事物的具體描述寝杖,是具體的個(gè)违施。
3.定義類(lèi)
3.1.定義類(lèi)的語(yǔ)法格式
public class 類(lèi)名 {
成員變量聲明;//即屬性
成員方法聲明;//即行為
}
具體:
public class 類(lèi)名 {
//可編寫(xiě)0至n個(gè)屬性
數(shù)據(jù)類(lèi)型 變量名1;
數(shù)據(jù)類(lèi)型 變量名2瑟幕;
//可編寫(xiě)0至n個(gè)方法
修飾符 返回值類(lèi)型 方法名(參數(shù)){
執(zhí)行語(yǔ)句;
}
}
注意:
● class是聲明類(lèi)的關(guān)鍵字
● public類(lèi)的類(lèi)名必須和類(lèi)所在文件的文件名一致
●如果不是public類(lèi)磕蒲,那么類(lèi)名與類(lèi)所在的文件名可以不一致
●類(lèi)名的命名規(guī)范是:帕斯卡命名法,因此類(lèi)名首字母大寫(xiě)只盹。
示例:
public class Student {
//類(lèi)的屬性(類(lèi)的狀態(tài))
String name;
int score;
String no;
//類(lèi)的方法(類(lèi)的行為)
public void play(){
System.out.printf("我的名字是%s,我的成績(jī)是%d,我的學(xué)號(hào)是%s",name,score,no);
}
}
4.實(shí)例化對(duì)象
通過(guò)類(lèi)創(chuàng)建對(duì)象的過(guò)程稱(chēng)為類(lèi)的實(shí)例化辣往。實(shí)例化的結(jié)果是產(chǎn)生了一個(gè)實(shí)例,實(shí)例也叫對(duì)象殖卑。
4.1.創(chuàng)建對(duì)象(實(shí)例化對(duì)象)
一個(gè)對(duì)象稱(chēng)為類(lèi)的一個(gè)實(shí)例站削,是類(lèi)一次實(shí)例化的結(jié)果。
創(chuàng)建對(duì)象的語(yǔ)法格式:
類(lèi)名 對(duì)象名 = new 類(lèi)名();
示例:
Student s1 =new Student();
Student s2 =new Student();
1.new是關(guān)鍵詞孵稽,稱(chēng)為實(shí)例化许起,同時(shí)也是分配內(nèi)存的意思。
2.左邊的類(lèi)名為對(duì)象的數(shù)據(jù)類(lèi)型菩鲜。
3.右邊的類(lèi)名()稱(chēng)為類(lèi)的構(gòu)造方法园细。
一個(gè)對(duì)象由兩部分構(gòu)成,一個(gè)是對(duì)象的指針(也稱(chēng)對(duì)象的引用)接校,二是對(duì)象的實(shí)例珊肃。
內(nèi)存分配演示:
4.2.使用對(duì)象
對(duì)象調(diào)用屬性和方法是使用成員運(yùn)算符"."來(lái)完成的。
使用對(duì)象的語(yǔ)法格式:
對(duì)象名.屬性 //引用對(duì)象的屬性
對(duì)象名.方法名 //引用對(duì)象的方法
4.2.1.對(duì)象調(diào)用屬性
public class Student {
String name;
int score;
String no;
public static void main(String[] args) {
Practice s1 = new Practice();
s1.name = "haha";
s1.score = 78;
Practice s2 = new Practice();
s2.name = "yaya";
s2.score = 98;
}
}
4.2.2.對(duì)象調(diào)用方法
public class Student {
String name;
int score;
String no;
public void play(){
System.out.printf("我的名字是%s,我的成績(jī)是%d,我的學(xué)號(hào)是%s",name,score,no);
}
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "haha";
s1.score = 78;
s1.play();
Student s2 = new Student();
s2.name = "yaya";
s2.score = 98;
s2.play();
}
運(yùn)行結(jié)果:
我的名字是haha,我的成績(jī)是78,我的學(xué)號(hào)是null
我的名字是yaya,我的成績(jī)是98,我的學(xué)號(hào)是null
4.2.3.對(duì)象數(shù)組
示例:
需求:
1.班級(jí)里有5名學(xué)生馅笙,輸入每名學(xué)生的姓名和總成績(jī)伦乔。
2.根據(jù)學(xué)生總成績(jī)從高到低排名,顯示學(xué)生名次董习、姓名烈和、總成績(jī)。
分析:
1.有哪些對(duì)象皿淋?有學(xué)生對(duì)象招刹,有班級(jí)對(duì)象
2.對(duì)象有什么屬性和方法恬试?
①.學(xué)生有姓名,成績(jī)的屬性疯暑,學(xué)生不需要方法
②.班級(jí)有多名學(xué)生的屬性训柴,班級(jí)有排序方法,輸出的方法
代碼:
1:創(chuàng)建學(xué)生類(lèi)
public class Student {
//屬性
String name;
int score;
//構(gòu)造
public Student(String name, int score) {
this.name = name;
this.score = score;
}
}
2.創(chuàng)建班級(jí)類(lèi)
public class ClassInfo {
//屬性
Student []stus = null;
//構(gòu)造函數(shù)初始化班級(jí)大小
public ClassInfo(int size){
this.stus = new Student[size];
}
//排序方法
public void sort(){
if(this.stus.length==0){
return;
}
for (int i = 0; i < this.stus.length-1; i++) {
for (int j = 0; j < this.stus.length - i - 1; j++) {
if(this.stus[j].score<this.stus[j+1].score){
Student temp = this.stus[j];
this.stus[j] = this.stus[j+1];
this.stus[j+1] = temp;
}
}
}
}
//輸出方法
public void print(){
for (int i = 0; i < stus.length; i++) {
System.out.printf("姓名:%s,成績(jī)%d妇拯,名次:%d",stus[i].name,stus[i].score,(i+1));
System.out.println();
}
}
}
3.創(chuàng)建測(cè)試類(lèi)
public class Test {
public static void main(String[] args) {
//1:創(chuàng)建5個(gè)學(xué)生
Student s1 = new Student("學(xué)生1",60);
Student s2 = new Student("學(xué)生2",80);
Student s3 = new Student("學(xué)生3",90);
Student s4 = new Student("學(xué)生4",65);
Student s5 = new Student("學(xué)生5",70);
//2:創(chuàng)建班級(jí)
ClassInfo classInfo = new ClassInfo(5);
classInfo.stus[0] = s1;
classInfo.stus[1] = s2;
classInfo.stus[2] = s3;
classInfo.stus[3] = s4;
classInfo.stus[4] = s5;
//3:排序
classInfo.sort();
//4:輸出
classInfo.print();
}
}
運(yùn)行結(jié)果:
姓名:學(xué)生3,成績(jī)90幻馁,名次:1
姓名:學(xué)生2,成績(jī)80,名次:2
姓名:學(xué)生5,成績(jī)70越锈,名次:3
姓名:學(xué)生4,成績(jī)65仗嗦,名次:4
姓名:學(xué)生1,成績(jī)60,名次:5