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)。

基本数据类型

引用数据类型:类、接口、数组

整数拓展

  1. 二进制0b、十进制、八进制0、十六进制0x

  2. 注意:最好完全避免使用浮点数进行比较(因为float浮点数本身显示的是有限数字,所以当会进行一定的舍入误差

  3. 当需要精确大数据时候,可以使用类BigDecimal

  4. char类型,都能够通过Unicode表转换为数字型,0-65536

值得注意的是:AscII编码和Unicode编码是有区别的

  • ASCII编码是1个字节,而Unicode编码通常是2个字节。
  • ASCII是单字节编码,无法用来表示中文;而Unicode可以表示所有语言。
  • 用Unicode编码比ASCII编码需要多一倍的存储空间(一个28,另一个是216)。
  1. 转义字符:制表位:\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。

Integer、String和int

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():

  1. 一定要读取到有效字符后才可以结束输入。
  2. 对输入有效字符之前遇到的空白,next()方法会自动去掉。
  3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
  4. 不能够得到带有空格的字符串

nextLine():

  1. 以Enter作为结束符,也就是说nextLine()是在回车之前所有的字符
  2. 可以获得空白字符串

值得注意的一点就是: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中没有值了,它也会要求输入一个值(前面说了它们两都可以输入)。

参考:Java Scanner对象中hasNext()与next()方法的使用

posted @   疯狂的豆包  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示