Java基本语法

📜个人简介

⭐️个人主页:微风洋洋🙋‍♂️
🍑博客领域:编程基础💡,后端💡,大数据,信息安全
🍅写作风格:干货,干货,还是tmd的干货
🌸精选专栏【JavaScript】【HTML+CSS】【Java学习笔记】【Java必刷题】
🚀支持洋洋:点赞👍、收藏⭐、留言💬

好久不见,甚是想念!
大家好

我是洋洋 这是Java学习笔记的第二篇。今天这篇文章向大家详细的介绍了Java基本语法,包括关键字、标识符、变量、基本数据类型及其间的转换、各种编码和各种运算符,全程干货,尽情享用。下一篇将介绍程序流程控制~

一、关键字和保留字

关键字(keyword)的定义和特点
定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:关键字中所有字母都为小写

官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
微风洋洋
微风洋洋
严格来说,true,false,null 不算关键字,但是要把它当做关键字看,不能用他们作为标识符当然这些关键字不用记忆,后面写代码写多了都会有印象。

Java 保留字:现有 Java 版本尚未使用,但以后版本可能会作为关键字使
用。
自己命名标识符时要避免使用这些保留字。例如:goto、const


二、标识符

标识符

Java 对各种变量、方法和类等要素命名时使用的字符序列(单词)称为标识符
理解技巧:凡是自己可以起名字的地方都叫标识符。
比如:类名、变量名、方法名、接口名、包名…

定义合法标识符规则

  1. 由 26 个英文字母大小写,0-9,_或 $ 组成

  2. 数字不可以开头。

  3. 不可以使用关键字和保留字,但能包含关键字和保留字(如public1)。

  4. Java 中严格区分大小写,长度无限制。

  5. 标识符不能包含空格。

练习:miles, Test, a++, --a, 4#R, $4, #44, apps, class, public, int, x, y, radius

Java 中的名称命名规范

  • 包名:多单词组成时所有字母都小写:xxxyyyzzz

  • 类名、接口名:多单词组成时,所有单词的首字母大写(大驼峰):XxxYyyZzz

  • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写(小驼峰):xxxYyyZzz

  • 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

如果不遵守规范,编译也可以通过,但建议大家遵守!

注意 1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
注意 2:java 采用 unicode 字符集,因此标识符也可以使用汉字声明,但是不建议使用。
更多细节可以详见《代码整洁之道》

三、变量

变量的概念

内存中的一个存储区域
该区域的数据可以在同一类型范围内不断变化
变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值

声明变量
语法:<数据类型> <变量名称>
例如:int var;
变量的赋值
语法:<变量名称> = <值>
例如:var = 10;
声明和赋值变量
语法: <数据类型> <变量名> = <初始化值>
例如:int var = 10;

变量的作用:
用于在内存中保存数据

使用变量注意:

  • Java 中每个变量必须先声明(定义且赋值),后使用

  • 使用变量名来访问这块区域的数据

  • 变量的作用域:其定义所在的一对{ }内

  • 变量只有在其作用域内才有效

  • 同一个作用域内,不能定义重名的变量

变量的分类

变量的分类-按数据类型

对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分配了不同大小的内存空间。
微风洋洋

变量的分类-按声明的位置的不同
微风洋洋

在方法体外,类体内声明的变量称为成员变量。
在方法体内部声明的变量称为局部变量。

注意:二者在初始化值方面的异同:
同:都有生命周期
异:局部变量除形参外,需显式初始化。


整数类型:byte、short、int、long

Java 各整数类型有固定的表数范围和字段长度,不受具体 OS 的影响,以保
证 Java 程序的可移植性。

Java 的整型常量默认为 int 型,声明 long 型变量,必须以‘l’或‘L’结尾
long a=124548784L

编译两个小细节

long l = 123456;
System.out.printIn(l);  //输出为123456
//有人会问这个没加L不是也没报错吗,这是把123456默认为int型了,
//然后把int型的123456赋值给long型的l,是自动类型提升

long l1 = 23485787845775555979  //这时就会报错了,因为你没加l,
//默认为int型,但是这个数值超出int的范围,所以报错

//在延伸一下,若果float不加f呢
float f1 = 12.3;  //编译失败,默认int<long,可以自动类型提升,但默认double>float,

//整型常量,默认为int型,浮点常量默认为double型
byte b = 2;
byte c = b + 1;//报错

java 程序中变量通常声明为 int 型,除非不足以表示较大的数,才使用 long

微风洋洋


浮点类型:float、double

浮点型有两种表示形式:
float:单精度,尾数可以精确到 7 位有效数字。很多情况下,精度很难满足需求。
double:双精度,精度是 float 的两倍。通常采用此类型。

Java 的浮点型常量默认为 double 型,声明 float 型常量,变量要以‘f’或‘F’。
通常定义浮点变量时,使用 double

微风洋洋

浮点型表示带小数点的数值,flaot 表示数值的范围比 long 还大,因为它有一部分是存数值,另一部分表示 10 的多少次幂,直接扩容了很多倍,但精度不是很高


字符类型:char

char 型数据用来表示通常意义上“字符”(2 字节)

Java 中的所有字符都使用 Unicode 编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。

字符型变量的三种表现形式:

  1. 字符常量是用单引号(‘ ’)括起来的单个字符。
    例如:char c1 = ‘a’; char c2= ‘中’; char c3 = ‘9’;

  2. Java 中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。
    例如:char c3 = ‘\n’;
    微风洋洋

  3. 直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中,XXXX 代表一个十六进制整数。
    如:\u000a 表示 \n, 即 Unicode 编码数值为 000a 对应的字符为表示 \n。

char 类型是可以进行运算的。因为它都对应有 Unicode 码。


了解:ASCII 码

  1. 在计算机内部,所有数据都使用二进制表示。每一个二进制位(bit)有 0 和 1 两种状态,因此 8 个二进制位就可以组合出 256 种状态,这被称为一个字节(byte)。一个字节一 共可以用来表示 256 种不同的状态,每一个状态对应一个符号,就是 256 个符号,从 0000000 到 11111111。

  2. ASCII 码:上个世纪 60 年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码。ASCII 码一共规定了 128 个字符的编码,比如空格“SPACE”是 32(二进制 00100000),大写的字母 A 是 65(二进制 01000001)。这 128 个符号(包括 32 个不能打印出来的控制符号),只占用了一个字节的后面 7 位,最前面的 1 位统一规定为 0。

  3. 缺点:
    1.不能表示所有字符。
    2.相同的编码表示的字符不一样:比如,130 在法语编码中代表了é,在希伯来语编码中却代表了字母 Gimel (ג)


了解:Unicode 编码

  • 乱码:世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因 此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。

  • Unicode:一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一
    无二的编码,使用 Unicode 没有乱码的问题。

  • Unicode 的缺点:Unicode 只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储:无法区别 Unicode 和 ASCII:计算机无法区分三个字节表示一个符号还是分别表示三个符号。另外,我们知道,英文字母只用一个字节表示就够了,如果 unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0,这对于存储空间来说是极大的浪费。

了解:UTF-8

UTF-8 是在互联网上使用最广的一种 Unicode 的实现方式。

UTF-8 是一种变长的编码方式。它可以使用 1-6 个字节表示一个符号,根据
不同的符号而变化字节长度。

UTF-8 的编码规则:

  • 对于单字节的 UTF-8 编码,该字节的最高位为 0,其余 7 位用来对字符进行编码(等同于ASCII 码)。

  • 对于多字节的 UTF-8 编码,如果编码包含 n 个字节,那么第一个字节的前 n 位为 1,第一个字节的第 n+1 位为 0,该字节的剩余各位用来对字符进行编码。在第一个字节之后的所有的字节,都是最高两位为"10",其余 6 位用来对字符进行编码。

布尔类型:boolean

boolean 类型用来判断逻辑条件,一般用于程序流程控制:
if 条件控制语句;
while 循环控制语句;
do-while 循环控制语句;
for 循环控制语句;

boolean 类型数据只允许取值 true 和 false,无 null。

不可以使用 0 或非 0 的整数替代 false 和 true,这点和 C 语言不同。

boolean b=ture;
System.out.printIn(b);
 
boolean isMarried = true;
if(isMarried){
  System.out.printIn("你就不能参加\"单身\"party 了!\\n 很遗憾");
}else{
  System.out.printIn("你可以多谈谈女朋友!");
}

Java 虚拟机中没有任何供 boolean 值专用的字节码指令,Java 语言表达所操作的 boolean 值,在编译之后都使用 java 虚拟机中的 int 数据类型来代替:true 用 1 表示,false 用 0 表示。
———《java虚拟机规范 8版》


字符串类型:String

String不是基本数据类型,属于引用数据类型

使用方式与基本数据类型一致。

