`
阿尔萨斯
  • 浏览: 4168245 次
社区版块
存档分类
最新评论

Java学习系列(三)Java运算符、控制语句、数组及其在内存中的运行分析

 
阅读更多

梭罗说:“从圆到圆心有多少条半径,人们的生活方式也应该有这么多。” 同样学习也是如此,学习的渠道有很多种,但能找适合比较适合自己的却不是一件简单的事。比如说有的人喜欢看书,从书中学到一些自己感兴趣的东西。当然有时也迫于无赖,必须得学一些比较枯燥的理论,这就造成了有些人喜欢读书,有些人对读书比较厌倦,大学里的这种现象比较常见。记得中国达人秀的舞台有一个叫卓君的街舞达人,他是通过上网看视频自学的街舞。街舞跳的那么好,悟性是一方面,但坚持练习肯定必不可少。虽然本人没有学过街舞,但是我觉得编程和街舞还是有相似之处的,每一个动作好比是是一个方法或者称函数,那么连贯起来的一整套动作便是我们的程序。尽管动作有好有坏,但只要不断去练习改进(调试、调优),相信你离成功不远了。


运算符

算术运算符:+,-,*,/,%,++,-- 。对于++ -- 只能操作一个变量。++既可以放在变量前(先把变量+1,然后再拿来用),也可以放在变量后(先拿来用,再把变量+1),--也是也是如此。这是比较容易出错的地方。

赋值运算符:【= += -= *= /= %= >>= <<= &= |= ^=】赋值运算符优先级别低于其他的运算符,所以对该运算符往往最后读取。注意等号左边只能是变量,赋值运算符可以与所有的双目运算符结合,就形成了扩展后的赋值运算符。需要注意的:a+=b相当于a=(a的类型)(a+b);//隐式类型转换。注意+=之间不能有空格。赋值表达式的值就是等号右边被赋的值。

位运算符(基于2进制码运算):&、|、~、^(按位异或)、<<、>>、>>>。注意运算时要用补码去算,最终结果要转换为原码。>>:当右移除不尽的情况下,实际得到的整数总是比实际运算的结果值略小。>>>:无符号右移,在左边补0。^:同0异1。

关系运算符:等于运算符【==】、不等于运算符【!=】 、关系运算符【< > <= >= 】

按运算所需变量的个数来分:运算所需变量为一个的运算符叫单目运算符,例如【!,~,()】;运算所需变量为两个的运算符叫做双目运算符;算所需变量为三个的运算符叫三目运算符:【?:】

逻辑运算符(操作数要求只能是boolean值):&&、&(不会短路)、||、|(不会短路)、!、^(只有当两个操作数不同时,才返回true)。【自加的陷进】:int c=1;c=c++;//a).先拿出c来值为1,b).c自加成2,c).把刚取出的1赋给c,c又变回1。


流程控制语句

流程控制语句一共有3种结构:1.顺序结构 如果没有流程控制,计算机总是从上到下,一次执行每一行。2.分支 满足某个条件时,才去执行代码。3, 循环 重复执行一段代码。

分支控制:if/switch 如果省略了花括号,if条件只控制到第一个分号前面。else本身就是条件(在if条件上取反)。建议:即使条件执行体只有一行代码,也保留花括号。当有多个else if语句块时,建议先处理范围小的条件。switch:当等于某个值时,才执行一段代码。每次写完case,在写其它代码之前立即写break; 循环控制:while/do..while/forwhile

do{

//do something...

}while(返回boolean值的表达式)

这个循环与while相比,把循环放前面,先执行一次循环体,如果条件为true,将执行下一次循环。while使用规则:如果省略了花括号,while条件只控制到第一个分号前面。注意只要是循环体,就永远跳到循环条件。

举例说明:

public class LoopTest 
{
	public static void main(String[] args) 
	{
		int i = 1;
		while(i++<5);
		{
			System.out.println("i="+i);
		}
	}
}
分析一下,看看结果是不是i=6。

for(初始化语句;返回boolean值得表达式;每次循环体执行完后执行的代码)
{

//do something...
}
初始化语句:可以省略;如果有“初始化语句”,则只有在循环开始之前,会执行一次“初始化语句”。返回boolean值得表达式:可以省略;如果省略,意味着它的值永远是true。每次循环体执行完后执行的代码:可以省略。如果有,将在每次循环体执行之后,开始下一次循环之前执行。【注意】只要两个分号中间的表达式返回true,程序将执行循环体。循环嵌套:把内存循环当成外层循环的一条语句即可。控制循环的关键词:break(完全结束一个循环本身)、continue(停止当前循环体的执行【忽略continue后面的语句】,开始下一次循环体)、return(结束整个方法)。【注意】break、continue后面可以跟一个标号。带标号的break用于结束标号所标识的循环。带标号的continue忽略标号所标识的循环后面的剩下语句。另外注意Java里面没有goto(当做保留字)。

for循环的执行机制如图


再举一例:

public class LoopTest 
{
	public static void main(String[] args) 
	{
		for(int i=1;i <10;i+=2){
			System.out.println("i的值为:"+ (i*=1.2)); 
		}
	}
}
思考一下:运行结果会是多少呢? 这里需要注意的是:这里有个隐式类型转换,原型为a*=b相当于a=(a的类型)(a*b);这样我想不难得出结果为:1、3、6、9。

还有一种foreach循环:如使用foreach循环对数组进行遍历
for(元素类型 变量名:数组|集合)
{
//此处即可通过“变量名”依次访问每个数组|集合中的元素。
}
/*注意:在foreach中对循环变量赋值并不会改变原数组(下面会讲到)元素值*/


数组

数组类型(引用类型)(说明:如int[] a 则变量a的数据类型为int[],注意是int[],而不是int)。数组里的每个元素,就相当于一个普通的变量。这里补充一下,引用类型的本质其实就是指针,只是Java对它做了一些封装和异常等检查。定义数组时,不能指定数组的长度。【数组的初始化】:数组变量只是一个引用,必须让它指向有效的内存之后才能使用。数组的初始化分为两种:1.静态初始化:int[] a = new int[]{1,2,3}//只指定数组的元素,让系统来决定数组的长度,推荐使用这种。还有一种写法:int[] a={1,2,3}; //直接指定数组元素。2,动态初始化:int[] a=new int[3];//只指定数组的长度,让系统来决定数组的元素值,注意如果数组元素是基本类型,那么所有数组元素的默认值都是0/0.0/false/u0000;如果数组元素是引用类型,那么所有数组元素的默认值都是null。


方法栈(所有在方法中声明的变量,都放在相应的方法栈中)

每个方法运行时,系统都会为之建立一个方法栈。栈内存是临时性的内存,方法结束时,方法栈会被立即释放,所以栈不适合存放长有效的数据。java中的所有的对象都放在"堆"内存中,每个JVM只有一个"堆"内存。java不允许直接操作堆内存,只能通过引用来访问,只要JVM不退出,堆内存一直存在。这里补充一下:JVM有一条后台进程:垃圾回收器,它会用一种机制记录 堆内存中“每个对象”是否有引用变量(指针)引用它。如果有,垃圾回收器就不会管它;如果没有,垃圾回收器就会在合适的时候去回收该对象所占的内存。注意:当数组对象的引用变量被销毁之后,数组并不一定会回收(它在堆内存),它不会随着数组变量被回收,数组变量只是一个引用,它只是暂时指向了某块堆内存的地址而已。再说一下二维数组:Java允许初始化数组时只初始化左边的维数(如:int[][] a = new int[5][];)。二维数组的元素(引用变量,必须要有指向)是一维数组。

举例说明:

public class BinaryArrayTest 
{
	public static void main(String[] args) 
	{
		//定义二维数组a
		int[][] a;
		//动态初始化二维数组a
		a= new int[5][];
		//静态初始化一维数组a[1]
		a[1]=new int[]{1,2,3,4,5,6,7,8,9,10};
		for(int i=0;i <10;i++){
			System.out.print(a[1][i]+"\t"); 
		}
	}
}
运行结果如下:



结束语

今天内容比较多,也有很多我们平常做题时容易出错的地方,大家以后一定要注意一下。以上部分内容来源于网络。

明天开始正式开始学习Java面向对象中的三大特征:封装、继承、多态。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics