运算符
运算符和表达式
运算符:对常量或变量进行操作的符号
表达式:用运算符把常量或变量连接起来,构成的符合java语法的式子,就可以成为表达式。 不同运算符连接的表达式体现的是不同类型的表达式。
举例说明:
int a=10;
int b=20;
int a+b=30;
+:是运算符,并且是算术运算符
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。
1.算术运算符:
注意: (1)在进行自增(++)和自减(--)运算时,如果运算符++或--放在操作数的前面,则先进行自增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面,则先进行其他运算再进行自增或自减运算。
(2)在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有小数参与,得到的结果会是一个小数。例如,2510/1000属于整数之间相除,会忽略小数部分,得到的结果是2,而2.5/10的结果为0.25。
(3)在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。例如,(-5)%3=-2,而5%(-3)=2。
2.赋值运算符:
注意事项:(1)在Java中可以通过一条赋值语句对多个变量进行赋值,具体示例如下:
int x, y, z;
x = y = z = 5; // 为三个变量同时赋值
在上述代码中,一条赋值语句将变量x,y,z的值同时赋值为5。需要注意的是,下面的这种写法在Java中是不可以的。
int x = y = z = 5; // 这样写是错误的
(2)在表2-4中,除了“=”,其他的都是特殊的赋值运算符,以“+=”为例,x += 3就相当于x = x + 3,表达式首先会进行加法运算x+3,再将运算结果赋值给变量x。-=、*=、/=、%=赋值运算符都可以此类推。
3.比较运算符:
注意:在比较运算中,不能将比较运算符“==”误写成赋值运算符“=”。
4.逻辑运算符:
规则:
使用逻辑运算符需要注意的问题。
(1)逻辑运算符可以针对结果为布尔值的表达式进行运算。例如,x > 3 && y != 0。
(2)运算符“&”和“&&”都表示与操作,当且仅当运算符两边的操作数都为true时,其结果才为true,否则结果为false。虽然运算符“&”和“&&”都表示与操作,但两者在使用上还有一定的区别。在使用“&”进行运算时,不论左边为true或者false,右边的表达式都会进行运算。在使用“&&”进行运算,当左边为false时,右边的表达式就不再进行运算,因此“&&”被称作短路与。
(3)运算符“|”和“||”都表示或操作,当运算符两边的任一表达式值为true时,其结果为true。只有两边表达式的值都为false时,其结果才为false。同逻辑与操作类似,“||”运算符为短路或,当运算符“||”的左边为true时,右边的表达式不再进行运算。
(4)运算符“^”表示异或操作,当运算符两边的布尔值相同时(都为true或都为false),其结果为false。当两边表达式的布尔值不相同时,其结果为true。
5.三元运算符:
语法:<表达式1> ?<表达式2> : <表达式3> 先计算<表达式1>的值, 当<表达式1>的值为true时,则将<表达式2>的值作为整个表达式的值; 当<表达式1>的值为false时,则将<表达式3>的值作为整个表达式的值。 int a = 55,b = 132,result; result = a > b ? a : b; System.out.println(result); //输出为:132
例子:
注意:若条件为ture,运算结果是表达式1
若条件为false,运算结果为表达式2
流程控制语句
概念:用来控制程序中各语句执行顺序的语句,通过流程控制语句可以把语句组合成能完成一定功能的小逻辑模块。
分类:1.顺序结构:理解:先执行...再执行...
2.选择结构:理解:如果...,就...
分类:1.条件语句:
(1)if语句(单分支)
(2)if...else...语句(双分支)(类似三元运算符)
(3)if...else if ...else...语句(多分支)
类似:三元运算符
2.switch条件语句:表达式中的取值:byte,short,int,char,enum(枚举),String
3.选择结构:
理解:如果...,就继续...
分类:(1).while
(2).do...while 跟while循环的区别:do...while至少会执行一次。
(3).for 一般用于已知循环次数的情况。
(4).循环嵌套:
跳转语句:(1)braak 在switch语句中的作用,是用于结束switch语句。
在循环语句中的作用,是用于结束循环。
(2)continue 用于循环语句中,它的作用是结束本次循环,进入下一次循环。
Java的编程基础-方法
方法的定义:方法就是一段可以重复调用的代码
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,...)
{ //方法体
执行语句
...
return 返回值; }
对于方法的语法格式,具体说明如下:
修饰符:方法的修饰符比较多,例如,对访问权限进行限定的修饰符,static修饰符,final修饰符等,这些修饰符在后面的学习过程中会逐步介绍。
返回值类型:用于限定方法返回值的数据类型。
参数类型:用于限定调用方法时传入参数的数据类型。
参数名:是一个变量,用于接收调用方法时传入的数据。
return关键字:用于返回方法指定类型的值并结束方法。
返回值:被return语句返回的值,该值会返回给调用者。
接下来通过一个案例演示方法的定义与调用,在该案例中,定义一个方法,使用“*”符号打印矩形
方法分类:
1.无参无返回值
public void methodName(){
}
2.无参有返回值
public int methodName(){
return 1;
}
3.有参无返回值
public void methodName(String name){
}
4.有参有返回值
public int methodName(String name){
return 1;
}
方法重载:
概念:所谓方法重载,就是在同一个作用域内,方法名相同但参数个数不同或者参数类型不同的方法。
注意:方法重载跟返回值类型无关,同时跟参数名也无关。
方法中的值传递 可变参数 JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法。 方法的可变参数的声明如下所示: typeName... parameterName 在方法声明中,在指定参数类型后加一个省略号(...) 。 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
一维数组
数组的定义:数组是指一组类型相同的数据的集合,数组中的每个数据被称作元素。
特点:
1.数组可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致。是一个对象,是一种引用数据类型。可以表示一组数据的集合。
2:数组只能保存一种类型的数据。
3:数组创建后元素默认有初始值。
4:数组中的每一个数据称为 元素 element。元素是在堆内存中分配的。而且是连续分配的。
5:数组的每一个元素都有一个序号,专业的称谓:下标、索引、角标。下标是从0开始的、升序的、连续的、0序的。
6:数组有一个属性:长度的属性,表示数组中元素的个数 该属性是 int 类型。 通过 数组名.length 来访问该属性。
7:数组中元素的下标的取值范围是:[0~length-1]。
8:通过new 关键字 在堆内存中元素被分配空间之后。每个元素被jvm 赋予默认值。
默认值规则:整数:0 浮点数:0.0 char:’\u0000’ boolean:false 引用数据类型:null。
9: 数组的每个元素通过 数组名[下标] 来访问。每个元素都是一个变量。和变量的用法一致。
10:数组变量、数组引用 保存的是 数组的实际元素的在堆内存中的"首地址"。
11: [] 代表的是 数组这种类型。
12:求下标是 n 的元素的地址:首地址+元素字节数*n。 数组根据下标访问元素的效率非常快。
13:数组的长度可以是 0,但是不能是 负数。
14:数组的长度一旦确定,就不能更改了。数组是定长的。
数组不进行初始化,系统默认初始化,不同类型数组元素的默认值如下表:
定义数组的方式有两种:
动态初始化:
1.先声明数组再创建数组
数据类型[] 数组名;//声明数组
数组名 = new 数据类型[长度];//创建数组
2.//声明数组并创建数组
数据类型[] 数组名 = new 数据类型[长度];
代码演示:
静态初始化:
1.类型[] 数组名 = new 类型[]{元素,元素,……};
2.类型[] 数组名 = {元素,元素,元素,……};
代码演示:
上述代码中,采用静态初始化的方式为每个元素赋予初值,其值分别是1、2、3、4。需要注意的是,文件中的第3行代码千万不可写成int[] x = new int[4]{1,2,3,4};,这样写编译器会报错。原因在于编译器会认为数组限定的元素个数[4]与实际存储的元素{1,2,3,4}个数有可能不一致,存在一定的安全隐患。
栈内存和堆内存的定义:
在方法中定义的一些基本类型的变量
和对象的引用变量
都在方法的栈内存中分配,当在一段代码块中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立刻被另作他用。
堆内存用来存放由 new 运算符创建的数组或对象,在堆中分配的内存,由Java虚拟机的垃圾回收器来自动管理。在堆中创建了一个数组或对象后,同时还在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的首地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。
图例:
栈内存和堆内存的区别:
栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。
而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。
使用数组:
1.访问数组元素:数组名(索引)
2.给数组元素赋值:数组名【索引】=值;
常见错误:
1.数组下标越界异常:ArrayIndexOutOfBoundsException
2.空指针异常:NullPointerException
了解异常:所谓异常指程序中出现的错误,他会报告出错的异常类型、出错的行号以及出错的原因。
数组的常见操作:
1.数组遍历
在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。接下来通过一个案例学习如何使用for循环遍历数组。
2.数组最值
在操作数组时,经常需要获取数组中元素的最值。接下来通过一个案例来演示如何获取数组中元素的最大值。
3.数组排序
在操作数组时,经常需要对数组中的元素进行排序。下面为读者介绍一种比较常见的排序算法——冒泡排序。在冒泡排序的过程中,不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程和水中气泡上升的原理相似。
冒泡排序:
二维数组:
第一种方式: 数据类型[][] 数组名 = new数据类型[行的个数][列的个数];
第二种方式: 数据类型[][] 数组名 = new int[行的个数][];
第三种方式: 数据类型[][] 数组名= {{第0行初始值},{第1行初始值},...,{第n行初始值}};
案例: