簡單案例
class A{ int age; //屬性 public void print(){ System.out.println(age); String name = "小范"; System.out.println(name); } public void show(){ age = 10; // name = "小黃"; //這條語句是錯誤的,因為name的作用域僅在 print() 方法體中 } }
由上面案例我們可以看到,
全局變量:也就是屬性,作用域為整個類。例如 A類中的 age
局部變量:也就是除了屬性之外的其他變量,作用域為定義它的代碼塊中
特別注意:全局變量可以不賦值,直接使用,因為有默認值。局部變量必須賦值后,才能使用,因為沒有默認值。
細節說明
1) 屬性全局變量和局部變量可以重名,訪問時遵循就近原則。
例如:
class A{ int age = 20; public void show(){ int age = 10; System.out.println(age); // 這里輸出10 } }
2) 在同一個作用域中,比如在同一個成員方法中,兩個局部變量,不能重名。
例如:
class A{ public void show(){ int age = 10; int age = 20; //不允許 } }
3) 全局變量,存儲在堆中。局部變量,存儲在棧中。
4) 全局變量,生命周期較長,伴隨着對象的創建而創建,伴隨着對象的死亡而死亡。
局部變量,生命周期較短,伴隨着它的代碼塊的執行而創建,伴隨着代碼塊的結束而死亡。即在一次方法調用過程中。【每調用一次方法,就開一個方法棧,這個是由操作系統決定的】
5) 作用域不同 全局變量:可以被本類使用,或其他類使用(通過對象調用) 局部變量:只能在本類中對應的方法中的作用域內使用
6) 修飾符不同 全局變量/屬性可以加修飾符 局部變量不可以加修飾符
7) 特別說明: 如果我們在方法中,是new 對象,比如 Person p = new Person(); p在方法中, 對象數據空間在堆中.., 如果p 沒有返回,則方法結束后,對象成為垃圾,被回收,如果返回給 其它方法,比如main , 則可以繼續使用。
Java自定義類步驟總結(OOP(oriented[面向] object[對象] programming[編程]))
/** 1) 一個景區根據游人的年齡收取不同價格的門票。 2) 請編寫游人類,根據年齡段決定能夠購買的門票價格並輸出 3) 規則:年齡>18 , 門票為20元,其它情況免費。 4) 可以循環從控制台輸入名字和年齡,打印門票收費情況, 如果名字輸入 n ,則退出程序。 */ import java.util.Scanner; public class OOPClassWork { public static void main(String[] args){ Scanner input = new Scanner(System.in); Person p = new Person(); do{ System.out.println("\n請輸入姓名(輸入\"n\"退出程序):"); p.name = input.next(); if(!"n".equalsIgnoreCase(p.name)){ //當姓名輸入n的時候 直接退出 System.out.println("請輸入年齡:"); p.age = input.nextInt(); p.money(p.age); //計算門票 p.print(); } }while(!"n".equalsIgnoreCase(p.name)); //只要名字不是n 就一直循環的輸入 } } class Person { //OOP 編程思想:一個方法 盡量只完成一個動作,以便后期修改方法。 String name; int age; int payMoney; //韓老師思路 //年齡>18 , 門票為20元,其它情況免費。 public void money(int age){ if(age > 18){ payMoney = 20; }else{ payMoney = 0 ; } } //輸出 public void print(){ // 自己的思路 沒有定義payMoney屬性 // System.out.printf("name:%S,age:%d,應付門票費:%d",name,age,money(age)); //韓老師思路 System.out.printf("%s的年齡是%d,應付門票費%d元。",name,age,payMoney); } }