一、面向?qū)ο蟾攀?/h5>
- 面向?qū)ο笏枷?/li>
- 面向過程思想與面向?qū)ο笏枷?br>
A:什么是面向過程
面向過程,其實(shí)就是面向著具體的每一個(gè)步驟和過程,把每一個(gè)步驟和過程完成,然后由這些功能方法相互調(diào)用,完成需求。
例如:吃煎餅果子利用面向過程的思想:
1.學(xué)習(xí)攤煎餅的技術(shù)
2.買材料雞蛋,油,蔥等等
3.開始攤
4.吃
5.收拾
B:什么是面向?qū)ο?br>
面向?qū)ο笏枷刖褪遣粩嗟膭?chuàng)建對(duì)象,使用對(duì)象,指揮對(duì)象做事情。(如果有對(duì)象,直接用對(duì)象,對(duì)我們直接提供服務(wù))
例如:吃煎餅果子利用面向?qū)ο蟮乃枷?/li>
- 找會(huì)攤煎餅的大媽(創(chuàng)建一個(gè)攤煎餅大媽的對(duì)象)
- 調(diào)用其攤煎餅的技能(功能),傳遞進(jìn)去錢參數(shù)
- 返回給我們一個(gè)煎餅
- 吃
- 面向過程特點(diǎn)與面向?qū)ο筇攸c(diǎn)
A:面向過程:
強(qiáng)調(diào)的是過程,所有事情都需要自己完成
B:面向?qū)ο?
是一種更符合我們思想習(xí)慣的思想(懶人思想,我把事情自己不做,交給別人去做)
可以將復(fù)雜的事情簡(jiǎn)單化(對(duì)使用者來說簡(jiǎn)單了,對(duì)象里面還是很復(fù)雜的)
將我們從執(zhí)行者變成了指揮者角色發(fā)生了轉(zhuǎn)換
- 案例代碼一:
package com.neuedu.demo;
/*
* 面向?qū)ο笏枷耄?* 面向?qū)ο笫腔诿嫦蜻^程的編程思想。
*
* 面向過程:強(qiáng)調(diào)的是每一個(gè)功能的步驟
* 面向?qū)ο螅簭?qiáng)調(diào)的是對(duì)象,然后由對(duì)象去調(diào)用功能
*
* 面向?qū)ο蟮乃枷胩攸c(diǎn):
* A:是一種更符合我們思考習(xí)慣的思想
* B:可以將復(fù)雜的事情簡(jiǎn)單化
* C:將我們從執(zhí)行者變成了指揮者
*
* 舉例:
* 買電腦:
* 面向過程:我要買電腦--我要明確買電腦的意義--上網(wǎng)查對(duì)>應(yīng)的參數(shù)信息--去三好街買電腦--討價(jià)還價(jià)--買回電腦
* 面向?qū)ο螅何乙I電腦--班長(zhǎng)去給我買電腦--買回電腦
* 洗衣服:
* 面向過程:把衣服脫下來--找一個(gè)盆--放點(diǎn)洗衣粉--加點(diǎn)水--浸泡10分鐘--揉一揉--清洗衣服--擰干--晾起來
* 面向?qū)ο螅喊岩路撓聛?-打開全自動(dòng)洗衣機(jī)--扔衣服--按鈕--晾起來
*/
public class Demo {
}
- 類與對(duì)象及其使用:
- 類與對(duì)象概述:
A:我們學(xué)習(xí)編程是為了什么
為了把我們?nèi)粘I钪袑?shí)物用學(xué)習(xí)語言描述出來
B:我們?nèi)绾蚊枋霈F(xiàn)實(shí)世界事物
屬性 就是該事物的描述信息(事物身上的名詞)
行為 就是該事物能夠做什么(事物身上的動(dòng)詞)
C:Java中最基本的單位是類,Java中用class描述事物也是如此
成員變量 就是事物的屬性
成員方法 就是事物的行為
D:定義類其實(shí)就是定義類的成員(成員變量和成員方法)
a:成員變量 和以前定義變量是一樣的,只不過位置發(fā)生了改變。在類中,方法外。
b:成員方法 和以前定義方法是一樣的,只不過把static去掉,后面在詳細(xì)講解static的作用。
E:類和對(duì)象的概念
a:類:是一組相關(guān)的屬性和行為的集合(我們班所有的同學(xué)都具備相同的屬性和行為,比如:姓名,年齡,學(xué)習(xí),這樣就把所有的學(xué)生成為學(xué)生類)
b:對(duì)象:是該類事物的具體體現(xiàn)(說某個(gè)同學(xué)時(shí),他都具備自己特有的屬性和行為)
c:舉例:
類 學(xué)生
對(duì)象 具體的某個(gè)學(xué)生就是一個(gè)對(duì)象
比如:車是一個(gè)類,具體的開的奔馳、寶馬,就是對(duì)象
- 案例代碼二:
package com.neuedu.demo;
/*
* 我們學(xué)習(xí)編程語言,其實(shí)就是為了把現(xiàn)實(shí)世界的事物模擬出來,實(shí)現(xiàn)信息化。
*
* 我們是如何表示現(xiàn)實(shí)世界的事物的呢?
* A:屬性 就是事物的描述信息
* B:行為 就是事物能夠做什么
* 舉例:學(xué)生
*
* Java語言最基本的單位是類,所以,我們?cè)诤竺娴膶W(xué)習(xí)過程中,是通過類來體現(xiàn)現(xiàn)實(shí)世界事物的。
*
* 類:是一組相關(guān)的屬性和行為的集合
* 對(duì)象:就是該事物的具體體現(xiàn)
* 舉例:
* 類 學(xué)生
* 對(duì)象 班長(zhǎng)
*/
public class Demo2 {
}
- 類與對(duì)象案例:
- 學(xué)生類案例
- 案例代碼三:
package com.neuedu.demo;
/*
* 類的定義:
* 類是用來描述現(xiàn)實(shí)世界的事物的
*
* 事物:
* 屬性 事物的描述信息
* 行為 事物能夠做什么
*
* 類是如何和事物進(jìn)行對(duì)應(yīng)的呢?
* 類:
* 成員變量
* 成員方法
*
* 需求:寫一個(gè)學(xué)生類
*
* 學(xué)生事物:
* 屬性:姓名,年齡...
* 行為:學(xué)習(xí),吃飯...
*
* 學(xué)生類:
* 成員變量:姓名,年齡
* 成員方法:學(xué)習(xí),吃飯
*
* 成員變量:和我們前面學(xué)習(xí)過的變量的定義是一樣的。
* 位置不同:類中,方法外
* 初始化值:不需要給初始化值
* 成員方法:和我們前面學(xué)習(xí)過的方法的定義是一樣的。
* 去掉static關(guān)鍵字
*/
public class Student {
//成員變量
//姓名
String name;
//年齡
int age;
//成員方法
//學(xué)習(xí)的方法
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
//吃飯的方法
public void eat() {
System.out.println("學(xué)習(xí)餓了要吃飯");
}
}
package com.neuedu.demo;
/*
* Student是一個(gè)學(xué)生事物描述類,main方法不適合放在它里面。
*
* 使用一個(gè)類,其實(shí)就是使用該類的成員。(成員變量和成員方法)
* 而我們要想使用一個(gè)類的成員,就必須首先擁有該類的對(duì)象。
* 我們?nèi)绾螕碛幸粋€(gè)類的對(duì)象呢?
* 創(chuàng)建對(duì)象就可以了?
* 我們?nèi)绾蝿?chuàng)建對(duì)象呢?
* 格式:類名 對(duì)象名 = new 類名();
* 對(duì)象如何訪問成員呢?
* 成員變量:對(duì)象名.變量名
* 成員方法:對(duì)象名.方法名(...)
*/
public class StudentDemo {
public static void main(String[] args) {
//格式:類名 對(duì)象名 = new 類名();
Student s = new Student();
//System.out.println("s:"+s); >//com.neuedu.demo.Student@193c0cf
//直接輸出成員變量值
System.out.println("姓名:"+s.name); //null
System.out.println("年齡:"+s.age); //0
System.out.println("----------");
//給成員變量賦值
s.name = "趙四";
s.age = 28;
//再次輸出成員變量的值
System.out.println("姓名:"+s.name); //趙四
System.out.println("年齡:"+s.age); //28
System.out.println("----------");
//調(diào)用成員方法
s.study();
s.eat();
}
}
- 手機(jī)類案例
- 案例代碼四:
package com.neuedu.demo;
/*
* 手機(jī)類:
* 成員變量:品牌,價(jià)格,顏色...
* 成員方法:打電話,發(fā)短信...
*/
public class Phone {
//品牌
String brand;
//價(jià)格
int price;
//顏色
String color;
//打電話
public void call(String name) {
System.out.println("給"+name+"打電話");
}
//發(fā)短信
public void sendMessage() {
System.out.println("群發(fā)短信");
}
}
package com.neuedu.demo;
/*
* 手機(jī)類的測(cè)試類
*/
public class PhoneDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Phone p = new Phone();
//輸出成員變量值
System.out.println("品牌:"+p.brand);//null
System.out.println("價(jià)格:"+p.price);//0
System.out.println("顏色:"+p.color);//null
System.out.println("------------");
//給成員變量賦值
p.brand = "錘子";
p.price = 2999;
p.color = "棕色";
//再次輸出成員變量值
System.out.println("品牌:"+p.brand);//錘子
System.out.println("價(jià)格:"+p.price);//2999
System.out.println("顏色:"+p.color);//棕色
System.out.println("------------");
//調(diào)用成員方法
p.call("趙四");
p.sendMessage();
}
}
- 對(duì)象的內(nèi)存圖
-
一個(gè)對(duì)象的內(nèi)存圖:
一個(gè)對(duì)象的內(nèi)存圖.png
-
方法公用內(nèi)存圖:
方法公用內(nèi)存圖.png
- 案例代碼五:
package com.neuedu.demo;
/*
* 手機(jī)類的測(cè)試類
*/
public class PhoneDemo2 {
public static void main(String[] args) {
Phone p = new Phone();
p.brand = "小米5s";
p.price = 1999;
p.color = "銀色";
System.out.println(p.brand+"---"+p.price+"---"+p.color);
p.call("林青霞");
p.sendMessage();
Phone p2 = new Phone();
p2.brand = "IPhone7S";
p2.price = 7999;
p2.color = "土豪金";
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
p2.call("張曼玉");
p2.sendMessage();
}
}
-
兩個(gè)引用指向同一個(gè)對(duì)象內(nèi)存圖:
兩個(gè)引用指向同一個(gè)對(duì)象內(nèi)存圖.png
- 案例代碼六:
package com.neuedu.demo;
/*
* 手機(jī)類的測(cè)試類
*/
public class PhoneDemo3 {
public static void main(String[] args) {
Phone p = new Phone();
p.brand = "OPPO";
p.price = 2999;
p.color = "白色";
System.out.println(p.brand+"---"+p.price+"---"+p.color);
Phone p2 = p;
p2.brand = "魅族";
p2.price = 1999;
p2.color = "藍(lán)色";
System.out.println(p.brand+"---"+p.price+"---"+p.color);
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
}
}
- 成員變量和局部變量區(qū)別:
- 案例代碼七:
package com.neuedu.demo;
/*
* 成員變量和局部變量的區(qū)別:
* A:在類中的位置不同
* 成員變量:類中,方法外
* 局部變量:方法中或者方法聲明上(形式參數(shù))
* B:在內(nèi)存中的位置不同
* 成員變量:堆內(nèi)存
* 局部變量:棧內(nèi)存
* C:生命周期不同
* 成員變量:隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失
* 局部變量:隨著方法的調(diào)用而存在,隨著方法的調(diào)用完畢而消失
* D:初始化值的問題
* 成員變量:有默認(rèn)值
* 局部變量:沒有默認(rèn)值。必須先定義,賦值,最后使用
*/
public class Variable {
int x;
public void show() {
int y = 0;
System.out.println(x);
System.out.println(y);
}
}
二、面向?qū)ο筇匦灾庋b
- 封裝與私有關(guān)鍵字
- private關(guān)鍵字
A:private關(guān)鍵字:
a:是一個(gè)權(quán)限修飾符。
b:可以修飾成員(成員變量和成員方法)
c:被private修飾的成員只在本類中才能訪問。
- 案例代碼八:
package com.neuedu.demo;
/*
* 學(xué)生類
*
* 通過對(duì)象直接訪問成員變量,會(huì)存在數(shù)據(jù)安全問題
* 這個(gè)時(shí)候,我們就想能不能不讓外界的對(duì)象直接訪問成員變量呢?
* 能。
* 如何實(shí)現(xiàn)呢?
* private關(guān)鍵字
*
* private:
* 是一個(gè)修飾符
* 可以修飾成員變量,也可以修飾成員方法
* 被private修飾的成員只能在本類中被訪問
*
* 針對(duì)private修飾的成員變量,我們會(huì)相應(yīng)的提供getXxx()和setXxx()用于獲取和設(shè)置成員變量的值,方法用public修飾
*/
public class Student {
String name;
//int age;
private int age;
public void setAge(int a) {
if(a<0 || a>200) {
System.out.println("你給的年齡有誤");
}else {
age = a;
}
}
public int getAge() {
return age;
}
public void show() {
System.out.println("姓名是:"+name+",年齡是:"+age);
}
}
package com.neuedu.demo;
/*
* 學(xué)生類的測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建學(xué)生對(duì)象
Student s = new Student();
s.show();
s.name = "哈哈";
//s.age = 28;
//s.age = -28;
//s.setAge(-28);
s.setAge(28);
s.show();
}
}
- private最常見應(yīng)用
A:把成員變量用private修飾
B:提供對(duì)應(yīng)的getXxx()/setXxx()方法
- 案例代碼九:
package com.neuedu.demo;
/*
* 學(xué)生類
*/
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
package com.neuedu.demo;
/*
* 學(xué)生類的測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Student s = new Student();
System.out.println(s.getName()+"---"+s.getAge());
s.setName("嘿嘿");
s.setAge(28);
System.out.println(s.getName()+"---"+s.getAge());
}
}
- 封裝的概述和好處:
A:封裝概述
是面向?qū)ο笕筇卣髦?br>
是面向?qū)ο缶幊陶Z言對(duì)客觀世界的模擬,客觀世界里成員變量都是隱藏在對(duì)象內(nèi)部的,外界無法直接操作和修改。就像剛才說的年齡。
B:封裝原則:
將不需要對(duì)外提供的內(nèi)容都隱藏起來。
把屬性隱藏,提供公共方法對(duì)其訪問。
成員變量private,提供對(duì)應(yīng)的getXxx()/setXxx()方法
C:好處:
通過方法來控制成員變量的操作,提高了代碼的安全性
把代碼用方法進(jìn)行封裝,提高了代碼的復(fù)用性
- this關(guān)鍵字
- this關(guān)鍵字由來和使用:
A:this:代表所在類的對(duì)象引用
方法被哪個(gè)對(duì)象調(diào)用,this就代表那個(gè)對(duì)象
B:什么時(shí)候使用this呢
局部變量和成員變量重名
- 案例代碼十:
package com.neuedu.demo;
/*
* 學(xué)生類
*
* 起名字我們要求做到見名知意。
* 而我們現(xiàn)在的代碼中的n和a就沒有做到見名知意,所以我要改進(jìn)。
*
* 如果有局部變量名和成員變量名相同,在局部使用的時(shí)候,采用的是就近的原則。
*
* 我們有沒有辦法把局部變量的name賦值給成員變量的name呢?
* 有。
*
* 什么辦法呢?
* 用this關(guān)鍵字就可以解決這個(gè)問題
*
* this:代表所在類的對(duì)象引用
* 方法被哪個(gè)對(duì)象調(diào)用,this就代表那個(gè)對(duì)象
*
* 使用場(chǎng)景:
* 局部變量隱藏成員變量
*/
public class Student {
private String name;
private int age;
public void setName(String name) { //"林青霞"
//name = name;
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//age = age;
this.age = age;
}
public int getAge() {
return age;
}
}
package com.neuedu.demo;
/*
* 學(xué)生類的測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Student s = new Student();
System.out.println(s.getName()+"---"+s.getAge());
s.setName("嘻嘻");
s.setAge(28);
System.out.println(s.getName()+"---"+s.getAge());
}
}
三、面向?qū)ο笾畼?gòu)造方法
- 構(gòu)造方法:
主要用來給對(duì)象的數(shù)據(jù)進(jìn)行初始化
- 構(gòu)造方法格式:
A:構(gòu)造方法格式
a:方法名與類名相同
b:沒有返回值類型,連void都沒有
c:沒有具體的返回值
- 案例代碼十一:
package com.neuedu.demo;
/*
* 構(gòu)造方法:
* 給對(duì)象的數(shù)據(jù)進(jìn)行初始化
*
* 格式:
* 方法名和類名相同
* 沒有返回值類型,連void都不能寫
* 沒有具體的返回值
*
*/
public class Student {
public Student() {
System.out.println("這是構(gòu)造方法");
}
}
package com.neuedu.demo;
public class StudentDemo {
public static void main(String[] args) {
//如何調(diào)用構(gòu)造方法呢?
//通過new關(guān)鍵字調(diào)用
//格式:類名 對(duì)象名 = new 構(gòu)造方法(...);
Student s = new Student();
}
}
- 構(gòu)造方法注意事項(xiàng)與重載
如果你不提供構(gòu)造方法,系統(tǒng)會(huì)給出默認(rèn)構(gòu)造方法
如果你提供了構(gòu)造方法,系統(tǒng)將不再提供
構(gòu)造方法也是可以重載的,重載條件和普通方法相同
- 案例代碼十二:
package com.neuedu.demo;
/*
* 構(gòu)造方法:
* 給對(duì)象的數(shù)據(jù)進(jìn)行初始化
*
* 格式:
* 方法名和類名相同
* 沒有返回值類型,連void都不能寫
* 沒有具體的返回值
*
* 構(gòu)造方法的注意事項(xiàng):
* A:如果我們沒有給出構(gòu)造方法,系統(tǒng)將會(huì)提供一個(gè)默認(rèn)的無參構(gòu)造方法供我們使用。
* B:如果我們給出了構(gòu)造方法,系統(tǒng)將不在提供默認(rèn)的無參構(gòu)造方法供我們使用。
* 這個(gè)時(shí)候,如果我們想使用無參構(gòu)造方法,就必須自己提供。
* 推薦:自己給無參構(gòu)造方法
* C:構(gòu)造方法也是可以重載的
*
* 成員變量賦值:
* A:setXxx()方法
* B:帶參構(gòu)造方法
*/
public class Student {
private String name;
private int age;
/*
public Student() {
System.out.println("這是構(gòu)造方法");
}
*/
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name+"---"+age);
}
}
package com.neuedu.demo;
public class StudentDemo {
public static void main(String[] args) {
//如何調(diào)用構(gòu)造方法呢?
//通過new關(guān)鍵字調(diào)用
//格式:類名 對(duì)象名 = new 構(gòu)造方法(...);
Student s = new Student();
s.show();
//public Student(String name)
Student s2 = new Student("嘎嘎");
s2.show();
//public Student(int age)
Student s3 = new Student(28);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("嘎嘎",28);
s4.show();
}
}
- 包含private,無參,有參構(gòu)造的標(biāo)準(zhǔn)學(xué)生類代碼:
A:類:
a:成員變量
b:構(gòu)造方法
無參構(gòu)造方法
帶參構(gòu)造方法
c:成員方法
getXxx()
setXxx()
B:給成員變量賦值的方式
a:無參構(gòu)造方法+setXxx()
b:帶參構(gòu)造方法
- 案例代碼十三:
package com.neuedu.demo;
/*
* 學(xué)生類
*/
public class Student {
//成員變量
private String name;
private int age;
//構(gòu)造方法
public Student() {}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//成員方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
package com.neuedu.demo;
/*
* 學(xué)生類的測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//無參+setXxx()
Student s = new Student();
s.setName("呵呵");
s.setAge(28);
System.out.println(s.getName()+"---"+s.getAge());
//帶參構(gòu)造
Student s2 = new Student("呵呵",28);
System.out.println(s2.getName()+"---"+s2.getAge());
}
}
四、類名作為形參和返回值
- 類名作為方法的形式參數(shù)
- 案例代碼十四:
package com.neuedu.demo;
public class Student {
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
}
package com.neuedu.demo;
public class Teacher {
public void test(Student s) {//接收傳遞過來的Student對(duì)象的地址值
s.study();
}
}
package com.neuedu.demo;
//需求: 調(diào)用Teacher的test方法
//類名作為形式參數(shù):其實(shí)這里需要的是該類對(duì)象。
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = new Student();
t.test(s);
}
}
- 類名作為返回值案例
- 案例代碼十五:
package com.neuedu.demo;
public class Student {
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
}
package com.neuedu.demo;
public class Teacher {
public Student getStudent() {
Student s = new Student();
return s;//返回的是Student對(duì)象的地址值
}
}
package com.neuedu.demo;
//需求: 通過Teacher得到Student對(duì)象,然后調(diào)用Student類的方法
//如果方法的返回值是類名:其實(shí)返回的是該類的對(duì)象
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = t.getStudent();
s.study();
}
}
- 面向過程思想與面向?qū)ο笏枷?br>
A:什么是面向過程
面向過程,其實(shí)就是面向著具體的每一個(gè)步驟和過程,把每一個(gè)步驟和過程完成,然后由這些功能方法相互調(diào)用,完成需求。
例如:吃煎餅果子利用面向過程的思想:
1.學(xué)習(xí)攤煎餅的技術(shù)
2.買材料雞蛋,油,蔥等等
3.開始攤
4.吃
5.收拾
B:什么是面向?qū)ο?br> 面向?qū)ο笏枷刖褪遣粩嗟膭?chuàng)建對(duì)象,使用對(duì)象,指揮對(duì)象做事情。(如果有對(duì)象,直接用對(duì)象,對(duì)我們直接提供服務(wù))
例如:吃煎餅果子利用面向?qū)ο蟮乃枷?/li>
- 找會(huì)攤煎餅的大媽(創(chuàng)建一個(gè)攤煎餅大媽的對(duì)象)
- 調(diào)用其攤煎餅的技能(功能),傳遞進(jìn)去錢參數(shù)
- 返回給我們一個(gè)煎餅
- 吃
- 面向過程特點(diǎn)與面向?qū)ο筇攸c(diǎn)
A:面向過程:
強(qiáng)調(diào)的是過程,所有事情都需要自己完成
B:面向?qū)ο?
是一種更符合我們思想習(xí)慣的思想(懶人思想,我把事情自己不做,交給別人去做)
可以將復(fù)雜的事情簡(jiǎn)單化(對(duì)使用者來說簡(jiǎn)單了,對(duì)象里面還是很復(fù)雜的)
將我們從執(zhí)行者變成了指揮者角色發(fā)生了轉(zhuǎn)換
- 案例代碼一:
package com.neuedu.demo;
/*
* 面向?qū)ο笏枷耄?* 面向?qū)ο笫腔诿嫦蜻^程的編程思想。
*
* 面向過程:強(qiáng)調(diào)的是每一個(gè)功能的步驟
* 面向?qū)ο螅簭?qiáng)調(diào)的是對(duì)象,然后由對(duì)象去調(diào)用功能
*
* 面向?qū)ο蟮乃枷胩攸c(diǎn):
* A:是一種更符合我們思考習(xí)慣的思想
* B:可以將復(fù)雜的事情簡(jiǎn)單化
* C:將我們從執(zhí)行者變成了指揮者
*
* 舉例:
* 買電腦:
* 面向過程:我要買電腦--我要明確買電腦的意義--上網(wǎng)查對(duì)>應(yīng)的參數(shù)信息--去三好街買電腦--討價(jià)還價(jià)--買回電腦
* 面向?qū)ο螅何乙I電腦--班長(zhǎng)去給我買電腦--買回電腦
* 洗衣服:
* 面向過程:把衣服脫下來--找一個(gè)盆--放點(diǎn)洗衣粉--加點(diǎn)水--浸泡10分鐘--揉一揉--清洗衣服--擰干--晾起來
* 面向?qū)ο螅喊岩路撓聛?-打開全自動(dòng)洗衣機(jī)--扔衣服--按鈕--晾起來
*/
public class Demo {
}
- 類與對(duì)象概述:
A:我們學(xué)習(xí)編程是為了什么
為了把我們?nèi)粘I钪袑?shí)物用學(xué)習(xí)語言描述出來
B:我們?nèi)绾蚊枋霈F(xiàn)實(shí)世界事物
屬性 就是該事物的描述信息(事物身上的名詞)
行為 就是該事物能夠做什么(事物身上的動(dòng)詞)
C:Java中最基本的單位是類,Java中用class描述事物也是如此
成員變量 就是事物的屬性
成員方法 就是事物的行為
D:定義類其實(shí)就是定義類的成員(成員變量和成員方法)
a:成員變量 和以前定義變量是一樣的,只不過位置發(fā)生了改變。在類中,方法外。
b:成員方法 和以前定義方法是一樣的,只不過把static去掉,后面在詳細(xì)講解static的作用。
E:類和對(duì)象的概念
a:類:是一組相關(guān)的屬性和行為的集合(我們班所有的同學(xué)都具備相同的屬性和行為,比如:姓名,年齡,學(xué)習(xí),這樣就把所有的學(xué)生成為學(xué)生類)
b:對(duì)象:是該類事物的具體體現(xiàn)(說某個(gè)同學(xué)時(shí),他都具備自己特有的屬性和行為)
c:舉例:
類 學(xué)生
對(duì)象 具體的某個(gè)學(xué)生就是一個(gè)對(duì)象
比如:車是一個(gè)類,具體的開的奔馳、寶馬,就是對(duì)象
- 案例代碼二:
package com.neuedu.demo;
/*
* 我們學(xué)習(xí)編程語言,其實(shí)就是為了把現(xiàn)實(shí)世界的事物模擬出來,實(shí)現(xiàn)信息化。
*
* 我們是如何表示現(xiàn)實(shí)世界的事物的呢?
* A:屬性 就是事物的描述信息
* B:行為 就是事物能夠做什么
* 舉例:學(xué)生
*
* Java語言最基本的單位是類,所以,我們?cè)诤竺娴膶W(xué)習(xí)過程中,是通過類來體現(xiàn)現(xiàn)實(shí)世界事物的。
*
* 類:是一組相關(guān)的屬性和行為的集合
* 對(duì)象:就是該事物的具體體現(xiàn)
* 舉例:
* 類 學(xué)生
* 對(duì)象 班長(zhǎng)
*/
public class Demo2 {
}
- 類與對(duì)象案例:
- 學(xué)生類案例
- 案例代碼三:
package com.neuedu.demo;
/*
* 類的定義:
* 類是用來描述現(xiàn)實(shí)世界的事物的
*
* 事物:
* 屬性 事物的描述信息
* 行為 事物能夠做什么
*
* 類是如何和事物進(jìn)行對(duì)應(yīng)的呢?
* 類:
* 成員變量
* 成員方法
*
* 需求:寫一個(gè)學(xué)生類
*
* 學(xué)生事物:
* 屬性:姓名,年齡...
* 行為:學(xué)習(xí),吃飯...
*
* 學(xué)生類:
* 成員變量:姓名,年齡
* 成員方法:學(xué)習(xí),吃飯
*
* 成員變量:和我們前面學(xué)習(xí)過的變量的定義是一樣的。
* 位置不同:類中,方法外
* 初始化值:不需要給初始化值
* 成員方法:和我們前面學(xué)習(xí)過的方法的定義是一樣的。
* 去掉static關(guān)鍵字
*/
public class Student {
//成員變量
//姓名
String name;
//年齡
int age;
//成員方法
//學(xué)習(xí)的方法
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
//吃飯的方法
public void eat() {
System.out.println("學(xué)習(xí)餓了要吃飯");
}
}
package com.neuedu.demo;
/*
* Student是一個(gè)學(xué)生事物描述類,main方法不適合放在它里面。
*
* 使用一個(gè)類,其實(shí)就是使用該類的成員。(成員變量和成員方法)
* 而我們要想使用一個(gè)類的成員,就必須首先擁有該類的對(duì)象。
* 我們?nèi)绾螕碛幸粋€(gè)類的對(duì)象呢?
* 創(chuàng)建對(duì)象就可以了?
* 我們?nèi)绾蝿?chuàng)建對(duì)象呢?
* 格式:類名 對(duì)象名 = new 類名();
* 對(duì)象如何訪問成員呢?
* 成員變量:對(duì)象名.變量名
* 成員方法:對(duì)象名.方法名(...)
*/
public class StudentDemo {
public static void main(String[] args) {
//格式:類名 對(duì)象名 = new 類名();
Student s = new Student();
//System.out.println("s:"+s); >//com.neuedu.demo.Student@193c0cf
//直接輸出成員變量值
System.out.println("姓名:"+s.name); //null
System.out.println("年齡:"+s.age); //0
System.out.println("----------");
//給成員變量賦值
s.name = "趙四";
s.age = 28;
//再次輸出成員變量的值
System.out.println("姓名:"+s.name); //趙四
System.out.println("年齡:"+s.age); //28
System.out.println("----------");
//調(diào)用成員方法
s.study();
s.eat();
}
}
- 手機(jī)類案例
- 案例代碼四:
package com.neuedu.demo;
/*
* 手機(jī)類:
* 成員變量:品牌,價(jià)格,顏色...
* 成員方法:打電話,發(fā)短信...
*/
public class Phone {
//品牌
String brand;
//價(jià)格
int price;
//顏色
String color;
//打電話
public void call(String name) {
System.out.println("給"+name+"打電話");
}
//發(fā)短信
public void sendMessage() {
System.out.println("群發(fā)短信");
}
}
package com.neuedu.demo;
/*
* 手機(jī)類的測(cè)試類
*/
public class PhoneDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Phone p = new Phone();
//輸出成員變量值
System.out.println("品牌:"+p.brand);//null
System.out.println("價(jià)格:"+p.price);//0
System.out.println("顏色:"+p.color);//null
System.out.println("------------");
//給成員變量賦值
p.brand = "錘子";
p.price = 2999;
p.color = "棕色";
//再次輸出成員變量值
System.out.println("品牌:"+p.brand);//錘子
System.out.println("價(jià)格:"+p.price);//2999
System.out.println("顏色:"+p.color);//棕色
System.out.println("------------");
//調(diào)用成員方法
p.call("趙四");
p.sendMessage();
}
}
-
一個(gè)對(duì)象的內(nèi)存圖:
一個(gè)對(duì)象的內(nèi)存圖.png
-
方法公用內(nèi)存圖:
方法公用內(nèi)存圖.png - 案例代碼五:
package com.neuedu.demo;
/*
* 手機(jī)類的測(cè)試類
*/
public class PhoneDemo2 {
public static void main(String[] args) {
Phone p = new Phone();
p.brand = "小米5s";
p.price = 1999;
p.color = "銀色";
System.out.println(p.brand+"---"+p.price+"---"+p.color);
p.call("林青霞");
p.sendMessage();
Phone p2 = new Phone();
p2.brand = "IPhone7S";
p2.price = 7999;
p2.color = "土豪金";
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
p2.call("張曼玉");
p2.sendMessage();
}
}
-
兩個(gè)引用指向同一個(gè)對(duì)象內(nèi)存圖:
兩個(gè)引用指向同一個(gè)對(duì)象內(nèi)存圖.png - 案例代碼六:
package com.neuedu.demo;
/*
* 手機(jī)類的測(cè)試類
*/
public class PhoneDemo3 {
public static void main(String[] args) {
Phone p = new Phone();
p.brand = "OPPO";
p.price = 2999;
p.color = "白色";
System.out.println(p.brand+"---"+p.price+"---"+p.color);
Phone p2 = p;
p2.brand = "魅族";
p2.price = 1999;
p2.color = "藍(lán)色";
System.out.println(p.brand+"---"+p.price+"---"+p.color);
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
}
}
- 案例代碼七:
package com.neuedu.demo;
/*
* 成員變量和局部變量的區(qū)別:
* A:在類中的位置不同
* 成員變量:類中,方法外
* 局部變量:方法中或者方法聲明上(形式參數(shù))
* B:在內(nèi)存中的位置不同
* 成員變量:堆內(nèi)存
* 局部變量:棧內(nèi)存
* C:生命周期不同
* 成員變量:隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失
* 局部變量:隨著方法的調(diào)用而存在,隨著方法的調(diào)用完畢而消失
* D:初始化值的問題
* 成員變量:有默認(rèn)值
* 局部變量:沒有默認(rèn)值。必須先定義,賦值,最后使用
*/
public class Variable {
int x;
public void show() {
int y = 0;
System.out.println(x);
System.out.println(y);
}
}
- private關(guān)鍵字
A:private關(guān)鍵字:
a:是一個(gè)權(quán)限修飾符。
b:可以修飾成員(成員變量和成員方法)
c:被private修飾的成員只在本類中才能訪問。
- 案例代碼八:
package com.neuedu.demo;
/*
* 學(xué)生類
*
* 通過對(duì)象直接訪問成員變量,會(huì)存在數(shù)據(jù)安全問題
* 這個(gè)時(shí)候,我們就想能不能不讓外界的對(duì)象直接訪問成員變量呢?
* 能。
* 如何實(shí)現(xiàn)呢?
* private關(guān)鍵字
*
* private:
* 是一個(gè)修飾符
* 可以修飾成員變量,也可以修飾成員方法
* 被private修飾的成員只能在本類中被訪問
*
* 針對(duì)private修飾的成員變量,我們會(huì)相應(yīng)的提供getXxx()和setXxx()用于獲取和設(shè)置成員變量的值,方法用public修飾
*/
public class Student {
String name;
//int age;
private int age;
public void setAge(int a) {
if(a<0 || a>200) {
System.out.println("你給的年齡有誤");
}else {
age = a;
}
}
public int getAge() {
return age;
}
public void show() {
System.out.println("姓名是:"+name+",年齡是:"+age);
}
}
package com.neuedu.demo;
/*
* 學(xué)生類的測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建學(xué)生對(duì)象
Student s = new Student();
s.show();
s.name = "哈哈";
//s.age = 28;
//s.age = -28;
//s.setAge(-28);
s.setAge(28);
s.show();
}
}
- private最常見應(yīng)用
A:把成員變量用private修飾
B:提供對(duì)應(yīng)的getXxx()/setXxx()方法 - 案例代碼九:
package com.neuedu.demo;
/*
* 學(xué)生類
*/
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
package com.neuedu.demo;
/*
* 學(xué)生類的測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Student s = new Student();
System.out.println(s.getName()+"---"+s.getAge());
s.setName("嘿嘿");
s.setAge(28);
System.out.println(s.getName()+"---"+s.getAge());
}
}
- 封裝的概述和好處:
A:封裝概述
是面向?qū)ο笕筇卣髦?br> 是面向?qū)ο缶幊陶Z言對(duì)客觀世界的模擬,客觀世界里成員變量都是隱藏在對(duì)象內(nèi)部的,外界無法直接操作和修改。就像剛才說的年齡。
B:封裝原則:
將不需要對(duì)外提供的內(nèi)容都隱藏起來。
把屬性隱藏,提供公共方法對(duì)其訪問。
成員變量private,提供對(duì)應(yīng)的getXxx()/setXxx()方法
C:好處:
通過方法來控制成員變量的操作,提高了代碼的安全性
把代碼用方法進(jìn)行封裝,提高了代碼的復(fù)用性
- this關(guān)鍵字由來和使用:
A:this:代表所在類的對(duì)象引用
方法被哪個(gè)對(duì)象調(diào)用,this就代表那個(gè)對(duì)象
B:什么時(shí)候使用this呢
局部變量和成員變量重名
- 案例代碼十:
package com.neuedu.demo;
/*
* 學(xué)生類
*
* 起名字我們要求做到見名知意。
* 而我們現(xiàn)在的代碼中的n和a就沒有做到見名知意,所以我要改進(jìn)。
*
* 如果有局部變量名和成員變量名相同,在局部使用的時(shí)候,采用的是就近的原則。
*
* 我們有沒有辦法把局部變量的name賦值給成員變量的name呢?
* 有。
*
* 什么辦法呢?
* 用this關(guān)鍵字就可以解決這個(gè)問題
*
* this:代表所在類的對(duì)象引用
* 方法被哪個(gè)對(duì)象調(diào)用,this就代表那個(gè)對(duì)象
*
* 使用場(chǎng)景:
* 局部變量隱藏成員變量
*/
public class Student {
private String name;
private int age;
public void setName(String name) { //"林青霞"
//name = name;
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//age = age;
this.age = age;
}
public int getAge() {
return age;
}
}
package com.neuedu.demo;
/*
* 學(xué)生類的測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Student s = new Student();
System.out.println(s.getName()+"---"+s.getAge());
s.setName("嘻嘻");
s.setAge(28);
System.out.println(s.getName()+"---"+s.getAge());
}
}
主要用來給對(duì)象的數(shù)據(jù)進(jìn)行初始化
- 構(gòu)造方法格式:
A:構(gòu)造方法格式
a:方法名與類名相同
b:沒有返回值類型,連void都沒有
c:沒有具體的返回值
- 案例代碼十一:
package com.neuedu.demo;
/*
* 構(gòu)造方法:
* 給對(duì)象的數(shù)據(jù)進(jìn)行初始化
*
* 格式:
* 方法名和類名相同
* 沒有返回值類型,連void都不能寫
* 沒有具體的返回值
*
*/
public class Student {
public Student() {
System.out.println("這是構(gòu)造方法");
}
}
package com.neuedu.demo;
public class StudentDemo {
public static void main(String[] args) {
//如何調(diào)用構(gòu)造方法呢?
//通過new關(guān)鍵字調(diào)用
//格式:類名 對(duì)象名 = new 構(gòu)造方法(...);
Student s = new Student();
}
}
- 構(gòu)造方法注意事項(xiàng)與重載
如果你不提供構(gòu)造方法,系統(tǒng)會(huì)給出默認(rèn)構(gòu)造方法
如果你提供了構(gòu)造方法,系統(tǒng)將不再提供
構(gòu)造方法也是可以重載的,重載條件和普通方法相同
- 案例代碼十二:
package com.neuedu.demo;
/*
* 構(gòu)造方法:
* 給對(duì)象的數(shù)據(jù)進(jìn)行初始化
*
* 格式:
* 方法名和類名相同
* 沒有返回值類型,連void都不能寫
* 沒有具體的返回值
*
* 構(gòu)造方法的注意事項(xiàng):
* A:如果我們沒有給出構(gòu)造方法,系統(tǒng)將會(huì)提供一個(gè)默認(rèn)的無參構(gòu)造方法供我們使用。
* B:如果我們給出了構(gòu)造方法,系統(tǒng)將不在提供默認(rèn)的無參構(gòu)造方法供我們使用。
* 這個(gè)時(shí)候,如果我們想使用無參構(gòu)造方法,就必須自己提供。
* 推薦:自己給無參構(gòu)造方法
* C:構(gòu)造方法也是可以重載的
*
* 成員變量賦值:
* A:setXxx()方法
* B:帶參構(gòu)造方法
*/
public class Student {
private String name;
private int age;
/*
public Student() {
System.out.println("這是構(gòu)造方法");
}
*/
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name+"---"+age);
}
}
package com.neuedu.demo;
public class StudentDemo {
public static void main(String[] args) {
//如何調(diào)用構(gòu)造方法呢?
//通過new關(guān)鍵字調(diào)用
//格式:類名 對(duì)象名 = new 構(gòu)造方法(...);
Student s = new Student();
s.show();
//public Student(String name)
Student s2 = new Student("嘎嘎");
s2.show();
//public Student(int age)
Student s3 = new Student(28);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("嘎嘎",28);
s4.show();
}
}
- 包含private,無參,有參構(gòu)造的標(biāo)準(zhǔn)學(xué)生類代碼:
A:類:
a:成員變量
b:構(gòu)造方法
無參構(gòu)造方法
帶參構(gòu)造方法
c:成員方法
getXxx()
setXxx()
B:給成員變量賦值的方式
a:無參構(gòu)造方法+setXxx()
b:帶參構(gòu)造方法
- 案例代碼十三:
package com.neuedu.demo;
/*
* 學(xué)生類
*/
public class Student {
//成員變量
private String name;
private int age;
//構(gòu)造方法
public Student() {}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//成員方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
package com.neuedu.demo;
/*
* 學(xué)生類的測(cè)試類
*/
public class StudentDemo {
public static void main(String[] args) {
//無參+setXxx()
Student s = new Student();
s.setName("呵呵");
s.setAge(28);
System.out.println(s.getName()+"---"+s.getAge());
//帶參構(gòu)造
Student s2 = new Student("呵呵",28);
System.out.println(s2.getName()+"---"+s2.getAge());
}
}
- 案例代碼十四:
package com.neuedu.demo;
public class Student {
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
}
package com.neuedu.demo;
public class Teacher {
public void test(Student s) {//接收傳遞過來的Student對(duì)象的地址值
s.study();
}
}
package com.neuedu.demo;
//需求: 調(diào)用Teacher的test方法
//類名作為形式參數(shù):其實(shí)這里需要的是該類對(duì)象。
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = new Student();
t.test(s);
}
}
- 類名作為返回值案例
- 案例代碼十五:
package com.neuedu.demo;
public class Student {
public void study() {
System.out.println("好好學(xué)習(xí),天天向上");
}
}
package com.neuedu.demo;
public class Teacher {
public Student getStudent() {
Student s = new Student();
return s;//返回的是Student對(duì)象的地址值
}
}
package com.neuedu.demo;
//需求: 通過Teacher得到Student對(duì)象,然后調(diào)用Student類的方法
//如果方法的返回值是類名:其實(shí)返回的是該類的對(duì)象
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = t.getStudent();
s.study();
}
}


