Java基础知识
Java基础知识
1.关键字
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | fault |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
标识符注意点
- 所有标识符都应该以字母、美元符、或者下划线开头
- 首字母之后可以是字母、美元符、下划线或者数字的任意一种
- 不能使用关键字作为变量名或方法名
- 大小写敏感
2.数据类型
- 强类型语言:要求变量的使用必须燕哥符合规定,所有变量都必须先定义后才能使用
- 弱类型语言:
java中的数据类型分为两个大类:基本数据类型(Primitive Type)和引用数据类型(Reference Type)。
基本数据类型
引用数据类型:类、接口、数组
整数拓展
-
二进制0b、十进制、八进制0、十六进制0x
-
注意:最好完全避免使用浮点数进行比较(因为float浮点数本身显示的是有限数字,所以当会进行一定的舍入误差)
-
当需要精确大数据时候,可以使用类BigDecimal。
-
char类型,都能够通过Unicode表转换为数字型,0-65536
值得注意的是:AscII编码和Unicode编码是有区别的
- ASCII编码是1个字节,而Unicode编码通常是2个字节。
- ASCII是单字节编码,无法用来表示中文;而Unicode可以表示所有语言。
- 用Unicode编码比ASCII编码需要多一倍的存储空间(一个28,另一个是216)。
- 转义字符:制表位:\t、换行符:\n、一个\:\ \ 、一个":\ "、一个':'\、一个回车:\r
什么是字节?
位(bit):是极端及内部数据储存的最小单位,11001100是一个八位二进制数。
字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示。
1B(字节)=8bit(位)
字符:指的是计算机中使用的字母、数字、字和符号
类型转换
语言之间的顺序
byte、short、char -> int -> long -> float -> double(由低到高)
强制类型转换:高->低 (类型)数据
自动类型转换:低->高
注意点
- 不能对布尔值进行转换
- 不能把对象类型转换为不相干的类型
- 在吧高容量转换为低容量的时候,强制转换
- 转换的时候可能存在内存溢出或者精度问题
包装类
作用:使基本类型能够进行对象化处理,能够存入只接收对象的方法。(将基本类型进行包装,使其能够作为对象传入方法中)
基本类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱:基本类型->包装类
拆箱:包装类->基本类型
包装类型的初始值为null
Integer one=new Integer(100);
Integer two=new Integer(100);
System.out.println(one==two);//false
Integer three=100;
System.out.println(three==100);//true
Integer four=100;
System.out.println(three==four);//true
Integer five=200;
System.out.println(five==200);//true
Integer six=200;
System.out.println(five==six);//false
以上解释:
- 和基本类型相同,new是开辟两块不同的空间
- Integer three=100:执行自动装箱。当数值在-128~127之间时,会在缓存区找到这个值。当数值在区间之外时候,只能通过new重新在内存中构造一块空间,所以five==six为false。
``
Double d1=Double.valueOf(100);
System.out.println(d1);//true
Double d2=Double.valueOf(100);
System.out.println(d1==d2);//false
- float和double是没有对象池(缓存区)的,所以d1==d2为false。
3.变量
命名规范
- 所有变量、方法、类名:要求见名知意
- 类成员变量:首字母小写和驼峰原则:dataBase,除了第一个单词以外,后边的单词手字母大写。
- 局部变量:首字母小写和驼峰原则。
- 常量:大写字母和下划线,POT_COLOR
- 类名:首字母大写和驼峰原则。
- 方法名:首字母小写和驼峰原则。
三大变量
成员变量:(类范围内定义的)
静态变量(类变量):用static修饰,随着类的存在而存在(不用创建对象就可以使用)
实例变量(对象变量):不用static修饰,随着对象的存在而存在(必须创建对象之后才可以使用,)
局部变量(方法体范围内定义的):形参、代码块局部变量、方法局部变量
public class Variate {
//常量
final static int date = 20220415;
// 进行赋值
static int age1 = 25;//静态变量
String name1 = "张三";//实例变量
// 未进行赋值
static int age2;//静态变量
String name2;//实例变量
public static void getSalary(){
int salary = 100;//局部变量
System.out.println("获得工资:"+salary);
}
public static void main(String[] args) {
// 输出静态变量
System.out.println(Variate.age1);
System.out.println(Variate.age2);
Variate var = new Variate();
var.name1 = "李四";
var.age1 = 20;
System.out.println(var.name1);
System.out.println(var.age1);
System.out.println(Variate.date);
Variate var2 = new Variate();
System.out.println(var2.name1);
System.out.println(var2.age1);
}
}
类变量与实例变量的区别在于:类变量是该类所有创建对象共有的,其中一个对象将类变量值改变了,其他的对象也会跟着改变;而实例变量是对象私有的,一个对象改变了,其他不会改变。
成员变量与局部变量的区别:
- 定义位置不同:成员变量在类中方法外;局部变量在方法体中或者方法声明中
- 内存中的位置不同:成员变量在堆中(静态变量在方法区中,实例变量在堆中);局部变量在栈中
- 作用域不同:静态的作用域为类,实例变量的作用域为对象,局部变量是方法体内
- 生命周期不一样:成员变量对着对象的创建而存在;随着方法调用而存在
- 初始值不同:成员变量有默认值;局部变量没有默认值,必须定义且赋值。
注意:
java允许局部变量和成员变量重名,局部变量会覆盖成员变量的值。
局部变量是不共享的,不会存在线程安全问题。
编写代码的时候,不要在混淆的边缘试探,比如静态变量和实例变量各司其职。
4.运算符
- 算术运算符:+、-、*、/、%、++、--
- 赋值运算符:=
- 关系运算符:>、<、>=、<=、==、!=、instanceof
- 逻辑运算符:&&、||、!
- 位运算符:&(按位与)、|(按位或)、^(异或)、~(非)、<<(左移运算)、>>(右移运算)、>>>(无符号右移)
- 条件运算符:?
- 扩展赋值运算符:+=、-=、*=、/=
下面重点讲一下:位运算符
a = 1100 0100
b = 0110 1101
a & b = 0100 0100 按位与:两个全为1,则为1;否则为0。
a | b = 1110 1101 按位或:只有有一个为1,则为1,否则为0.
a ^ b = 1010 1001 异或:相同的为1,不相同为0.
c = 00100(4(4)
c << 1 = 01000(8) 左移运算符:相当于二进制数字向左移动一位,十进制数字为乘2
c >> 1 = 00010(2) 右移运算符:相当于二进制数字向右移动一位,十进制数字为除以2
当加入符号之后:
1.左移<<:将一个数对应的二进制表示整体左移,不考虑符号位,左边超出的部分舍弃,右边补零。
正数:以10为例,二进制表现为:
00000000 00000000 00000000 00001010
第一位符号位,0表示正数,1表示负数。左移1位之后为:
00000000 00000000 00000000 00010100
十进制表示为20,相当于乘以2。HashMap扩容时将新容量增加为原来容量的两倍,就是使用左移实现的。
负数:负数的二进制机器码都是以补码的形式存在的(需要先取反码,再+1),正数的补码为原码
以-10为例,二进制表现为:
1111 1111 1111 1111 1111 1111 1111 0110
左移1位的结果为:
1111 1111 1111 1111 1111 1111 11110 1100
十进制为-20,相当于乘2(个人认为,左移的这个0是和前边符号数分开的不能混在一起)
2.右移>>:将一个数对应的二进制表示整体右移,考虑符号位,左边的用原有符号位补充,右边超出的部分舍弃。
正数:以10为例,二进制表现为:
00000000 00000000 00000000 00001010
右移1位:
00000000 00000000 00000000 00000101
十进制表示为5,相当于除以2。ArrayList扩容时将新容量增加为原来的1.5倍,就是使用右移实现的。
负数:以负数-10为例
1111 1111 1111 1111 1111 1111 1111 0110
右移1位
1111 1111 1111 1111 1111 1111 1111 1011
十进制表示为-5,也是相当于除以2。
3.无符号右移>>>:将一个数的二进制表示整体右移,不考虑符号位,左边部分总是以0填充,右边部分舍弃。
正数结果与上面右移一致。
以-10为例
1111 1111 1111 1111 1111 1111 1111 0110
无符号右移1位
01111 1111 1111 1111 1111 1111 1111 1011
十进制表示为2147483643。HashMap中在求一个数最接近的2的N次幂时使用到了无符号右移。
4.扩展
如果一个int型数字左移超过32位,如33位,相当于左移1位,右移、无符号右移同理。
a << n == a << (n % 32)
5.用户交互
Scanner交互
通过java.util.Scanner类进行键盘输入。
具体方法为:
Scanner scanner = new Scanner(system.in);
通过方法next和nextLine提取键盘输入结果。通过hasnext()和hasnextLine()判断是否还有输入。
需要进行关闭:scanner.close();
next和nextLine之间的区别:
next():
- 一定要读取到有效字符后才可以结束输入。
- 对输入有效字符之前遇到的空白,next()方法会自动去掉。
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- 不能够得到带有空格的字符串
nextLine():
- 以Enter作为结束符,也就是说nextLine()是在回车之前所有的字符
- 可以获得空白字符串
值得注意的一点就是:hasNext()和next()都可以用来输入。
下面的代码:
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:");
int str = scanner.nextInt();//第一次输入
if(scanner.hasNextInt()) {//第二次输入
System.out.println("输入结果为:"+str);
}else{
System.out.println("输入结果不为数字");
}
scanner.close();
结果就是:
第一次输入为str;第二次输入则只进行判断。hasNext()的输入只会返回boolean类型,并不能进行结果赋值。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:");
if(scanner.hasNext()) { //第一次输入
int kk = scanner.next();
System.out.println("输入结果为:"+str);
}else{
System.out.println("输入结果不为数字");
}
scanner.close();
结果为:
只进行一次输入。hashasNextInt进行输入,尽管不能进行直接复制,但是它通过scanner利用nextint进行了复制。
总结:
hasNext()可以理解为把我们输入的值存到了scanner中,而next()可以理解为从sc中取值,取值后将标识符后移(可以理解为:取完值后这个值就不在了),如果scanner中没有值了,它也会要求输入一个值(前面说了它们两都可以输入)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App