java基础(2)---- 数据存储,基本运算,方法函数
1.数据存储
1.1内存:内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程 序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
1.2内存分配:
方法区(特殊的堆):存储类信息,静态变量,静态方法,字符串常量等不变的数据
堆:存储对象,数组本身
栈:存储基本数据类型,局部变量,引用
图1、内存分区存储图解
1.3内存管理概述:程序的内容按类型分区存储在各区的内存空间,并为可能参与赋值的内容标记内存地址,同时为待赋值的变量分配地址空间指向对应值的地址空间。
示例代码运行的内存分析及图解参考博客(https://blog.csdn.net/lgl782519197/article/details/90609572)
2.基本运算
2.1运算前提:Java程序要求参见运算的数据,必须保证取值范围一致,如果不一致需要先进行数据类型转换。
2.1.1数据类型转换前提:数据类型的的取值范围不等同于数据的字节数,在参与运算时byte,short,char直接被提升为int型,所以取取值范围划分如:
byte,short,char--->int--->long--->float--->double
具体的,char类型通过编码表查询得到对应的ASCII码换成int。
如:在char类型和int类型计算的过程中,char类型的字符先查询编码表得到97,将char提升为了int类型,再和1求和,结果为98。
图2、char+int数据装换图解
2.1.2自动转换:将取值范围小的类型,自动提升为取值范围大的类型。
2.1.3强制转换:将取值范围大的数据类型,手动强制转换成取取值范围大道的类型。
- 强制装换格式:
数据类型1 变量=(数据类型1)数据类型为2的数据
//(其中数据类型2取值范围大于数据类型1)
- 数据溢出:超过转换后的数据类型的最大取值范围会使数据损失变小,没超过没事。
精度损失:超多转换后的数据类型的最大精度范围会使精度损失,比如double强制转换为int型会损失小数部分。
2.2基本运算类型:
2.2.1算术运算:
算数运算符 | |
+ | 加法运算,字符串连接 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 取模运算,两个数字相除取余数 |
++,-- | 自增自减运算 |
表1、算数运算符
- 自增自减运算:
独立运算:++a与a++,--a与a--没有区别。
混合运算: 为其它变量赋值,两者有区别。 ++a :变量a先加1,将加1后的结果赋值给其他变量。a++:变量a先给其他变量赋值,再加1。
小于整型数据取值范围数据的自增运算:
(1)short类型数据:
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
运行结果:
图3、short型数据自增运算
分析: s += 1 逻辑上看作是 s = s + 1 计算结果被提升为int类型,再向short类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。但是,+= 是一个运算符,只运算一次,并带有强制转换的特点。 也就是说 s += 1 就是 s = (short)(s + 1) ,因此程序没有问题编译通过,运行结果是2.
(2)char类型数据:
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
运行结果:
图4、char型数据自增运算
分析: 同理,s += 1 就是 s = (char)(s + 1) ,因此程序没有问题编译通过,运行结果是b.
- 字符串连接: + 符号在遇到字符串的时候,表示连接、拼接的含义。 "a"+"b"的结果是“ab”,
2.2.2赋值运算:即将符号右边的值,赋给左边的变量。
赋值运算符 | |
= | 等于号 |
+= | 加等于 |
-= | 减等于 |
*= | 乘等于 |
/= | 除等于 |
%= | 取模等 |
表2、赋值运算符
2.2.3逻辑运算:用来连接两个布尔类型结果的运算符,运算结果都是布尔值 true 或者 false。
逻辑运算符 | |
&&短路与 | 两边为true,结果为true 短路特点:符号左边是false,右边不再计算,结果是false |
||短路或 | 两边为false,结果是true 短路特点:符号左边是true,右边不再运算,结果是true |
!取反 | !true结果是false !false结果是true |
表3、逻辑运算符
2.2.4比较运算:比较运算符,是两个数据之间进行比较的运算,运算结果都是布尔值 true 或者 false 。
比较运算符 | |
== | 比较符号两边数据是否相等,想等结果是true |
< | 比较符号左边的数据是否小于右边的数据,如果小于结果是true |
> | 比较符号左边的数据是否大于右边的数据,如果大于结果是true |
<= | 比较符号左边的数据是否小于或者等于右边的数据,如果小于结果是true |
>= | 比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是true |
!= | 不等于符号,如果符号两边的数据不相等,结果是true |
表4、逻辑运算符
- 注意:a<b<c不是规范的命令语句,计算机只会执行a<b就结束了,有上下界的比较应表达为a<b&&b<c。
2.2.5三元运算
- 语句格式:
数据类型 变量名 = 布尔类型表达式?结果1:结果2
- 三元运算符计算方式: 布尔类型表达式结果是true,三元运算符整体结果为结果1,赋值给变量。 布尔类型表达式结果是false,三元运算符整体结果为结果2,赋值给变量。
3.方法函数:将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。
3.1方法定义
- 定义格式:
修饰符 返回值类型 方法名 (参数列表){
代码...
return ;
}
- 定义原则:
方法定义的先后顺序无所谓。
方法只能定义在类里面,另一个方法里面。
3.2 方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。
参数列表:个数不同,数据类型不同,顺序不同。
重载方法调用:JVM通过方法的参数列表,调用不同的方法。
如:System.out.println()方法可以打印任何数据类型,是基于println() 方法对于每一种数据类型都做了方法重载。
3.3 方法调用:方法在定义完毕后,在主方法中调用方法,方法才会执行。
调用方法的几种方式:
- 直接调用:同类中直接写方法名调用;调用异类中的方法用对象名调用,static修饰静态方法用类名调用。
- 赋值调用:调用方法,在方法前面定义变量,接收方法返回值。
- 输出语句调用: 在输出语句中调用方法, System.out.println(方法名()) 。不能用输出语句调用 void 类型的方法。因为方法执行后没有结果,也就打印不出任何内容。
附表: