返回介绍

变量

发布于 2024-09-07 13:20:08 字数 3191 浏览 0 评论 0 收藏 0

成员变量与局部变量的区别?

成员变量 vs 局部变量

  • 语法形式 :从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public , private , static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
  • 存储方式 :从变量在内存中的存储方式来看,如果成员变量是使用 static 修饰的,那么这个成员变量是属于类的,如果没有使用 static 修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。
  • 生存时间 :从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。
  • 默认值 :从变量是否有默认值来看,成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。

为什么成员变量有默认值?

  1. 先不考虑变量类型,如果没有默认值会怎样?变量存储的是内存地址对应的任意随机值,程序读取该值运行会出现意外。
  2. 默认值有两种设置方式:手动和自动,根据第一点,没有手动赋值一定要自动赋值。成员变量在运行时可借助反射等方法手动赋值,而局部变量不行。
  3. 对于编译器(javac)来说,局部变量没赋值很好判断,可以直接报错。而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。

成员变量与局部变量代码示例:

public class VariableExample {

  // 成员变量
  private String name;
  private int age;

  // 方法中的局部变量
  public void method() {
    int num1 = 10; // 栈中分配的局部变量
    String str = "Hello, world!"; // 栈中分配的局部变量
    System.out.println(num1);
    System.out.println(str);
  }

  // 带参数的方法中的局部变量
  public void method2(int num2) {
    int sum = num2 + 10; // 栈中分配的局部变量
    System.out.println(sum);
  }

  // 构造方法中的局部变量
  public VariableExample(String name, int age) {
    this.name = name; // 对成员变量进行赋值
    this.age = age; // 对成员变量进行赋值
    int num3 = 20; // 栈中分配的局部变量
    String str2 = "Hello, " + this.name + "!"; // 栈中分配的局部变量
    System.out.println(num3);
    System.out.println(str2);
  }
}

静态变量有什么作用?

静态变量也就是被 static 关键字修饰的变量。它可以被类的所有实例共享,无论一个类创建了多少个对象,它们都共享同一份静态变量。也就是说,静态变量只会被分配一次内存,即使创建多个对象,这样可以节省内存。

静态变量是通过类名来访问的,例如 StaticVariableExample.staticVar (如果被 private 关键字修饰就无法这样访问了)。

public class StaticVariableExample {
  // 静态变量
  public static int staticVar = 0;
}

通常情况下,静态变量会被 final 关键字修饰成为常量。

public class ConstantVariableExample {
  // 常量
  public static final int constantVar = 0;
}

字符型常量和字符串常量的区别?

  • 形式 : 字符常量是单引号引起的一个字符,字符串常量是双引号引起的 0 个或若干个字符。
  • 含义 : 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)。
  • 占内存大小 :字符常量只占 2 个字节; 字符串常量占若干个字节。

注意 char 在 Java 中占两个字节。

字符型常量和字符串常量代码示例:

public class StringExample {
  // 字符型常量
  public static final char LETTER_A = 'A';

  // 字符串常量
  public static final String GREETING_MESSAGE = "Hello, world!";
  public static void main(String[] args) {
    System.out.println("字符型常量占用的字节数为:"+Character.BYTES);
    System.out.println("字符串常量占用的字节数为:"+GREETING_MESSAGE.getBytes().length);
  }
}

输出:

字符型常量占用的字节数为:2
字符串常量占用的字节数为:13

Java 是一门面向对象的编程语言,不仅吸收了 C++语言的各种优点,还摒弃了 C++里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文