Java基礎之:屬性與區域變數作用域
簡單案例
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);
}
}
