目录
Java作用域
Java中变量类型主要有3种:成员变量,静态变量和局部变量。
成员变量或方法也有4种作用域:
静态修饰符的特点:
静态使用的注意事项。
静态的优缺点
当成员变量被静态修饰后,和非静态成员变量的区别:
方法作用域
块作用域
基本使用:
注意事项和使用细节:
Java作用域
在Java中,变量只能在创建的区域内访问。这称为作用域。
在计算机程序中,声明在不同地方的变量具有不同的作用域,例如局部变量,全局变量等。在java中作用域是有花括号的位置决定的,它决定了其变量名的可见性与生命周期。
Java中变量类型主要有3种:成员变量,静态变量和局部变量。
- 类的成员变量的作用域与类的实例化对象的作用域相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,直到该实例的生命周期结束,成员变量的生命周期才会结束。
- 被static修饰的成员变量被成为静态变量或全局变量,静态变量不依赖特定的实例,而是都有实例共享的,它是在类被加载的时候jvm就会给类的静态变量分配存储空间。
- 局部变量就是方法中定义的变量,其可见性和生命周期是所在的花括号。
成员变量或方法也有4种作用域:
1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
3、缺省
变量或者方法前没有访问修饰符时,可以被所在类访问,可以被同一包内的其他类访问 或者继承。但是不能被其他包访问
4、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
静态修饰符的特点:
static是一个修饰符,用于修饰成员(成员变量和成员函数)
- 静态成员随着类的加载而加载。
- 静态成员优先于对象存在。
- 静态成员被所有对象所共享
- 静态成员多了一个中调用方式,可以被类名直接调用。
静态使用的注意事项。
静态方法只能访问静态成员, 非静态方法既可以访问静态又可以访问非静态。
静态方法中不可以定义this,super关键字。因为this代表是对象。而静态存在时,有可能没有对象。所以静态方法运行时,this是没有任何对象代表的。
简单说,先进内存的数据不可以访问后进内存的数据,可是后进内存数据可以访问先进内存的数据。
主函数是静态的
静态的优缺点
优点: 静态成员多了一种调用方式。可以直接被类名调用 格式 :类名.静态成员。也可以被对象调用。
弊端 : 静态方法只能访问静态成员,出现了访问局限性。
静态修饰的数据对象共享的数据,存放在方法区的静态区中。
非静态的数据,是每一个对象特有数据。存放在对象的所属的堆内存中。
当成员变量被静态修饰后,和非静态成员变量的区别:
- 静态变量也称为类变量,也就是直接可以被类名调用的变量。这个变量是所属于类的。
- 非静态变量成为成员变量,或者实例变量,是被对象调用的,是所属具体对象的。
- 静态变量随着类的加载而加载,也意味着随着类的消失而消失。生命周期最长。
- 实例变量,随着对象的创建而加载,随着对象的消失而消失。按照对象的生命周期而存在。
- 静态变量存储在方法区的静态区中。
- 实例变量存在于对象所属的堆内存中。
- 静态变量数据,被所有对象所共享。
- 实例变量是对象中的特有数据。
方法作用域
直接在方法中声明的变量在方法中的任何位置都可用,位于声明它们的代码行之后:
public class MyClass {
public static void main(String[] args) {
// 此处的代码不能使用 x
int x = 100;
// 这里的代码可以使用 x
System.out.println(x);
}
}
运行结果:
块作用域
代码块是指大括号 {}
之间的所有代码。 在代码块内声明的变量只能由大括号之间的代码访问,大括号在声明变量的那一行之后:
public class MyClass {
public static void main(String[] args) {
// 此处的代码不能使用 x
{ // 这是一个块
// 此处的代码不能使用 x
int x = 100;
// 这里的代码可以使用 x
System.out.println(x);
} // 区块到此结束
// 此处的代码不能使用 x
}
}
运行结果:
代码块可以单独存在,也可以属于 if
, while
或 for
语句。 对于 for
语句,语句本身中声明的变量在块的作用域也可用。
基本使用:
面向对象中,变量作用域 是非常重要的知识点。
1. 在Java编程中 , 主要的变量就是属性(成员变量)和局部变量。
2. 我们说的局部变量一般是指在成员方法中定义的变量。
3. Java中作用域的分类:
全局变量: 也就是属性,作用域为整个类体 Cat类:cry eat 等方法使用属性 局部变量:也就是属性之外的其他变量,作用域为定义它的代码块中。
4. 全局变量可以不赋值,直接使用,因为有默认值,
局部变量必须赋值后,才能使用,因为没有默认值。
下面代码是对上面的解析:
public class VarScope {
public static void main(String[] args) {
}
}
class Cat {
//全局变量: 也就是属性,作用域为整个类体 Cat类 : cry eat 等方法使用属性
//属性在定义时, 可以直接赋值
int age = 10 ;//指定的值是 10
// {
// int num = 100;
// }
//全局变量可以不赋值,直接使用,因为有默认值,
//局部变量必须赋值后,才能使用,因为没有默认值。
double weight;//默认值 0.0,全局变量可以不赋值
public void cy(){
// int num; //因为是局部变量 ,所以必须赋值,这里没有赋值,所以 报错 “ 未初始化变量 num "
int num =1 ;
String address = "北京的猫";
System.out.println("num" +num);
System.out.println("address="+address);
System.out.println("weight="+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中使用属性 num = "+num);//错误
//System.out.println("在eat中使用 cry 的变量 name="+name);//错误
}
}
注意事项和使用细节:
- 属性和局部变量可以重名 ,访问时遵循就近原则。
- 在同一个作用域中,比如在同一个成员方法中, 两个局部变量,不能重名。
- 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的死亡而死亡。局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而死亡。即在一次方法调用过程中。
- 作用域范围不同:
全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用。
- 修饰符不同: 全局变量/属性可以加修饰符 ;局部变量不可以加修饰符;
对注意事项和使用细节的分析:
代码实现:
public class VarScopeDetail {
public static void main(String[] args) {
Person3 p1 = new Person3();
// 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的死亡而死亡。
// 局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而死亡。
// 即在一次方法调用过程中。
p1.say();//当执行 say 方法时,say 方法的局部变量 比如 name ,会创建,当 say 执行完毕后,
//name 局部变量就销毁,但是属性(全局变量)仍然可以使用
T3 t1 = new T3();
t1.test();//第1种跨类访问对象属性的方式
t1.test2(p1);//第2种跨类访问对象属性的方式
}
}
class T3 {
//全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
public void test() {
Person3 p1 = new Person3();
System.out.println(p1.name);//jack
}
//局部变量:只能在本类中对应的方法中使用。
public void test2(Person3 p){
System.out.println(p.name);//jack
}
}
class Person3 {
// 全局变量/属性可以加修饰符 ;局部变量不可以加修饰符;
private int age = 20;
String name = "jack";
public void say() {
// 细节: 属性和局部变量可以重名 ,访问时遵循就近原则
String name = "king";
System.out.println("say() name=" + name);
}
// 在同一个作用域中,比如在同一个成员方法中, 两个局部变量,不能重名
public void hi() {
String address = "北京";
// String address="上海"; //错误,已重复定义变量
String name = "上海";
}
}
结果: