面向?qū)ο?1-方法(重載)/包/修飾符
[TOC]
1、面向?qū)ο笈c面向過(guò)程
面向?qū)ο蠛兔嫦蜻^(guò)程都屬于思考問(wèn)題的方式
面向過(guò)程:以執(zhí)行者的角度思考問(wèn)題,側(cè)重于實(shí)現(xiàn)的過(guò)程,或側(cè)重于“怎么做”,比較適合解決小型的問(wèn)題
面向?qū)ο螅阂灾笓]者的角度思考問(wèn)題,側(cè)重于“誰(shuí)來(lái)做”,比較適合解決中大型的問(wèn)題
總結(jié):面向?qū)ο蠛兔嫦蜻^(guò)程并不是完全獨(dú)立的。一般來(lái)講,從宏觀上先用面向?qū)ο笏伎挤绞?,然后在?xì)節(jié)上又使用了面向過(guò)程的思考方式
2、類(lèi)和對(duì)象
對(duì)象:客觀世界中存在的一切可以被描述的事物,都稱為對(duì)象
通過(guò)對(duì)象的特征(屬性和方法)區(qū)分對(duì)象
屬性:描述對(duì)象的靜態(tài)、外觀的特性,比如 姓名、顏色、身高、價(jià)格等
方法:描述對(duì)象的行為或功能,比如吃、喝、學(xué)習(xí)、睡覺(jué)、能盛水等
類(lèi): 一組具有相同屬性和方法的對(duì)象的集合,抽取成類(lèi)(歸納總結(jié)出來(lái)的)
區(qū)別:
對(duì)象:實(shí)際存在的,可以直接操作,是一個(gè)具體的實(shí)例
類(lèi):抽象的、模板式的存在,不可以直接操作
聯(lián)系:
類(lèi):是一組對(duì)象的集合,是對(duì)象的類(lèi)型(切記),是通過(guò)對(duì)象歸納總結(jié)出來(lái)的產(chǎn)物
對(duì)象:在java中,通過(guò)類(lèi)創(chuàng)建出來(lái)的具體的實(shí)例
2.1、類(lèi)和對(duì)象的的創(chuàng)建
【修飾符】 class 類(lèi)名{
編寫(xiě)屬性
編寫(xiě)方法
}
類(lèi)名 對(duì)象名 = new 類(lèi)型();
對(duì)象名.屬性=值;
對(duì)象名.方法();
2.2、類(lèi)和對(duì)象的內(nèi)存分配圖
//棧:對(duì)象的引用、局部變量
//堆:對(duì)象和全局變量(屬性)在堆中創(chuàng)建新對(duì)象
//方法區(qū):類(lèi)信息
//語(yǔ)法:類(lèi)名 對(duì)象名=new 類(lèi)名();
Person p1 = new Person(); //該句 首先在內(nèi)存中判斷類(lèi)是否加載 如果沒(méi)有加載 使用類(lèi)加載器加載類(lèi)(到方法區(qū)) 然后在創(chuàng)建對(duì)象
//先去判斷需要的類(lèi)是否已經(jīng)加載,如果已經(jīng)加載了,則無(wú)需再加載,如果沒(méi)有加載,則需要通過(guò)類(lèi)加載器加載類(lèi)信息到方法區(qū)

3、類(lèi)的成員之一:屬性
1、屬性的類(lèi)型可以為任意類(lèi)型,包含基本類(lèi)型和引用類(lèi)型 (一個(gè)類(lèi)也可以做屬性)
2、每個(gè)對(duì)象的屬性是獨(dú)立的。其中一個(gè)對(duì)象對(duì)其屬性進(jìn)行更改,不影響另外一個(gè)
3、屬性的定義語(yǔ)法和使用,同變量,也就是本質(zhì)上就是變量
變量根據(jù)作用域不同,可以分為兩類(lèi):全局變量和局部變量
變量的作用域:也就是變量的作用范圍,根據(jù)變量定義的位置決定的,一般是指包含變量定義的最近的大括號(hào)
全局變量:作用域?yàn)檎麄€(gè)類(lèi)體,也就是屬性或成員變量
局部變量:作用域?yàn)榘姆椒ɑ虼a塊中,也就是除了屬性,其他的變量都是局部變量
3.1 全局變量和局部變量
| 作用域 | 存儲(chǔ)位置 | 生命周期 | 變量重名 | 默認(rèn)值 | 訪問(wèn)可見(jiàn)性 | 修飾符 | |
|---|---|---|---|---|---|---|---|
| 全局變量 | 較大,整個(gè)類(lèi) | 堆 | 長(zhǎng) | 不能重名 | 有 | 本類(lèi)或者其他類(lèi) | 有 |
| 局部變量 | 較小,方法或者代碼塊 | 棧 | 短 | 局部有交集不能重名 但是一個(gè)全局和一個(gè)局部可以重名 遵循就近原則 | b本類(lèi)的方法或者代碼 |
4、類(lèi)的成員之二:方法
4.1、方法的理解和好處
理解
方法 :定義在類(lèi)體中,描述了一組對(duì)象的行為或功能。又稱為函數(shù)。
好處:
1、對(duì)于調(diào)用者來(lái)講,不關(guān)心具體的實(shí)現(xiàn)細(xì)節(jié),調(diào)用比較方便,只需要關(guān)心
“叫什么”和“干什么”。
從一定程度上來(lái)講,提高了安全性和封裝性
2、對(duì)于設(shè)計(jì)者來(lái)講,提高代碼的重用性和維護(hù)性
4.2、方法的五要素★
1、修飾符
? 可選
2、返回類(lèi)型
? 特點(diǎn):某個(gè)方法執(zhí)行結(jié)束后需要返回給調(diào)用方一個(gè)結(jié)果,則該方法需要設(shè)計(jì)成帶返回值的方法
?
① 一個(gè)方法至多有一個(gè)返回值
②返回類(lèi)型可以為任意數(shù)據(jù)類(lèi)型,包含基本類(lèi)型或引用類(lèi)型
public int method(){}
public Person method(){}
public int[] method(){}
③如果方法沒(méi)有返回值,則返回類(lèi)型寫(xiě)void,方法體中不需要return語(yǔ)句
如果方法有返回值,則返回類(lèi)型寫(xiě)返回值的類(lèi)型(一致或兼容),方法體中必須寫(xiě)上return 值;
public void method(){
syso();
}
public int method(){
syso();
return a;
}
④如果方法有返回值,則要保證方法體的執(zhí)行語(yǔ)句最后一句肯定為return語(yǔ)句
public int method(){
if(){
return 100;
}
}
3、方法名
4、參數(shù)列表
? 特點(diǎn):有的行為的執(zhí)行,需要調(diào)用方在最開(kāi)始傳入一些值,才能執(zhí)行,這些值稱為參數(shù)
①參數(shù)可以有0個(gè)或多個(gè),具體語(yǔ)法
(參數(shù)類(lèi)型 參數(shù)名,參數(shù)類(lèi)型 參數(shù)名)
②參數(shù)類(lèi)型 可以為任意類(lèi)型,包含基本類(lèi)型或引用類(lèi)型
public void method(int a,String b,int[] arr,Person per){}
③調(diào)用帶參數(shù)的方法時(shí),必須傳入指定類(lèi)型的參數(shù),否則報(bào)錯(cuò)!
5、方法體
特點(diǎn):描述功能或行為具體實(shí)現(xiàn)的步驟,里面可以放任意邏輯語(yǔ)句,輸入、輸出、變量、循環(huán)、方法的調(diào)用等,但不能放方法的定義
4.3、方法的聲明 ★
語(yǔ)法:
修飾符 返回值類(lèi)型 方法名 ( 參數(shù)列表) {
方法體語(yǔ)句;
}
具體形式:
1.無(wú)返回?zé)o參
2.有返回?zé)o參
3.無(wú)返回有參
4.有返回有參
4.4、方法的調(diào)用 ★
語(yǔ)法:
同一個(gè)類(lèi)中:
類(lèi)型 名 = 方法名(參數(shù)列表);
不同類(lèi)中:
類(lèi)型 名 = 對(duì)象名.方法名(參數(shù)列表);
4.5、方法的調(diào)用機(jī)制 【理解】
棧:先進(jìn)后出

