Java中的作用域

2023-11-03

目录

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

  }
}

运行结果:

代码块可以单独存在,也可以属于 ifwhile 或 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 = "上海";

    }
}

结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的作用域 的相关文章