国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

詳解Java面向?qū)ο缶幊讨蟹椒ǖ氖褂?/h1>
2019-11-26 14:33:22
字體:
供稿:網(wǎng)友

一個(gè) Java 方法是為了執(zhí)行某個(gè)操作的一些語句的組合。舉個(gè)例子來說,當(dāng)你調(diào)用 System.out.println 方法時(shí),系統(tǒng)實(shí)際上會(huì)執(zhí)行很多語句才能在控制臺(tái)上輸出信息。

現(xiàn)在你將學(xué)習(xí)怎么創(chuàng)建你自己的方法,他們可以有返回值也可以沒有返回值,可以有參數(shù),也可以沒有參數(shù),重載方法要使用相同的方法名稱,并在程序設(shè)計(jì)中利用抽象的方法。

創(chuàng)建方法
我們用下面的例子來解釋方法的語法:

public static int funcName(int a, int b) { // body}

在這里

  • public static:修飾符
  • int:返回值類型
  • funcName:函數(shù)名稱
  • a,b:形式參數(shù)
  • int a,int b:參數(shù)列

方法也包含過程或函數(shù)。

  • 過程:他們不返回值
  • 函數(shù):他們返回值

方法的定義包含方法頭和方法體。如下所示:

modifier returnType nameOfMethod (Parameter List) { // method body}

以上的語法包括

  • modifier:他定義了方法的訪問類型,它是可選的。
  • returnType:方法是可能返回一個(gè)值的。
  • nameOfMethod:這是方法的名稱。方法簽名包括方法名稱和參數(shù)列表。
  • Parameter List:參數(shù)列表,它是參數(shù)的次序,類型,以及參數(shù)個(gè)數(shù)的集合。這些都是可選的,當(dāng)然方法也可以沒有參數(shù)。
  • 方法體:方法體定義了這個(gè)方法是用來做什么的。

示例

這是上面定義的方法max(),該方法接受兩個(gè)參數(shù)num1和num2返回兩者之間的最大值。

/** the snippet returns the minimum between two numbers */public static int minFunction(int n1, int n2) {  int min;  if (n1 > n2)   min = n2;  else   min = n1;  return min; }

方法調(diào)用
要想使用一個(gè)方法,該方法必須要被調(diào)用。方法調(diào)用有兩種方式,一種是有返回值的,一種是沒有返回值的。

調(diào)用方法很簡(jiǎn)單,當(dāng)程序需要調(diào)用一個(gè)方法時(shí),控制程序轉(zhuǎn)移到被調(diào)用的方法,方法將會(huì)返回兩個(gè)條件給調(diào)用者:

  • 返回一條執(zhí)行語句
  • 執(zhí)行到方法結(jié)束

將返回void的方法作為一個(gè)調(diào)用語句,讓我看下面的例子:

System.out.println("wiki.jikexueyuan.com!");

該方法的返回值可以通過下面的例子被理解:

int result = sum(6, 9);

示例

下面的例子表明了怎么定義方法和怎么調(diào)用它:

public class ExampleMinNumber{  public static void main(String[] args) {   int a = 11;   int b = 6;   int c = minFunction(a, b);   System.out.println("Minimum Value = " + c);  }  /** returns the minimum of two numbers */  public static int minFunction(int n1, int n2) {   int min;   if (n1 > n2)     min = n2;   else     min = n1;   return min;   }}

將會(huì)產(chǎn)生如下的結(jié)果

Minimum value = 6

關(guān)鍵字 void
關(guān)鍵字 void 允許我們創(chuàng)建一個(gè)沒有返回值的方法。這里我們?cè)谙乱粋€(gè)例子中創(chuàng)建一個(gè) void 方法 methodRankPoints。這個(gè)方法是沒有返回值類型的。調(diào)用 void 方法必須聲明 methodRankPoints(255.7); Java 語句以分號(hào)結(jié)束,如下所示:

public class ExampleVoid {  public static void main(String[] args) {   methodRankPoints(255.7);  }  public static void methodRankPoints(double points) {   if (points >= 202.5) {     System.out.println("Rank:A1");   }   else if (points >= 122.4) {     System.out.println("Rank:A2");   }   else {     System.out.println("Rank:A3");   }  }}

這將產(chǎn)生如下的結(jié)果:

Rank:A1

通過值來傳遞參數(shù)
在調(diào)用函數(shù)時(shí)參數(shù)是必須被傳遞的。并且他們的次序必須和他們創(chuàng)建時(shí)的參數(shù)次序是一樣的。參數(shù)可以通過值或引用來傳遞。

通過值傳遞參數(shù)意味著調(diào)用方法的參數(shù),通過參數(shù)值來傳遞給參數(shù)。

示例

下面的程序給出了一個(gè)例子來顯示通過值來傳遞參數(shù)。在調(diào)用方法后參數(shù)值是不會(huì)發(fā)生變化的。

public class swappingExample {  public static void main(String[] args) {   int a = 30;   int b = 45;   System.out.println("Before swapping, a = " +             a + " and b = " + b);   // Invoke the swap method   swapFunction(a, b);   System.out.println("/n**Now, Before and After swapping values will be same here**:");   System.out.println("After swapping, a = " +             a + " and b is " + b);  }  public static void swapFunction(int a, int b) {   System.out.println("Before swapping(Inside), a = " + a              + " b = " + b);   // Swap n1 with n2   int c = a;   a = b;   b = c;   System.out.println("After swapping(Inside), a = " + a              + " b = " + b);  }}

這將產(chǎn)生如下的結(jié)果:

Before swapping, a = 30 and b = 45Before swapping(Inside), a = 30 b = 45After swapping(Inside), a = 45 b = 30**Now, Before and After swapping values will be same here**:After swapping, a = 30 and b is 45

方法的重載
當(dāng)一個(gè)方法有兩個(gè)或者更多的方法,他們的名字一樣但是參數(shù)不同時(shí),就叫做方法的重載。它與覆蓋是不同的。覆蓋是指方法具有相同的名字,類型以及參數(shù)的個(gè)數(shù)。

讓我們來考慮之前的找最小整型數(shù)的例子。如果我們要求尋找浮點(diǎn)型中最小的數(shù)時(shí),我們就需要利用方法的重載來去創(chuàng)建函數(shù)名相同,但參數(shù)不一樣的兩個(gè)或更多的方法。

下面的例子給予解釋:

public class ExampleOverloading{  public static void main(String[] args) {   int a = 11;   int b = 6;   double c = 7.3;   double d = 9.4;   int result1 = minFunction(a, b);   // same function name with different parameters   double result2 = minFunction(c, d);   System.out.println("Minimum Value = " + result1);   System.out.println("Minimum Value = " + result2);  } // for integer  public static int minFunction(int n1, int n2) {   int min;   if (n1 > n2)     min = n2;   else     min = n1;   return min;   }  // for double  public static double minFunction(double n1, double n2) {   double min;   if (n1 > n2)     min = n2;   else     min = n1;   return min;   }}

這將產(chǎn)生如下結(jié)果:

Minimum Value = 6Minimum Value = 7.3

重載方法使程序易讀。在這里,兩種方法名稱相同但參數(shù)不同。產(chǎn)生整型和浮點(diǎn)類型的最小數(shù)作為程序運(yùn)行結(jié)果。

使用命令行參數(shù)
有時(shí)你想要在程序運(yùn)行之前傳遞參數(shù)。這可以通過給 main 函數(shù)傳遞命令行參數(shù)來實(shí)現(xiàn)。

在命令行中,當(dāng)要執(zhí)行程序文件時(shí),一個(gè)命令行參數(shù)是緊接著文件名字后面的出現(xiàn)的。要接受命令行參數(shù)在 Java 程序中是十分容易的。它們傳遞到 main 函數(shù)字符數(shù)組內(nèi)。

示例

下面的例子展示了將所有命令行參數(shù)輸出的程序:

public class CommandLine {  public static void main(String args[]){    for(int i=0; i<args.length; i++){     System.out.println("args[" + i + "]: " +                      args[i]);   }  }}

通過以下方法來執(zhí)行該程序:

java CommandLine this is a command line 200 -100

這將產(chǎn)生如下的結(jié)果:

args[0]: thisargs[1]: isargs[2]: aargs[3]: commandargs[4]: lineargs[5]: 200args[6]: -100

構(gòu)造函數(shù)
這是一個(gè)簡(jiǎn)單的使用構(gòu)造函數(shù)的例子:

// A simple constructor.class MyClass {  int x;  // Following is the constructor  MyClass() {   x = 10;  }}

你可以通過以下方法來調(diào)用構(gòu)造函數(shù)來實(shí)例化一個(gè)對(duì)象:

public class ConsDemo {  public static void main(String args[]) {   MyClass t1 = new MyClass();   MyClass t2 = new MyClass();   System.out.println(t1.x + " " + t2.x);  }}

通常,你將需要用構(gòu)造函數(shù)來接受一個(gè)或多個(gè)參數(shù)。參數(shù)的傳遞和以上介紹的普通方法的參數(shù)傳遞是一樣的,就是在構(gòu)造函數(shù)的名字后面列出參數(shù)列表。

示例

這是一個(gè)簡(jiǎn)單的使用構(gòu)造函數(shù)的例子:

// A simple constructor.class MyClass {  int x;  // Following is the constructor  MyClass(int i ) {   x = i;  }}

你可以通過以下方法來調(diào)用構(gòu)造函數(shù)來實(shí)例化一個(gè)對(duì)象:

public class ConsDemo {  public static void main(String args[]) {   MyClass t1 = new MyClass( 10 );   MyClass t2 = new MyClass( 20 );   System.out.println(t1.x + " " + t2.x);  }}

這將產(chǎn)生如下的結(jié)果:

10 20

可變長參數(shù)
JDK1.5 能夠允許你傳遞可變長的同一類型的參數(shù)。用如下方法進(jìn)行聲明:

typeName... parameterName

方法聲明時(shí),你要在省略號(hào)前明確參數(shù)類型,并且只能有一個(gè)可變長參數(shù),并且可變長參數(shù)必須是所有參數(shù)的最后一個(gè)。

示例

public class VarargsDemo {  public static void main(String args[]) {   // Call method with variable args    printMax(34, 3, 3, 2, 56.5);   printMax(new double[]{1, 2, 3});  }  public static void printMax( double... numbers) {  if (numbers.length == 0) {   System.out.println("No argument passed");   return;  }  double result = numbers[0];  for (int i = 1; i < numbers.length; i++)   if (numbers[i] > result)   result = numbers[i];   System.out.println("The max value is " + result);  }}

這將產(chǎn)生如下的結(jié)果:

The max value is 56.5The max value is 3.0

finalize() 方法
你可以定義一個(gè)方法,僅在被垃圾收集器銷毀之前才會(huì)被調(diào)用。這個(gè)方法叫做 finalize() 方法,它也可以用來確保一個(gè)對(duì)象被干凈清除了。

舉個(gè)例子,你也許用 finalize() 來確保被一個(gè)對(duì)象打開的文件已經(jīng)關(guān)閉了。

為了給類添加一個(gè)終結(jié)器,你只需定義 finalize() 方法。Java要回收該類的一個(gè)對(duì)象時(shí),會(huì)調(diào)用該方法。

在 finalize() 方法中,你將指定一些必須在對(duì)象銷毀之前要做的行為。

finalize()方法一般是如下形似:

protected void finalize( ){  // finalization code here}

這里,關(guān)鍵字 protected 是為了保證在類外的代碼不能訪問 finalize() 方法。

這意味著你不能知道 finalize() 什么時(shí)候執(zhí)行。舉個(gè)例子,如果你的程序在垃圾收集器發(fā)生之前就結(jié)束了,finalize() 方法將不會(huì)被執(zhí)行。

泛型方法:
java泛型方法在方法返回值是容器類對(duì)象時(shí)廣泛使用。

public static List<T> find(Class<T> clazz,String userId){   ....}

一般來說編寫java泛型方法時(shí),返回值類型和至少一個(gè)參數(shù)類型應(yīng)該是泛型,而且類型應(yīng)該是一致的,如果只有返回值類型或參數(shù)類型之一使用了泛型,這個(gè)泛型方法的使用就大大的限制了,基本限制到跟不用泛型一樣的程度。

下面主要介紹兩種十分相似的java泛型方法的使用以及它們之間的區(qū)別。
第一種:

  public static <T extends CommonService> T getService(Class<T> clazz) {    T service = (T) serviceMap.get(clazz.getName());    if (service == null) {      service = (T) ServiceLocator.getService(clazz.getName());      serviceMap.put(clazz.getName(), service);    }    return service;  }

第二種:

  public static <T> T getService(Class<? extends CommonService> clazz) {    T service = (T) serviceMap.get(clazz.getName());    if (service == null) {      service = (T) ServiceLocator.getService(clazz.getName());      serviceMap.put(clazz.getName(), service);    }    return service;  }

下面是泛型方法所在的類:

public abstract class CommonService {  private static HashMap<String, CommonService> serviceMap = new HashMap<String, CommonService>();  //這里是泛型方法定義  .  .  .}

這兩個(gè)泛型方法只有方法的簽名不一樣,方法體完全相同,那它們有什么不一樣呢?
我們來使用一下它們,就知道它們的區(qū)別了。
對(duì)第一種泛型方法使用:

public class Main {  public static void main(String[] args) {    NoticeService noticeService=CommonService.getService(NoticeService.class);//正確的使用第一種泛型方法,不會(huì)出現(xiàn)編譯錯(cuò)誤。    NoticeService noticeService=CommonService.getService(UserService.class);//不正確的使用第一種泛型方法,會(huì)出現(xiàn)編譯錯(cuò)誤。      }}

對(duì)第二種泛型方法使用:

public class Main {  public static void main(String[] args) {    NoticeService noticeService=CommonService.getService(NoticeService.class);//正確的使用第二種泛型方法,不會(huì)出現(xiàn)編譯錯(cuò)誤,邏輯也正確,運(yùn)行時(shí)不會(huì)出現(xiàn)異常。    NoticeService noticeService=CommonService.getService(UserService.class);//不正確的使用第二種泛型方法,不會(huì)出現(xiàn)編譯錯(cuò)誤,但邏輯不正確,運(yùn)行時(shí)會(huì)出現(xiàn)異常,危險(xiǎn)!   }}

現(xiàn)在知道了這兩種極其相似的泛型方法的區(qū)別了吧?

  • 第一種泛型方法:返回值和參數(shù)值的類型是一致,推薦使用;
  • 第二種泛型方法:返回值和參數(shù)值的類型不是一致,請(qǐng)謹(jǐn)慎或避免使用。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

主站蜘蛛池模板: 同德县| 靖西县| 平凉市| 金塔县| 遵化市| 石河子市| 安岳县| 城步| 米易县| 济宁市| 安新县| 汉沽区| 昂仁县| 荔波县| 孟连| 柳州市| 徐水县| 阜新市| 额尔古纳市| 巴彦县| 图木舒克市| 页游| 瑞丽市| 赣榆县| 会理县| 化德县| 浦北县| 天祝| 中超| 鄂托克旗| 临沭县| 射阳县| 于田县| 贵阳市| 阳谷县| 哈尔滨市| 乌鲁木齐市| 丹棱县| 刚察县| 萍乡市| 巢湖市|