? 每次調(diào)用方法,伴隨著“方法入棧”操作,也就是棧中為該方法分配了一塊空間,用于保存該方法中涉及到的變量
每次方法調(diào)用結(jié)束,伴隨著“方法出?!辈僮?,也就是棧中分配的空間被釋放了。
4.6、方法的參數(shù)傳遞 【面試題】 ★
package day08;
/*
* 此類(lèi)用于演示
* 一、方法的參數(shù)類(lèi)型為:引用類(lèi)型
* ①數(shù)組類(lèi)型
* ②對(duì)象類(lèi)型
*
* 二、方法的返回類(lèi)型為:引用類(lèi)型
* ①數(shù)組類(lèi)型
* ②對(duì)象類(lèi)型
*
*
*/
public class TestArgs {
public static void main(String[] args) {
MyUtils mu = new MyUtils();
//調(diào)用數(shù)組類(lèi)型做參數(shù)的方法
double[] arr={100,2,5.8,980.5,89};
double max = mu.getMax(arr);
System.out.println(max);
System.out.println("====================");
//調(diào)用對(duì)象類(lèi)型做參數(shù)的方法
Book book = new Book();
book.price=900;
book.name="葵花寶典";
mu.setBookPrice(book);
System.out.println(book.name+"\t"+book.price);
System.out.println("====================");
//調(diào)用數(shù)組類(lèi)型做返回的方法
int[] src={2,3,4};
int[] dest = mu.arrayCopy(src, src.length);
for (int i = 0; i < dest.length; i++) {
System.out.print(dest[i]);
System.out.println();
}
System.out.println("====================");
//調(diào)用對(duì)象類(lèi)型做返回的方法
Book copyBook = mu.copyBook(book);
System.out.println(copyBook.name+"\t"+copyBook.price);
}
}
class MyUtils{
//參數(shù)類(lèi)型:數(shù)組類(lèi)型
//定義方法,實(shí)現(xiàn)求某個(gè)double數(shù)組的最大值,并返回
public double getMax(double[] arr){
double max = arr[0];
for(int i = 0;i<arr.length;i++){
if(max<arr[i])
max = arr[i];
}
return max;
}
//參數(shù)類(lèi)型:對(duì)象類(lèi)型
//實(shí)現(xiàn)更改某本書(shū)的價(jià)格,具體:如果價(jià)格>150,則更改為150,如果價(jià)格>100,更改為100,否則不變
public void setBookPrice(Book book){
if(book.price>150){
book.price = 150;
}else if(book.price>100){
book.price=100;
}
}
//返回類(lèi)型:數(shù)組類(lèi)型
// 場(chǎng)景:實(shí)現(xiàn)數(shù)組的復(fù)制功能,根據(jù)舊數(shù)組和指定長(zhǎng)度,返回一個(gè)新數(shù)組,元素和舊數(shù)組一樣
public int[] arrayCopy(int[] src, int len){
int [] dest = new int[len];
int length = len<src.length?len:src.length;
for(int i=0; i<src.length;i++){
dest[i] = src[i];
}
return dest;
}
//返回類(lèi)型:對(duì)象類(lèi)型
//場(chǎng)景:實(shí)現(xiàn)Book對(duì)象的復(fù)制,新Book的書(shū)名和舊Book一樣,價(jià)格為舊Book的2倍
public Book copyBook(Book book){
Book newBook = new Book();
newBook.name=book.name;
newBook.price=book.price*2;
return newBook;
}
}
class Book{
String name;
double price;
}
當(dāng)調(diào)用方法時(shí),將實(shí)參傳遞給形參(參數(shù)的賦值)的過(guò)程,稱為方法的傳參。
特點(diǎn):★
? 基本類(lèi)型做參數(shù),傳遞的是值,形參的改變不影響實(shí)參
? 引用類(lèi)型做參數(shù),傳遞的是地址,形參的改變(成員)影響實(shí)參\
注意:
當(dāng)引用類(lèi)型做參數(shù)時(shí),如果形參改變的是(地址),則最終不影響實(shí)參(new了一個(gè)新的地址)


