首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

【Java 每日一題】20161018:參數傳遞與實例變量遮蔽的輸出陷阱

     編輯:Java 綜合教學

題目代碼

package Oct2016;
public class Ques1018 {
    public static void main(String[] args){
        Obj obj01 = new Obj("18");
        Obj obj02 = new Obj("19");
        obj01.printAge(obj02);
    }
}

class Obj{
    private String age;
    public Obj(String age){ this.age = age; }
    public void printAge(Obj obj){
        String age = obj.age;      // ① 區域變量 age
        System.out.println("年齡是:" + age);
    }
}

問題

主程序輸出結果是什麼?

選項分析

  • A. 年齡是:18
  • B. 年齡是:19
  • C. 編譯錯誤
  • D. 運行異常

詳細解析

1. 對象創建與引用

  • obj01 持有 age="18" 的對象引用
  • obj02 持有 age="19" 的對象引用

2. 方法調用 obj01.printAge(obj02)

  • 進入 printAge,參數 obj 指向 obj02 所指對象
  • 關鍵點:方法內 String age = obj.age; 定義了一個區域變量 age,遮蔽 了實例變量 this.age
  • obj.age 訪問的是參數對象(即 obj02)的實例變量,值為 "19"
  • 區域變量 age 賦值為 "19"

3. 輸出

年齡是:19

正確答案:B

核心知識點總結

概念說明
Java 參數傳遞基本類型傳值,引用類型傳引用的副本(均為值傳遞)
變量遮蔽區域變量與實例變量同名時,區域變量優先,實例變量需用 this.age 訪問
訪問權限同類內方法可直接訪問 private 實例變量(如 obj.age)

易錯點提醒

  1. 誤以為打印的是調用者 obj01 的 age(18) → 忽略參數對象是 obj02
  2. 誤以為區域變量 age 會讀取 this.age → 忽略遮蔽規則
  3. 以為 private 禁止跨對象訪問 → private 是類級可見,同類不同實例互訪合法

延伸練習

// 修改點:區域變量改名
public void printAge(Obj obj){
    String otherAge = obj.age;
    System.out.println("年齡是:" + otherAge + ", 我自己的年齡:" + this.age);
}
// obj01.printAge(obj02) 輸出:年齡是:19, 我自己的年齡:18

每日一題,堅持精進。關注公眾號「Java每日一題」獲取更多經典面試題與核心知識點解析。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved