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中的作用域 的相关文章

随机推荐

  • 03-分布式文件系统HDFS

    目录 一 HDFS简介 1 什么是HDFS 2 优缺点 2 1 优点 2 2 缺点 二 HDFS原理 1 系统架构 1 1 角色分工 1 2 设计思想 2 数据存储 2 1 文件存储 2 2 元数据存储 3 读写操作 3 1 写操作 3 2
  • 智慧城市篇

    智慧城市篇 数字孪生智慧排水管网管理平台https mp weixin qq com s ZDgmKqHRztYk2ehBDbi3AA 2022年3月1日 住房和城乡建设部印发了 十四五 住房和城乡建设科技发展规划 提出关于实现城市基础设施
  • Mybatis中的resultType和resultMap

    一 概述 MyBatis中在查询进行select映射的时候 返回类型可以用resultType 也可以用resultMap resultType是直接表示返回类型的 而resultMap则是对外部ResultMap的引用 但是resultT
  • android组件悬浮,Andorid 任意界面悬浮窗,实现悬浮窗如此简单

    特性 1 支持拖动 提供自动贴边等动画 2 内部自动进行权限申请操作 3 可自由指定要显示悬浮窗的界面 4 应用退到后台时 悬浮窗会自动隐藏 5 位置不可变的悬浮窗无需权限申请 6 位置及宽高可设置百分比值 轻松适配各分辨率 7 链式调用
  • [Python / PyTorch] debug backward()

    问题描述 在自定义Loss的中 其backward 函数不支持在PyCharm中进行断点调试 因此需要以其他方式进行断点调试 解决方案 参考 Is there a way to debug the backward method of Fu
  • SQLI-Labs(3)8-14关【布尔盲注和时间盲注】

    目录 第八关 第九关 第十关 第十一关 第十二关 第十三关 第十四关 第八关 我们用测试语句来测试是否为注入点 从上图中得知存在注入点 那么接下来就是爆列 一共有三列 接下来用union select 和报错注入都试一下发现没有回显点 那么
  • thinkPHP使用PHPExcel实现导入导出

    目录 一 使用composer安装PHPExcel 二 使用PHPExcel 1 导入Excel文件 2 导出数据 3 导出方法使用demo 效果图 一 使用composer安装PHPExcel 安装命令 composer require
  • 常见的PLC通讯协议有哪些?

    PLC 可编程逻辑控制器 通讯方式有多种 以下是一些常见的通讯方式 串口通信 使用串行接口 如RS232 RS485等 进行通信 常用于与外部设备进行简单的数据传输 以太网通信 通过以太网接口进行通信 可以实现较高的数据传输速率和远程连接
  • 键值数据库PebblesDB读后感

    键值数据库PebblesDB读后感 在LevelDB RocksDB这种分层思路上 PebblesDB提出了一种减少写放大的思路 下面学习并总结 所述以论文为基础 也有个人 观点 客观论述请看原文 虽然LSM的写放大最近被研究很多 但是就写
  • 关于log4j

    log4j 在强调可重用组件开发的今天 除了自己从头到尾开发一个可重用的日志操作类外 Apache为我们提供了一个强有力的日志操作包 Log4j 官方站点 http logging apache org log4j Log4j是Apache
  • linux拒绝更改密码,【Linux】解决SSH服务拒绝密码

    xShell连接Linux服务器提示密码错误 1 检查虚拟机SSH服务是否开启 service sshd status 如果没有开启 请执行service sshd start启动该服务 或者通过service sshd restart重启
  • web3.0 nft 是什么? nft的意义是什么?

    英国一名12岁的男孩本雅明 他在暑假期间画了一系列的画作 并在网上以数字藏品的形式进行出售 不到9小时就全部售完 赚取的虚拟货币价值相当于250万人民币 这些画算不上很高端的艺术佳作 而是由密密麻麻的像素组成各种形状各异的鲸鱼 每条鲸鱼都有
  • Vulhub漏洞靶场搭建和使用

    今天继续给大家介绍渗透测试相关知识 本文主要内容是Vulhub漏洞靶场搭建和使用 免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重后果自负 再次强调 严禁对未授权设备进行渗透测试 一 Vulhub漏
  • 视频播放器测试点

    视频播放器测试点 在负责XX项目组的测试中 接触了好多的关于播放器的测试 基于这些 再结合我测试过程中遇到的问题整理的测试点分别从以下几个方面进行 功能测试 视频资源可以正常获取 不管是服务器返回还是后台添加等 视频的封面图 页面UI等正常
  • 【转载】关于在keil5的time environment没有StdPeriph Drivers(标准库)但是又想使用库函数的解决办法

    关于在keil5的time environment没有StdPeriph Drivers 标准库 但是又想使用库函数的解决办法 本人刚刚接触keil5 遇到了一些问题 希望我的方法能帮到大家 作者本人使用的是芯片是stm32f407VET6
  • SpringBoot配置动态定时任务

    1 配置ScheduledTask 主要是实现SchedulingConfigurer 动态传入cron package com hzl boot config import lombok Data import org springfra
  • Spring Cloud OAuth2(一) 搭建授权服务

    本文内容主要为spring cloud 授权服务的搭建 采用jwt认证 GitHub 地址 https github com fp2952 spring cloud base tree master auth center auth cen
  • [USACO13DEC]Optimal Milking G【线段树维护最大独立集】

    题目链接 P3097 USACO13DEC Optimal Milking G 很明显的是这道题有4e4个点 直接跑最大独立集的话 那么测评机承受不起啊 所以 这里要维护一个区间dp的形式 每个区间有左右两个端点 我们现在要合并两个区间的话
  • HTTP缓存

    HTTP缓存 什么是HTTP缓存 http缓存指的是 当客户端向服务器请求资源时 会先抵达浏览器缓存 如果浏览器有 要请求资源 的副本 就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源 常见的http缓存只能缓存get请求响应的
  • Java中的作用域

    目录 Java作用域 Java中变量类型主要有3种 成员变量 静态变量和局部变量 成员变量或方法也有4种作用域 静态修饰符的特点 静态使用的注意事项 静态的优缺点 当成员变量被静态修饰后 和非静态成员变量的区别 方法作用域 块作用域 基本使