String str = “abcd”;
String s2 = "a";
String s3 = "";
char s4 = '';//编译不通过

String可以和8种基本数据类型变量做运算,且运算只能是连接运算:+
运算结果还是String类型

String str = “abcd”;
str = str + “xyz” ;         //abcdxyz
int n = 100; str = str + n;   //abcdxyz100

判断+是加法还是连接:+前后两个要运算的有一个是字符串就是连接,没有就是加法

//练习1
char c = 'a';   //a:97  A:65
int number = 10;
String str = "hello";
System.out.printIn(c + num + str);        //107hello
System.out.printIn(c + str + num);        //ahello10
System.out.printIn(c + (num + str));      //a10hello
System.out.printIn(str + num +c);         //hello10a

//练习2
//输出效果:*  *
System.out.printIn("*  *");                 //*  *
System.out.printIn('*' + '\t' + '*');       //93
System.out.printIn('*' + "\t" + '*');       //*  *
System.out.printIn('*' + '\t' + "*");       //51*
System.out.printIn('*' + ('\t' + "*"));     //*  *

//练习3 判断对错及输出
String str1 = 4;                           //false
String str2 = 3.5f + “”;                   //true
System.out.println(str2);                  //"3.5" 
System.out .println(3+4+“Hello!”);         //7Hello!
System.out.println(“Hello!”+3+4);          //Hello!34
System.out.println(‘a’+1+“Hello!”);        //98Hello!
System.out.println(“Hello”+‘a’+1);         //Hello!a1

基本数据类型转换

自动类型提升

前提:这里讨论的只是 7 中基本数据类型变量间的运算,不包含 boolean 类型的。

容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:

微风洋洋

byte,short,char 之间不会相互转换,他们三者在计算时首先转换为 int 类型。boolean 类型不能与其它数据类型运算。

说明:此时的容量大小指的是,表示数的范围的大和小。
比如:float 的容量大于 long 的容量

有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。

当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型。

强制类型转换

自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:() 但可能造成精度降低或溢出,格外要注意。

//强制类型转换可能会导致精度损失
int i = 128;
byte b = (byte)i;//byte数值范围是-128——127
System.out.printIn(b);   //-128

通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
如:String a = “43”; int i = Integer.parseInt(a);

boolean 类型不可以转换为其它的数据类型。

进制与进制间的转换

世界上有10种人 ,认识和不认识二进制的。

所有数字在计算机底层都以二进制形式存在。

对于整数,有四种表示方式:

  • 二进制(binary):0,1 ,满2进1.以0b或0B开头。

  • 十进制(decimal):0-9 ,满10进1。

  • 八进制(octal):0-7 ,满8进1. 以数字0开头表示。

  • 十六进制(hex):0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。如:0x21AF +1= 0X21B0

微风洋洋
微风洋洋

Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;当是long类型时,二进制默认占64位,第64位是符号位

  • 二进制的整数有如下三种形式:
    原码:直接将一个数值换成二进制数。最高位是符号位
    负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
    负数的补码:其反码加1。
  • 计算机底层都以二进制补码的形式保存所有的整数。
    正数的原码、反码、补码都相同
    负数的补码是其反码+1

下面以byte类型的-14为例:
微风洋洋
微风洋洋
从这我们也可以看出byte的范围是-128——127

进制的基本转换

  1. 十进制 二进制互转
    二进制转成十进制 乘以2的幂数
    十进制转成二进制 除以2取余数(倒着排一下)

  2. 二进制 八进制互转
    二进制转成八进制(每三位计算合并为一位)
    八进制转出二进制(每一位计算拆开为三位)

  3. 二进制 十六进制互转
    二进制转成十六进制(每四位计算合并为一位)
    十六进制转成二进制(每一位计算拆开为四位)
    微风洋洋
    微风洋洋
    微风洋洋

四、运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符
赋值运算符
比较运算符(关系运算符)
逻辑运算符
位运算符
三元运算符

算术运算符

微风洋洋

对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。

class AriTest{
  public static void main(String[] args){
     int num1 = 12;
     int num2 = 5;
     int result1 = num1 / num2;
     System.out.printIn(result1);      //2
     
      int result2 = num1 / num2 * num2;
      System.out.printIn(result2);     //10
      
      double result3 = num1 / num2;
      System.out.printIn(result3);     //2.0
      
      double result4 = num1 / num2 + 0.0;   //2.0
      double result5 = num1 / (num2 +0.0);   //2.4
      double result6 = (double)num1 / num2;   //2.4
      double result7 = (double)(num1 / num2);   //2.0
  }
}

