簡單案例
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);
}
}
