橘子识别java_Java方法
Java 方法
什么是方法呢?
Java方法是語句的集合,它們在一起執行一個功能。
方法是解決一類問題的步驟的有序組合
方法包含于類或對象中
方法在程序中被創建,在其他地方被引用
方法的定義
一般情況下,定義一個方法包含以下語法:
修飾符 返回值類型 方法名(參數類型 參數名){
...
方法體
...
return 返回值;
}
方法包含一個方法頭和一個方法體。下面是一個方法的所有部分:
修飾符:修飾符,這是可選的,告訴編譯器如何調用該方法。定義了該方法的訪問類型。可以有多個
返回值類型 :方法可能會返回值。returnValueType 是方法返回值的數據類型。有些方法執行所需的操作,但沒有返回值。在這種情況下,returnValueType 是關鍵字void。
方法名:是方法的實際名稱。方法名和參數表共同構成方法簽名。
參數類型:參數像是一個占位符。當方法被調用時,傳遞值給參數。這個值被稱為實參或變量。參數列表是指方法的參數類型、順序和參數的個數。參數是可選的,方法可以不包含任何參數。
方法體:方法體包含具體的語句,定義該方法的功能。
修飾符
訪問修飾符->訪問權限
Java中,可以使用訪問控制符來保護對類、變量、方法和構造方法的訪問。Java 支持 4 種不同的訪問權限。
default (即默認,什么也不寫): 在同一包內可見,不使用任何修飾符。使用對象:類、接口、變量、方法。
private : 在同一類內可見。使用對象:變量、方法。 注意:不能修飾類(外部類)
public : 對所有類可見。使用對象:類、接口、變量、方法
protected : 對同一包內的類和所有子類可見。使用對象:變量、方法。 注意:不能修飾類(外部類)。
修飾符
當前類
同一包內
子孫類(同一包)
子孫類(不同包)
其他包
public
Y
Y
Y
Y
Y
protected
Y
Y
Y
Y/N(說明)
N
default
Y
Y
Y
N
N
private
Y
N
N
N
N
非訪問修飾符
static 修飾符,用來修飾類方法和類變量。
final 修飾符,用來修飾類、方法和變量,
final 修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變量為常量,是不可修改的。
abstract 修飾符,用來創建抽象類和抽象方法。
synchronized 和 volatile 修飾符,主要用于線程的編程。
返回值類型
void 關鍵字
本節說明如何聲明和調用一個 void 方法。
下面的例子聲明了一個名為 print 的方法,并且調用它來打印給定的分數。
public class TestVoidMethod {
public static void main(String[] args) {
print();
}
public static void print() {
System.out.println("不返回值");
}
}
這里print方法是一個void類型方法,它不返回值。
一個void方法的調用一定是一個語句。
所以,它被在main方法第三行以語句形式調用。
就像任何以分號結束的語句一樣。
方法的命名規則
1.方法的名字的第一個單詞應以小寫字母作為開頭,后面的單詞則用大寫字母開頭寫,不使用連接符。小駝峰命名法 ,例如:addPerson。
2.下劃線可能出現在 JUnit 測試方法名稱中用以分隔名稱的邏輯組件。一個典型的模式是:test_,例如 testPop_emptyStack。
參數列表
(參數類型 參數名)
可變參數
JDK 1.5 開始,Java支持傳遞同類型的可變參數給一個方法。
方法的可變參數的聲明如下所示:
typeName... parameterName
public class Changeable {
public static void main(String[] args) {
changeableValue(0,1,2,3,1,2,3);
}
public static void changeableValue(int... i) {
for (int o : i) {
System.out.println(o);
}
}
}
方法調用
Java 支持兩種調用方法的方式,根據方法是否返回值來選擇。
當程序調用一個方法時,程序的控制權交給了被調用的方法。
當被調用方法的返回語句執行或者到達方法體閉括號時候交還控制權給程序。
當方法返回一個值的時候,方法調用通常被當做一個值。例如:
int larger = max(30, 40);
如果方法返回值是void,方法調用一定是一條語句。例如,方法println返回void。
靜態方法
static 關鍵字用來聲明獨立于對象的靜態方法。靜態方法與類共存,對象還未實例化時就已經存在。
靜態方法不能使用類的非靜態變量,也不能調用非靜態方法(存在的東西 不能調用 不存在的東西)
靜態方法推薦以 類名.方法名 調用。
非靜態方法
無static修飾,需要實例化對象,才能調用方法。
public class StaticTest {
public static void main(String[] args) {
say();
}
public static void say() {
System.out.println("靜態方法類加載時就已經存在,獨立于對象");
//nonStatic();// 調用不存在的方法!報錯
new StaticTest().nonStatic(); // 需要創建對象才產生非靜態方法!
}
public void nonStatic(){
System.out.println("這是個非靜態方法,需要對象實例化才存在");
// say(); // 調用已存在的方法,沒問題
}
}
以上兩者本質上的區別是:
靜態方法是在類中使用staitc修飾的方法,在類定義的時候已經被裝載和分配。
而非靜態方法是不加static關鍵字的方法,在類定義時沒有占用內存,只有在類被實例化成對象時,對象調用該方法才被分配內存。
實際參數
傳遞給被調用方法的值,預先創建并賦予確定值。
形式參數
用來接收調用該方法時傳遞的參數。只有在被調用的時候才分配內存空間,一旦調用結束,就釋放內存空間。因此僅僅在方法內有效。
public class Add {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(add(a, b));// 傳入數據的變量叫實參
}
public static int add(int a, int b) { // 接收數據的變量叫形參
return a + b;
}
}
實參和形參的類型要對應!!
通過值傳遞參數
調用一個方法時候需要提供參數,你必須按照參數列表指定的順序提供。
值傳遞: 形參是實參的拷貝,改變形參的值并不會影響外部實參的值。
如下:
public class Value {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("交換之前:a="+a+",b="+b);
swop(a,b);
System.out.println("交換之后:a="+a+",b="+b);
}
private static void swop(int x, int y) {
System.out.println("swop方法內交換前:x="+x+",y="+y);
int temp = x;
x = y;
y = temp;
System.out.println("swop方法內交換后:x="+x+",y="+y);
}
}
結果
交換之前:a=1,b=2
swop方法內交換前:x=1,y=2
swop方法內交換后:x=2,y=1
交換之后:a=1,b=2
可以發現x是復制a的值,y是復制b的值。x,y交換并不影響a,b的值
通過引用傳遞參數
在調用函數時將實際參數的地址直接傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數。
案例1:
public class Quote2 {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("hello");
System.out.println(stringBuffer);
change(stringBuffer);
System.out.println(stringBuffer);
}
private static void change(StringBuffer s) {
s.append(" world");
}
}
結果
hello
hello world
案例2:
public class Quote {
public static void main(String[] args) {
String str = "hello";
System.out.println(str);
change(str);
System.out.println(str);
}
private static void change(String s) {
s = "hello world";
}
}
結果
hello
hello
通過命令行傳參
有時候你希望運行一個程序時候再傳遞給它消息。這要靠傳遞命令行參數給main()函數實現。
命令行參數是在執行程序時候緊跟在程序名字后面的信息。
實例
下面的程序打印所有的命令行參數:
public class Command {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}
如果代碼包含包名,需要到代碼的具體路徑下運行javac生成class文件。
然后回到src目錄通過包名.類名執行程序。
構造方法
當一個對象被創建時候,構造方法用來初始化該對象。構造方法和它所在類的名字相同,但構造方法沒有返回值。
通常會使用構造方法給一個類的實例變量賦初值,或者執行其它必要的步驟來創建一個完整的對象。
不管你是否自定義構造方法,所有的類都有構造方法,因為Java自動提供了一個默認構造方法,
默認構造方法的訪問修改符和類的訪問修改符相同(類為 public,構造函數也為 public;類改為 protected,構造函數也改為 protected)。
一旦你定義了自己的構造方法,默認構造方法就會失效。
方法的重載
重載:在一個類中,有相同的方法名,但形參列表不同的方法
規則:
方法名必須相同
參數列表必須不同(個數、類型、順序)
方法的返回類型可同可不同
不能僅僅依據修飾符或者返回類型的不同來重載方法
Java編譯器根據方法簽名判斷哪個方法應該被調用。
*遞歸
自己調用自己的方法!
遞歸結構包含兩個部分:
遞歸頭:什么時候不調用自身方法。如果沒有頭,將陷入死循環。
遞歸體:什么時候需要調用自身方法。
/**
* 遞歸練習
*/
public class Recursion {
public static void main(String[] args) {
int n = 10; // 求n的階層
System.out.println(f(n));
}
public static int f(int n) {
if (n <= 1) {
return 1;
}
return n * f(n - 1);
}
}
方法的優點
使程序變得更簡短而清晰。
有利于程序維護。
可以提高程序開發的效率。
提高了代碼的重用性。
設計方法的原則:方法的本意是功能塊,就是實現某個功能的語句塊的集合。我們設計方法的時候,最好保持方法的原子性。
問題
區別
影響
值傳遞
會創建副本
改變形參不影響實參
引用傳遞
不會創建副本
改變形參會影響實參
首先明確兩點 java 中不管是值對象還是引用對象都是值傳遞,在其他方法里面改變引用類型的值肯定是通過引用改變的。
當傳遞引用對象的時候傳遞的是復制過的對象句柄(引用),注意這個引用是復制過的,也就是說又在內存中復制了一份句柄,
這時候有兩個句柄是指向同一個對象的,所以你改變這個句柄對應空間的數據會影響外部的變量的,
雖然是復制的但是引用指向的是同一個地址,當你把這個句柄指向其他對象的引用時并不會改變原對象,
因為你拿到的句柄是復制過的引用。總結java中的句柄(引用)是復制過的,所以說java只有值傳遞 。
總結
無論是值傳遞還是引用傳遞,其實都是一種求值策略(Evaluation strategy)。
在求值策略中,還有一種叫做按共享傳遞(call by sharing)。其實Java中的參數傳遞嚴格意義上說應該是按共享傳遞。
按共享傳遞,是指在調用函數時,傳遞給函數的是實參的地址的拷貝(如果實參在棧中,則直接拷貝該值)。在函數內部對參數進行操作時,
需要先拷貝的地址尋找到具體的值,再進行操作。如果該值在棧中,那么因為是直接拷貝的值,所以函數內部對參數進行操作不會對外部變
量產生影響。如果原來拷貝的是原值在堆中的地址,那么需要先根據該地址找到堆中對應的位置,再進行操作。因為傳遞的是地址的拷貝所以
函數內對值的操作對外部變量是可見的。
簡單點說,Java中的傳遞,是值傳遞,而這個值,實際上是對象的引用。
而按共享傳遞其實只是按值傳遞的一個特例罷了。所以我們可以說Java的傳遞是按共享傳遞,或者說Java中的傳遞是值傳遞。
案例2:
public class Quote {
public static void main(String[] args) {
String str = "hello";
System.out.println(str);
change(str);
System.out.println(str);
}
private static void change(String s) {
s = "hello world";
}
}
結果
hello
hello
解釋這段代碼:形參 s 獲取了 實參str 拷貝的地址,意味著有兩個變量指向“hello”字符串。而String類型是不可變的,
s 修改字符串的值,其實是創建了一個新的字符串“hello world”,再指向它。這時候str還是指向原來的“hello”,所以打印的結果不變。
總結
以上是生活随笔為你收集整理的橘子识别java_Java方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 珍视平凡的陪伴
- 下一篇: 英语计算机手抄报图片大全,五年级英语手抄