【javase复习】## day2 语法 内存分析 ##

switch for while 的一些点

1、 if -else 和 三目运算符 A?B:C的区别
这里写图片描述

所以不能用 5>3? System.out.println(“asd”):System.out.println(“asd”);
之类的语句







2、 switch的一些注意事项, 很惭愧,一直都记不清楚,这次打死都牢牢记住。

这里写图片描述
一定要注意switch一定判断的是变量, 而case后面判断的一定是常量

如果是变量则不会编译成功 参考下图:
这里写图片描述

图中用num变量作为case判断的依据, 会报错

另外注意:

case提供一个入口,如果后面的语句没有break,则不判断case是否满足, 语句全部执行,直到break或者花括号结束。
这里写图片描述

但是有一个例外就是 default 并不是按顺序判断的,不管default写在哪里,都是先判断所有的case,如果都不满足,才进入default入口,这个时候看default在哪里,执行default以下的所有语句直到break或者花括号结束

这里写图片描述









3、 废话
java中不允许写废话, 会报错
例如 while(false) {} 就会GG , 因为{}内语句永远不会执行,所以必须吧false赋给一个boolean变量, 然后用flag 就可以, 因为编译时候不知道while会不会执行。

类似的continue也有这个情况
这里写图片描述
这里也会报错








4、 标号

    这学期才学的汇编, 终于在高级语言中也看到了标号应用的地方,我觉得有标号还是挺方便的。这里记一个例子

这里写图片描述








5、 return的存在与否

这里写图片描述

之前也清楚return的用处,但是以为void的函数不能有return,觉得这个return会返回一个null。






数组的内存分析

这一次的复习彻底搞清楚java中所有的东西是怎样分配内存的,之前非常的不清楚,也许也是因为没有计组和操原的知识,所有的东西只能涵盖的大致了解,不能深入理解其中的意思,而且有些课本上写的是错误的。这里先记一下数组的内存分析,后面会有对象的内存分析,然后静态数据,之类的。会另开文章

受谭浩强影响。 定义数组习惯用 int a[] , 虽然在java中也可,却不明究竟意义。

以后定义都要 int[] arr = new int[50]

逐词分析:

这里写图片描述

这样int[]作为一个整体, 显然比int a[]的结构更加清晰,容易理解。

另外要注意的是内存的分配问题:
在java中,jvm管理3种内存:

1、 栈内存 2、堆内存 3、共享数据区






这里写图片描述

这里先暂时不考虑共享数据区的问题,之后复习static时再说。

对于栈和堆,必须明确:

栈内存: 存储局部变量,一旦出了作用域,就会在内存中失效,释放空间
堆内存: 存储对象数据,对象一旦被用完,不会立刻从内存消失,而是等待垃圾回收期回收,才释放内存。

所以这里的arr 其实上存储了是对象int[4]的地址,相当于一个指针,但是java中没有指针这个东西,所以在函数中进行参数传递的时候,直接传数组变量进去修改,真实值也会改变,因为确实是通过地址进行存储对象的内存中去修改值,这和c语言系列不同,需要注意。





这里写图片描述

要深入理解new 出来的对象 都在堆内存, new一个,堆内存就出来一个。new多个 出来多个。
如果对变量进行赋值,则是将栈内存中的所存储的地址进行赋值,而原对象依然存在,只是没有变量指向他,所以再也找不到了。



这里写图片描述





局部变量:定义在方法中变量

成员变量都可分为 类变量 和 实例变量

类变量 是静态变量
类变量 即使没有创建对象,也会分配内存,这点之后讲static再复习

这里写图片描述

作用域: 即花括号所属范围。




二维数组相比C语言要容易一点。

这里写图片描述

注意这里一维中存储的都是地址。

数组中最常见的问题:

1. NullPointerException 空指针异常
原因: 引用类型变量没有指向任何对象,而访问了对象的属性或者是调用了对象的方法。\

2. ArrayIndexOutOfBoundsException 索引值越界。
原因:访问了不存在的索引值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章