今天做到一道题,关于java局部变量没有默认值,编译不能通过的这个知识点的考察
public class Test{
String a;
public static void(String args[]){
String s;
System.out.println(s);
}
}
此时a是成员变量,s是局部变量也叫函数变量,成员变量的8大基本数据类型是有默认值的比如String的类型的默认值是null,char的默认值是“”,这些可以自己用代码验证一下,但是局部变量没有默认值编译不通过
Q1:为什么成员变量有默认值局部变量就没有呢
找了网上答案回答最多的是对初始化默认值是要有内存开销,然后又说成员变量存储在堆内存,局部变量存储在栈内存
Q2:为什么成员变量要放在堆内存,局部变量要放在栈内容
这个问题在网上没有找到直接的答案,但意外中看到几篇文章就是对栈和堆的使用区别
说一下我看完的感受,进程是应用程序的实体,一个应该程序可能不止一个进程,那么一个进程也可以共享服务多个应用程序,还有一个进程可以有多个线程,那么我们的主函数一般是主线程其他成员函数也是线程,当一个应用程序开启就会相应分配一个堆一般一个应用程序只有一个堆,当成员函数被调用就会有一个栈,成员函数撤销栈也就销毁,还有栈适合用于存储数据量少,但他查询存储速度比堆快,而堆可用于存储数据量大的,增删改查结点就比较麻烦,所以从数据量大小来看也可以稍微看出为什么局部变量存在栈内存,成员变量存在堆内存
https://www.zhihu.com/question/24807877