Java之变量的作用域和初始化

2023-05-16

write:2022-4-28
前文我们学习了Java的数据类型:Java之数据类型,本文我们学习变量的作用域和初始化,文中有大量使用实例讲解分析,需耐心解读代码

文章目录

  • 1. 变量和参数的概念
  • 2. 变量的作用域
  • 3. 参数传递
  • 4. 变量的默认值
  • 5. 变量的初始化
  • 6. 静态变量和实例变量
  • 7. 变量的生命周期
  • 8. 小结
  • 9. 练习题

1. 变量和参数的概念

仔细分析一下代码:

public class Cat{
  private String **name**;      //name:属性
  
  public Cat(String **name**){       //name:方法的参数
    this.name=name;
  }

  public void speak(){
    System.out.println(name+":喵喵喵");
  }

  public static void main(String args[]){
    Cat cat=new Cat("朵拉");
    cat.speak(); 
  }
}

可以发现在不同的地方,变量name代表的含义不同,有不同的作用。

2. 变量的作用域

成员变量:在类中定义,它的作用域是整个类。
局部变量:在一个方法的内部定义,它的作用域是整个方法。
方法参数:方法的参数,它的作用域是整个方法。

eg:

public class Scope{
  int x; //成员变量,作用域是整个类
  
  Scope(int x){
    this.x=x;   //此方法与类同名,this.x(成员变量x)=x(方法参数x),用this关键字就是引用与方法参数同名成员变量
    int y=2;  //局部变量,作用域是这个方法
}

 public void test(){
    x=1;
    y=1;   //编译出错
}
   
  public static void main(String args[]){
    Scope s=new Scope(1);
    System.out.println(s.x);
    System.out.println(s.y);  //编译出错
  }
}

进一步理解this关键字:
eg:

public class Count{
  int data;   //没有显示初始化,默认值为0
  
  public void increase(int data){
    this.data=this.data+data;    //把成员变量data和方法参数data相加再赋值给成员变量data
  }
  
  public static void main(String args[]){
     Count  c1=new Count();
     Count  c2=new Count();
     c1.increase(2);    //0+2=2
     c2.increase(1);    //0+1=1
     System.out.println(c1.data+","+c2.data);  //打印:2,1
  }
}

图解:
在这里插入图片描述

3. 参数传递

如果参数是基本数据类型,参数传递是将数值传递给方法。
如果参数是对象或数组的引用类型,参数传递是将对象或数组的引用传递给方法。

eg:

public void methodA(){
  int a=1;
  String s=HellomethodB(a,s);    //调用methodB方法
}

public void methodB(int p1,String p2){}

试一试
想一想打印输出什么结果

public class ParaTest{
    public int v=0;
    public static void main(String args[]){
	//声明3个局部变量
	int p1=0; // p1是基本数据类型
	ParaTest p2=new ParaTest(); //p2 是对象引用类型
	ParaTest p3=new ParaTest();//p3 是对象引用类型
	//将3个局部变量作为参数传递给changeParameter ()方法
        changeParameter (p1, p2, p3);					
        //打印3个局部变量
        System.out.println("p1= " +p1);
        System.out.println("p2.v= " + p2.v);
        System.out.println("p3.v= " + p3.v);
    }
    public static void changeParameter (int p1, ParaTest  p2, ParaTest  p3) {
	   p1=1; 
	   p2.v=1; 
	   p3=new ParaTest();  
        p3.v=1; 
    }
}

答案:
P1=0
P2.v=1
P3.v=0

分析:
在这里插入图片描述

4. 变量的默认值

在创建一个对象时,JVM会自动为它的成员变量初始化为默认值。
数值型变量的默认值(0)
字符型的默认值(‘\u0000’)
布尔型的默认值(false)
引用类型的默认值(null)。

eg:

public class Sample{
   int v1;
   boolean v2;
   Sample v3;
   public static void main(String args[]){
     Sample sam=new Sample();
     System.out.println(sam.v1);  
     System.out.println(sam.v2);
     System.out.println(sam.v3);
  }
}

打印结果
0
false
null

5. 变量的初始化

1)成员变量会自动初始化:如果编写者显示初始化,那么成员变量的值就是赋值的值,如果没有显示初始化,则默认初始化,成员变量的值就是默认值
2)局部变量必须显式初始化再使用