如果对负数取模,可以把模数负号忽略不记, 与被模数符号相同。开发中常用%来判断能否被除尽的情况。此外,取模运算的结果不一定总是整数。

class AriTest{
  public static void main(String[] args){
    int m1 = 12;
    int n1 = 5;
    System.out.printIn("m1 % n1 =" + m1 % n1);     //2
    
    int m2 = -12;
    int n2 = 5;
    System.out.printIn("m2 % n2 =" + m2 % n2);      //-2  
    
    int m3 = 12;
    int n3 = -5;
    System.out.printIn("m3 % n3 =" + m3 % n3);       //2 
    
    int m4 = -12;
    int n4 = -5;
    System.out.printIn("m4 % n4 =" + m4 % n4);        //-2

    }
  }

++ –
注意点:自增1不会改变本身变量的数据类型
short s1 = 10;
s1 = (short)(s1 + 1); //等价于 s1++;

赋值运算符

符号:=
当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
支持连续赋值。int i,j ; i = j =10;

扩展赋值运算符: +=, -=, *=, /=, %=
int num = 10;
num += 2; // num = num + 2;
num %=5; // num = num % 5;

两者区别:扩展赋值运算符不会改变本身变量的数据类型
short s = 10;
s = s + 10; //编译失败,但是s += 10;编译成功

比较运算符

微风洋洋

比较运算符的结果都是boolean型,也就是要么是true,要么是false。
比较运算符“==”不能误写成“=” 。

boolean b1 = ture;
boolean b2 = false;
System.out.printIn(b2 == b1);  //false
System.out.printIn(b2 = b1);   //ture

boolean b1 = false;
//区分好==和=的区别。
if(b1==true)
System.out.println("结果为真");
else
System.out.println("结果为假");//输出:结果为假

boolean b1 = false;
//区分好==和=的区别。
if(b1=true)
System.out.println("结果为真");
else
System.out.println("结果为假");//输出:结果为真

逻辑运算符

微风洋洋

微风洋洋

  • 逻辑运算符用于boolean类型的变量
    在Java中不可以写成3<x<6,应该写成x>3 & x<6 。

  • “&”和“&&”的区别:
    单&时,左边无论真假,右边都进行运算;
    双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
    “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。

  • 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。理解:异或,追求的是“异”!

位运算符

微风洋洋

注意:无<<<
位运算是直接对整数的二进制进行的运算
微风洋洋

<<和>>
在这里插入图片描述

微风洋洋
微风洋洋

经典面试题:最高效的方式计算2*8? 2<<3或8<2

& l ^~
微风洋洋
微风洋洋
微风洋洋

//交换两个变量的值
int num1 = 10;
int num2 = 20;
System.out.printIn("num1 = " + num1 + ",num2 = " + num2);

//方式一:定义临时变量的方式(推荐)
int temp = num1;
num1 = num2;
num2 = temp;

//方式二 好处:不用定义临时变量
//弊端:1.相加操作可能会超出存储范围 2.有局限性:只能适用于数值类型
//num1 = num1 + num2;
//num2 = num1 -num2;
//num1 = num1 - num2;

//方式三:使用位运算符
//有局限性:只能适用于数值类型
//num1 = num1 ^ num2;
//num2 = num1 ^ num2;
//num1 = num1 ^ num2;

三元运算符

格式:
(条件表达式)?表达式1:表达式2;

条件表达式结果为boolean类型
如果结果为true,执行表达式1;否则为false,则执行表达式2;

表达式1和表达式2要求是一致的,可以嵌套使用
(条件表达式)?表达式1:((条件表达式)?表达式2:表达式3)

练习: 获取两个数中的较大数获取三个数中的较大数

int n1 =12;
int n2 = 30;
int n3 = 32;

int max1 = (n1 > n2)? n1 : n2;
int max2 = (max1 > n3)? max1 : n3;
System.out.printIn(max3);

三元运算符与if-else的联系与区别:
凡是使用三元运算符的都可以使用if-else ,但反之不成立(考虑表达式1、2不同)
同时可以使用时,优先选择三元运算符,更加简洁、执行效率高

运算符的优先级
运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。

只有单目运算符、三元运算符、赋值运算符是从右向左运算的。
由高到低
微风洋洋

关注,即可提高学习效率。Perfect!

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微风洋洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值