目录
一个简单的java程序
注释
数据类型
整型
扩展:取值范围中负数范围比正数范围多1
浮点类型
char类型
boolean类型
数据类型的转换关系
变量
变量
常量
运算符
枚举类型
String:字符串
String是不可变的:
扩展:码点与代码单元
输入、输出
标准输入流
标准输出流
数组
数组的拷贝与赋值的区别
这套学习笔记是基于《java核心技术》这套书整理的,里面还添加很多我自己的看法和理解。
public class FristDome { public static void main(String[] args) { System.out.println("我的第一个程序"); } }
java程序是区分大小写的
public关键字是访问修饰符
关键字class后面紧跟类名,类名的命名规范:必须以字母开头,后面数字、字母、下划线可以任意组合,关键字、保留字不可以使用
源代码的文件名必须与公共类的名字相同,并且.java作为扩展名
main方法必须是public static,void表示没有返回值,如果main方法正常退出,java应用程序的退出代码为0,表示成功的运行了程序
每个语句必须以分号来结束
调用成员方法需要使用点号
使用cmd运行java程序
/** * 文档注释 */ public class FristDome { /* 段注释 */ public static void main(String[] args) { // 行注释 System.out.println("我的第一个程序"); } }
java是一种强类型语言,所以每一个变量必须声明一种类型。基本数据类型一共是4类8种
分为:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
long的书写方式:需要使用后缀L或l
十六进制数值需要使用前缀0x或0X
八进制数需要前缀0,例如010对应的八进制数是8
二进制数需要添加前缀0B或0b
java没有无符号形式的整型数据
计算机的负数全部使用补码的形式来实现,(按位取反,末位加一);
因为存在+0,和-0两个数所以将+0定义为0,将-0定义为负数的最小值
推理:
有符号8位 1111 1111 表示-127
再加一表示 1 1000 0000 表示 -128 但是一共就8位 所以舍去最高位
留下的就是 1000 0000 表示-128
通过代码进行验证:number是int变量
void t_1(){ number=0b10000000000000000000000000000000; System.out.println(number); }
运行结果
浮点类型用于表示有小数部分的数值
分为float(4字节)、double(8字节)
double的精度是float的两倍所以被称之为‘双精度数值’
float需要使用后缀F或f
扩展:
当浮点数除0时,不会报出异常。显示的结果是NaN(不是一个数字)
java的浮点数据的计算存在误差例如2.0-1.1由于二进制计算无法精确表示分数1/10,所以计算的结果是0.89999...
void t_1(){ System.out.println(0/0.0); System.out.println(2.0-1.1); }
char类型表示单个字符,使用单引号表示。
在使用过程中一定要慎用‘\u’,因为该转义字符还可以出现在加单引号的字符量或字符串之外的地方。例如:public static void main(String \u005B\u005D args) 表示public static void main(String[] args)
boolean(布尔)类型:有两个值false、true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。
低级类型转换高级类型 自动转换
byte→short→int→long→float→double
char→int (char会转换成ascll码)
高级类型转换低级类型 需要强制类型转换
强制类型转化可能会丢失精度
double x=9.999; int x_i= (int) x; System.out.println(x_i);//9
它不会自动进行四舍五入的运算,要进行四舍五入可以使用Math.round
变量名的定义规范必须是以字母开头并且由字母或数字构成的序列。
Java中,不区分变量的声明与定义
int i;//变量的声明 i=100;//变量的定义 int i=100;//java 不区分声明与定义
java中,利用final关键字声明常量。
常量只能被赋值一次,一旦被赋值之后,就不会在更改了。
final int i=100;
算数运算符:+、-、*、/、%、++、--
/运算是求除法的整数部分,%运算是取模运算(结果的余数部分)
System.out.println(7/2);//3 System.out.println(7%2);//1
自增、自减:
区分++n、n++的区别:前者先进行自增,再执行n语句;后者先进行n语句,再进行自增
关系运算符
位运算
左移:乘以2的n次幂;右移:除以2的n次幂;>>>是逻辑右移:无符号数右移
&,|运算符不采用‘短路’的方式来求值,所以得到计算结果之前两个操作数都需要计算
逻辑运算符
&&、||是‘短路方式’来求值的,如果第一个操作数已经能确定表达式的值,第二个操作数就不必计算了。
赋值运算符 右结合
三元运算符 ?:
condition?expression1:expression2
运算符优先级
数学运算:要使用的类是Math,它里的方法全是类方法
扩展:
void t_1(){ int x=100; x+=2.5;//等同于x=(int)(x+2.5) System.out.println(x);//102 }
当变量的取值只在一个有限的集合内,我们可以使用枚举类型,这样避免了输入的数据不正确的错误。
enum Size{ A,B }; Size s=Size.B;
此时s就是B这个数据
String是一个预定义的类,每一个用双引号括起来的字符串都是String类的实例
获取子串 substring方法 从0开始计数
void t_1(){ String test="ABCDEF"; String substring = test.substring(0, 3);//ABC System.out.println(substring); }
字符串的拼接:使用‘+’即可
String的数值都存放到常量池中,数据是共享的,使用时只需要引用指向这个常量即可。
在常量池中,某个数据长时间不使用,java将自动地进行垃圾回收
String是不可以改变的,但是可以修改其引用的地址(让对象指向另一个数据),使其达到修改String的目的
监测字符串是否相等:equals
equals是判断String对象地内容是否相等
==是判断对象地地址是否相等
void t_1(){ String t_1="A"; String t_2="A"; String t_3 = new String("A"); System.out.println(t_1==t_2);//true System.out.println(t_1==t_3);//false System.out.println(t_1.equals(t_3));//true }
空串与null:
空串是长度为0的字符串,内容为空;null表明没有任何对象与该变量关联
获取首字母:charAt(n) n是索引
1个代码单元等于1个char,1个码点等于一个字符;一个字符可能会需要两个代码单位
分为常规字符串、非常规字符串
(107条消息) java字符串之码点和代码单元_c1776167012的博客-CSDN博客_java string 码点
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String next = scanner.next(); System.out.println(next); }
System.out.print
java沿用了C语言printf方法(格式化输出)
实例
public static void main(String[] args) { // 小数 System.out.printf("%,.3f",2.1111); // 日期 System.out.printf("%tF",new Date()); }
声明数组的格式int[]
定义数组的方式(两种)
int[]a1={1,2,3};//静态定义 int[]a2=new int[3];//动态定义
数组在还未初始化时,里面的元素使用的是默认值:
数字数据:0 boolean:false 引用数据:null
数组的遍历-for each
int[]a1={1,2,3};//静态定义 for (int i : a1) { System.out.println(i); }
简化了原先fori的格式流程,也省去了索引这一变量
数组的拷贝:可以使用 Arrays.copyOf
int[]a1={1,2,3}; int[] ints = Arrays.copyOf(a1, a1.length);
数组的排序:快速排序法 Arrays.sort
二维数组:java只有一维数组,二维数组只是数组的数组,所以可以创建不规则的二维数组
扩展:
数组的拷贝:创建新的地址空间,存储拷贝的数据,拷贝的对象和原数组不会互相干扰
数组的赋值:仅仅将数组指针指向了原数组的地址,两对象会互相干扰