1. 程式人生 > 其它 >六, 面向物件的思想(二)

六, 面向物件的思想(二)

六, 面向物件的思想(二)

方法的過載

java 中允許同一個類中,多個同名方法的存在,但要求 形參列

示例:

public static void main(String[] args) {
// System.out.println(100);
// System.out.println("hello,world");
// System.out.println('h');
// System.out.println(1.1);
// System.out.println(true);
//
MyCalculator mc = new MyCalculator();
System.out.println(mc.calculate(1, 2));
System.out.println(mc.calculate(1.1, 2));
System.out.println(mc.calculate(1, 2.1));
}
}
class MyCalculator {
//下面的四個 calculate 方法構成了過載
//兩個整數的和
public int calculate(int n1, int n2) {
System.out.println("calculate(int n1, int n2) 被調return n1 + n2;
}
//沒有構成方法過載, 仍然是錯誤的,因為是方法的重複定義
// public void calculate(int n1, int n2) {
// System.out.println("calculate(int n1, int n2) 被呼叫");
// int res = n1 + n2;
// }
//看看下面是否構成過載, 沒有構成,而是方法的重複定義,就錯了
// public int calculate(int a1, int a2) {
// System.out.println("calculate(int n1, int n2) 被呼叫");
// return a1 + a2;
// }
//一個整數,一個 double 的和
public double calculate(int n1, double n2) {
return n1 + n2;
}
//一個 double ,一個 Int 和
public double calculate(double n1, int n2) {
System.out.println("calculate(double n1, int n2) 被呼叫..");
return n1 + n2;
}
//三個 int 的和
public int calculate(int n1, int n2, int n3){
return n1 + n2 + n2;
}
過載的好處

1) 減輕了起名的麻煩

2) 減輕了記名的麻煩

過載注意的事項

1)方法名:相同

2)返回值:無要求

3)形參列表:必須不同(形參型別或個數或順序,至少有一樣不同,引數名無要求)

可變引數

java 允許將同一個類中多個同名同功能但引數個數不同的方法,封裝成一個方法。

基本語法:

訪問修飾符 返回型別 方法名(資料型別... 形參名) {

}

示例:

class HspMethod {
//可以計算 2 個數的和,3 個數的和 , 4. 5, 。。
//可以使用方法過載
// public int sum(int n1, int n2) {//2 個數的和
// return n1 + n2;
// }
// public int sum(int n1, int n2, int n3) {//3 個數的和
// return n1 + n2 + n3;
// }
// public int sum(int n1, int n2, int n3, int n4) {//4 個數的和
// return n1 + n2 + n3 + n4;
// }
//..... //上面的三個方法名稱相同,功能相同, 引數個數不同-> 使用可變引數優化
//1. int... 表示接受的是可變引數,型別是 int ,即可以接收多個 int(0-多)
//2. 使用可變引數時,可以當做陣列來使用 即 nums 可以當做陣列
//3. 遍歷 nums 求和即可
public int sum(int... nums) {
//System.out.println("接收的引數個數=" + nums.length);
int res = 0;
for(int i = 0; i < nums.length; i++) {
res += nums[i];
}
return res;
}

可變引數使用注意事項:

1)可變引數的實參可以有0個或任意個

2)可變引數的實參可以為陣列和引用型別

3)可變引數的本質就是陣列

4)可變引數可以和普通的引數一起放在形參列表,但必須保證可變引數在最後

作用域

1.java程式設計中變數就是屬性(成員變數)和區域性變數

2.我們所說的區域性變數就是一般指在成員方法中定義的變數。

3.java中的作用域的分類

全域性變數:也就是屬性,作用域為整個類體

區域性變數:也就是除了屬性之外的其他變數,作用域為定義它的程式碼塊

4.全域性變數(屬性)可以不賦值,直接使用,因為有預設值,區域性變數必須賦值後才能使用,因為沒有預設值。

示例:

class Cat {
//全域性變數:也就是屬性,作用域為整個類體 Cat 類:cry eat 等方法使用屬性
//屬性在定義時,可以直接賦值
int age = 10; //指定的值是 10
//全域性變數(屬性)可以不賦值,直接使用,因為有預設值,
double weight; //預設值是 0.0
public void hi() {
//區域性變數必須賦值後,才能使用,因為沒有預設值
int num = 1;
String address = "北京的貓";
System.out.println("num=" + num);
System.out.println("address=" + address);
System.out.println("weight=" + weight);//屬性
}
public void cry() {
//1. 區域性變數一般是指在成員方法中定義的變數
//2. n 和 name 就是區域性變數
//3. n 和 name 的作用域在 cry 方法中
int n = 10;
String name = "jack";
System.out.println("在 cry 中使用屬性 age=" + age);
}
public void eat() {
System.out.println("在 eat 中使用屬性 age=" + age);
//System.out.println("在 eat 中使用 cry 的變數 name=" + name);//錯誤
}
}
作用域的注意事項

1.屬性和區域性變數可以重名,訪問時遵循就近原則。

2.同一個作用域中,比如在同一個成員方法中,兩個區域性變數,不能重名。

3.屬性的生命週期較長,伴隨著物件的建立而建立,伴隨著物件的銷燬而銷燬。區域性變數,生命週期較短,伴隨著它的程式碼塊的執行而建立,伴隨著程式碼塊的結束而銷燬。

4.作用域範圍不同

全域性變數/屬性:可以被本類使用,或者其他類使用。

區域性變數:只能在本類中對應的方法中使用

5.修飾符不同

全域性變數/屬性可以加修飾符

區域性變數不可以加修飾符

構造方法/構造器

基本語法

[修飾符] 方法名(形參列表){

方法體;

}

說明:

1)構造器可以預設,也可以是public,protected,private

2)構造器沒有返回值

3)方法名和類名必須一樣

4)引數列表和成員方法一樣的規則

5)構造器的呼叫,由系統完成

構造方法又叫構造器(constructor),是類的一種特殊的方法,它的主要作用是完成對新物件的初始化。它有幾個特點:

1) 方法名和類名相同

2) 沒有返回值

3) 在建立物件時,系統會自動的呼叫該類的構造器完成物件的初始化

注意事項

1.一個類可以定義多個不同的構造器,即構造器過載。

2.構造器名和類名要相同。

3.構造器沒有返回值。

4.構造器是完成物件的初始化,並不是建立物件。

5.在建立物件時,系統自動的呼叫該類的構造方法

6.如果自己沒有定義構造器,系統會自動給類生成一個預設無參構造器(也叫預設構造器)。

7.一旦定義了自己的構造器,預設的構造器就覆蓋了,不能再使用預設的無參構造器,除非自己顯示定義一個無參構造。

物件建立的流程分析

this關鍵字

java虛擬機器會給每一個物件分配this,代表當前物件。

this的注意事項

1)this關鍵字可以用來訪問本類的屬性,方法,構造器

2)this 用於區分當前類的屬性和區域性變數

3)訪問成員方法的語法:this.方法名(引數列表);

4)訪問構造器語法:this(引數列表); 注意只能在構造器中使用(即只能在構造器中訪問另外一個構造器, 必須放在第一 條語句)

5)this 不能在類定義的外部使用,只能在類定義的方法中使用。