eg:
在这里插入图片描述

6. 静态变量和实例变量

成员变量分为两种:静态变量和实例变量。
静态变量用static修饰,也叫做类变量。

eg:

public class Sample{
   static int v1;  //静态变量
   int  v2;  //实例变量
   public static void main(String args[]){
      v1=1;
      v2=1;   //编译出错,在静态方法中不能直接访问v2
      Sample s1=new Sample();
      s1.v1=2;
      s1.v2=2;
      Sample.v1=3;
      Sample.v2=3;  //编译出错,不能通过类名访问v2
  }
}

静态变量和实例变量的区别
静态变量在内存中只有一个备份,在JVM加载类时分配内存
实例变量属于特定的实例。每创建一个实例,就会为实例变量分配内存。

eg:

public class Sample{
   static int v1;  //静
   public static void main(String args[]){
      Sample s1=new Sample();
      Sample s2=new Sample();
      s1.v2=1;   
      s2.v2=2;
      s1.v1=3;
      s2.v1=4;
      System.out.println(s1.v2+,+s2.v2+,+v1); //打印1,2,4
  }
}

在这里插入图片描述

7. 变量的生命周期

方法的参数和局部变量只有当方法被调用时才存在
实例变量的生命周期依附于实例变量
静态变量的生命周期依附于类的生命周期

eg:用唱戏表示
在这里插入图片描述
变量的生命周期
eg:
在这里插入图片描述

8. 小结

在这里插入图片描述

9. 练习题

1.编译以下代码会出现什么情况?
public int test(){
int x;
int y=x+1;
return y;
}

编译出错,提示变量x必须先初始化才能被使用。

2.编译或运行以下代码会出现什么情况?
public class Sample{
static String v1;
static boolean v2;
public static void main(String args[]){
System.out.println(Sample.v1);
System.out.println(v2);
}
}
编译和运行通过,打印null和false。

3.编译或运行以下代码会出现什么情况?
public class Sample{
public int method1(){
int x=0;
return x+10;
}

public void method2(){
System.out.println(x);
}
}
编译出错,提示method2()方法中的x没有定义。

4.补充setData()方法的代码,把参数data的值赋给实例变量data?
public class Sample{
int data;
public void setData(int data){
//把参数data的值赋值给实例变量data

}
}

a) Sample.data=data; b) new Sample().data=data;
c) this.data=data; d) int data=data;
答案:c

5.运行以下Sample类,会得到什么打印结果?
在这里插入图片描述
a) 打印1,2,1 b)打印1,1,2
c)打印1,1,1 d)打印2,2,1
答案:b

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

Java之变量的作用域和初始化 的相关文章