【面試題】java中方法的參數(shù)傳遞的是什么?
java中,方法參數(shù)是按值傳遞!
如果是基本類(lèi)型,則值 代表元素內(nèi)容
如果是引用類(lèi)型,則值 代表地址號(hào)
4.7、方法重載 √
概念:
? java中允許同一個(gè)類(lèi)中,多個(gè)方法的名稱相同,但參數(shù)列表必須不同
? 這種現(xiàn)象稱為重載!
在同一個(gè)類(lèi)中 同名方法情況下 只和參數(shù)有關(guān)
①、必須保證參數(shù)列表中至少有一樣不同(參數(shù)類(lèi)型、參數(shù)個(gè)數(shù)、參數(shù)順序)
②、返回類(lèi)型無(wú)要求
③、修飾符無(wú)要求
4.8、可變參數(shù)的方法 √
jdk5.0出現(xiàn)的新特性。將同一個(gè)類(lèi)中,多個(gè)方法名相同、參數(shù)類(lèi)型相同、返回類(lèi)型相同,僅僅是參數(shù)個(gè)數(shù)不同的方法抽取成一個(gè)方法,這種方法稱為可變參數(shù)的方法
好處:
? 提高代碼的重用性和維護(hù)性
語(yǔ)法:
修飾符 返回類(lèi)型 方法名(參數(shù)類(lèi)型...參數(shù)名){
}
注意:使用時(shí),將可變長(zhǎng)度的參數(shù)當(dāng)做數(shù)組使用
使用特點(diǎn):
1、可變參數(shù)的實(shí)參可以為0個(gè)或任意多個(gè)
2、可變參數(shù)的實(shí)參可以為一維數(shù)組類(lèi)型
3、可變參數(shù)和普通類(lèi)型參數(shù) 一起使用時(shí),只能放在最后
4、一個(gè)參數(shù)列表中至多有一個(gè)可變參數(shù)!
5、包的使用
1、類(lèi)似于文件系統(tǒng)的文件夾,可以實(shí)現(xiàn)分類(lèi)管理類(lèi)文件,方便查找
2、解決了同一個(gè)項(xiàng)目中同名類(lèi)的沖突問(wèn)題
命名規(guī)則:
? 標(biāo)識(shí)符+小圓點(diǎn)
? 標(biāo)識(shí)符:只能包含數(shù)字、字母、下劃線和$符號(hào),不能以數(shù)字開(kāi)頭,不能是關(guān)鍵字或保留字
?
寫(xiě)法:標(biāo)識(shí)符.標(biāo)識(shí)符
舉例:
demo.int ×
java.demo ×
demo.3a ×
命名規(guī)范:
建議小寫(xiě)字母,并且采用域名倒置的寫(xiě)法
域名倒置:com.baidu
www.baidu.com
www.atguigu.com
建議寫(xiě)法:
com.公司名.部門(mén)名.項(xiàng)目名.業(yè)務(wù)模塊名;
com.項(xiàng)目名.業(yè)務(wù)模塊名;
com.atguigu.業(yè)務(wù)模塊名;
1、package關(guān)鍵字
①如果某類(lèi)存在于指定包下,則要求類(lèi)的最上方必須添加包的聲明語(yǔ)句,語(yǔ)法如下:
package 包名;
②包的聲明語(yǔ)句在一個(gè)類(lèi)中只可能出現(xiàn)一次
③位置:最上面
2、import關(guān)鍵字
①跨包訪問(wèn)某類(lèi),必須要求導(dǎo)入該類(lèi)所在的包&&該類(lèi)具有跨包訪問(wèn)權(quán)限
語(yǔ)法:
import 包名.類(lèi)名;或
import 包名.*;
②導(dǎo)入包的語(yǔ)句在一個(gè)類(lèi)中可以出現(xiàn)多次,沒(méi)有順序要求
③位置:package——import——class
④如果想訪問(wèn)多個(gè)包中的同名類(lèi),則要注意不能直接類(lèi)上方添加import導(dǎo)包語(yǔ)句,否則有歧義
可以使用全類(lèi)名限定的方式
6、修飾符

修飾成員:比如屬性和方法
private 私有的 僅僅本類(lèi)中可以訪問(wèn)
缺省 默認(rèn)的 本包中所有類(lèi)都可以訪問(wèn)
protected 受保護(hù)的 本包中所有類(lèi)以及其他包的子類(lèi)可以使用
public 公共的 所有包中的所有類(lèi)都可以訪問(wèn)
-----------------------------------------------------------------------------------------
修飾類(lèi):只能用public和缺省的修飾類(lèi)
缺省 只有本包中才能訪問(wèn)該類(lèi)
public 所有包中都可以訪問(wèn)該類(lèi)