随机推荐

  • IDEA通过maven配置Spring保姆级教程

    写在前面 xff1a 此篇文章主要是记录IDEA利用maven配置Spring的全过程 由于本人也是慢慢探索出来的 xff0c 所以有不全或者遗漏的地方 xff0c 还请大家斧正 请耐心看完文章 xff0c 前期工作做完后IDEA才可以配置
  • 策略梯度算法(Policy Gradient)逐行代码详解

    理论部分以及完整代码参看之前的博客 xff1a https blog csdn net qq 47997583 article details 124506650 本文章介绍的是策略梯度算法中的REINFORCE实现 上图为算法流程图 xf
  • python爬虫(自动下载图片)

    爬虫第一步下载第三方工具 requests包 win 43 R 输入cmd点击确定或回车 输入以下命令下载requests包 requests包是python爬虫常用的包 他的下载方式是 pip install requsts 如果觉得下载
  • python json格式转字典

    impor json req 61 json loads 转换的内容
  • mysql安装5.7出现闪退解决办法

    MySQL下载官网 下载地址 xff1a https dev mysql com downloads mysql 我之前用的是5 5的版本升级到5 7是将所有的数据生成到文件里 命令 mysqldump u root p all datab
  • 小程序设置、获取本都缓存、发送请求、渲染数据、转发当前页面、下拉刷新页面

    设置 获取缓存 xff0c 发送请求 xff0c 渲染数据 xff0c 转发当前页面 设置 获取本地缓存设置本地缓存 xff08 wx setStorage xff09 获取本地缓存 xff08 wx getStorageSync xff0
  • cnpm安装步骤

    安装nodeJS 官网下载 xff1a http nodejs cn download 选择其他版本下载地址 https nodejs org zh cn download releases 选版本点击下载 然后下载后缀名为msi 因为安装
  • likeadmin权限管理菜单报错:AxiosError

    报错图片 xff1a 这个原因是后端返回的 JSON 数据太多而导致前端报错 xff0c 可能是因为前端无法处理大量数据 下面是一些可能导致前端代码处理大量数据出现问题 返回json数据中的末尾有说到数据太多了的原因 然后我去数据库的sys
  • Vue安装

    Vue安装 一 安装二 使用步骤1 在项目中使用vue2 使用命令创建vue项目 一 安装 安装vue之前需要安装nodeJS 1 需要安装Node js 可以从官方网站进行下载并安装 2 这篇博客有详细的步骤 Node js安装详解 3
  • Thinkphp6模型关联

    文章目录 前言一 一对一关联示例 二 一对多三 多对多四 示例总结hasManybelongsTohasOne 前言 ThinkPHP 6 模型关联是指使用 PHP 对象关系映射 xff08 ORM xff09 机制 xff0c 通过模型类
  • Linux----生产者与消费者

    生产者与消费者 模型场景分析 xff1a 编程流程 xff1a 生产者同步流程消费者同步流程 代码实现主函数生产者线程函数消费者线程函数 模型场景 分析 xff1a 缓冲区buff中存放数据 生产者和消费者数目不固定 xff0c 生产者向缓
  • 一篇文章了解Like用法及常见索引失效情况

    1 简介 本文主要通过介绍Like索引及常见索引失效情况 xff0c 以MySQL为例 2 EXPLAIN关键字 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划 EXPLAIN 语句 就可以看到某
  • Linux——进程和计划任务管理(理论+实验)

    目录 前言一 程序 进程线程概述1 1 程序1 2 进程1 3 线程1 4 程序 进程和线程的关系1 5 程序和进程的关系 二 查看进程2 1 1 ps 命令 查看静态的进程统计信息 xff08 Processes Statistic xf
  • Uncaught SyntaxError: Unexpected token ‘var‘

    遇到Uncaught SyntaxError Unexpected token 39 var 怎么去解决 1 发现报错 xff0c 就去找报错 2 怎么查找这个报错并修改这个报错 3 为什么我写的时候没有提示报错 xff0c 运行的时候才显
  • 如何使用Maven创建Mybatis项目

    1 打开idea xff0c 依次点击左上角的File gt New gt project 2 选择Maven xff0c 然后点击Next 3 通过点击这个文件夹进行文件存放地址的改变 xff0c 然后输入项目的名字 4 再点击Finis
  • 树莓派3B+raspbian+docker+hassio安装教程

    说明 1 此文转载 侵删 参考https bbs hassbian com thread 3501 1 1 html 2 修改echo 34 96 date 43 H M S 96 gt gt gt gt gt gt gt gt gt gt
  • Linux - 开机启动流程

    目录 一 掌握开机启动流程的意义 xff1a 1 1 为什么需要了解开机启动流程 xff1f 1 2 在日常的运维过程中 xff0c 是否会遇到机器出现问题启动不了 xff1f 1 3 开机启动流程的意义 二 开机启动流程 2 1 开机启动
  • 关于Ubuntu中出现:Unable to fetch some archives, maybe run apt-get update or try with --fix-missing问题

    在Ubuntu有网络的情况下 xff0c 如果出现在进行 apt update或者apt install时 xff0c 出现Unable to fetch some archives maybe run apt get update or
  • 2022年宜春市职业院校技能大赛中职组“网络搭建与应用”赛项任务书

    2022年宜春市职业院校技能大赛中职组 网络搭建与应用 赛项任务书 xff08 总分1000分 xff09 赛题说明 一 竞赛内容分布 网络搭建与应用 竞赛共分二个部分 xff0c 其中 xff1a 第一部分 xff1a 网络搭建及安全部署
  • Java之变量的作用域和初始化

    write xff1a 2022 4 28 前文我们学习了Java的数据类型 xff1a Java之数据类型 xff0c 本文我们学习变量的作用域和初始化 xff0c 文中有大量使用实例讲解分析 xff0c 需耐心解读代码 文章目录 1 变