基本语法

学习目标:

1. 数据类型
2. 变量
3. 编码介绍
4. 标识符和关键字
5. 字符串类型
6. 数据类型转化
7. 进制转换
8. 运算符

一、数据类型

什么是数据类型?

在开发软件的过程中,我们需要将软件的数据按照类型划分存储到jvm中,才能保证软件的计算,运行。

例如 1是整数 2.2是小数。

1.1 数据类型的划分

数据类型可以分为基本数据类型和引用数据类型。

基本数据类型是指java语言的原始支持的数据类型,引用数据类型指的是我们按照java语法定义的数据类型。

数据类型划分如下:

综上所示,八大基本数据类型包括 byte、short 、int、 long 、float、double、char、boolean;引用类型包括数组、类、接口、枚举、注解。

1.2 数据存储单位

计算机底层采用二进制01存储数据;

计算机底层使用8位01数字作为一个整体来存储数据,这个整体被称为字节;即计算机的最小存储单位是字节byte,1字节=8位10;

八大基本数据类型的以及存储大小如下:

boolean类型占几个字节官网并没有给出明确的说明,char类型占几个字节和使用的字符编码有关后面详细说明。

字节是最小单位,除此之外还有其他存储单位:kb mb gk tb ,它们的换算关系如下:

1.3 小节

  1. 八大基本数据类型有什么?存储大小是多少?

byte 1 short 2 int 4 long 8 float 4 double 8 char 2 boolean 1

二、变量与常量

2.1 什么是变量?

内存中的一个存储区域

该区域的数据可以在同一类型范围内不断变化

变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值

2.2 变量声明与调用

变量的声明与调用语法如下

定义变量需要注意以下几点:

  • Java中每个变量必须先声明,后使用
  • 使用变量名来访问这块区域的数据
  • 变量的作用域:其定义所在的一对{ }内
  • 变量只有在其作用域内才有效
  • 同一个作用域内,不能定义重名的变量

示例1 : 分别通过声明、字面量的方式定义变量,并打印输出

/**
* 变量的定义
*/
public class VariableDemo { public static void main(String[] args) {
//声明变量
int a;
//赋值
a = 1;
System.out.println(a);
//赋值
a = 2;
System.out.println(a);
//声明变量并赋值
int b = 1;
System.out.println(b);
//声明多个变量
int c,d,e;
c = 1;
d = 2;
e = 3;
System.out.println(c);
System.out.println(d);
System.out.println(e);
//声明多个字面量
int i=1, j=2, k=3;
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
}

2.3 八大基本数据类型定义

在定义八大基本数据类型之前,我们先说明一下需要注意的地方。

整数: 存储整数

  • JAVA的整型常量默认为 int 型,声明long类型常量须后加‘l’或‘L’

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

浮点数:计算机无法准确存储小数,数值会有上下浮点,故叫浮点数

  • float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。
  • double:双精度,精度是float的两倍。通常采用此类型。
  • Java 的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’。

字符: char 类型数据表示字符 。字符类型数据声明必须用'' 引用起来 。由于Java中的所有字符都使用Unicode编码,字符类型 可以存取 一个 英文字符,一个数字字符,一个汉字等。

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

  • Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。 例如:char c1 = '\n' char c2 = '\t';

  • 直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。例如:

    char c = '\u0043'; 表示一个字符C

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

  • 常见的转义字符有:

    • \r 回车
    • \n换行
    • \t 制表位

布尔类型 : 表示真假类型,true代表真,false代表假的。一般用于程序流程控制:

  • if条件控制语句;
  • while循环控制语句;
  • do-while循环控制语句;
  • for循环控制语句;

示例:定义八大基本数据类型

/**
* 八大基本数据类型定义
*/
public class PrimitiveType {
public static void main(String[] args) {
//定义整数
byte a = 1;
short b = 2;
int c = 3;
long d = 4L;
//定义小数
float e = 5.1F;
double f = 5.5;
//定义字符
char g = 'a';
g = '\r';
g = '\u0043';
//定义布尔
boolean h = true;
h = false;
}
}

2.4 定义常量

什么是常量?

被final修饰的变量就是常量,常量的值不能改变。

示例:

/**
* 常量的定义
*/
public class ConstantDemo {
public static void main(String[] args) {
//定义整数常量
final byte b1 = 1;
final short b2 = 2;
final int b3 = 3;
final long b4 = 4L;
//定义浮点数常量
final float b5 = 5.1F;
final double b6 = 6.6;
//定义字符常量
final char b7 = 'a';
//定义布尔常量
final boolean b8 = true;
}
}

2.5 标识符与关键字

刚才定义的变量名的时候没有强调,实际上名字的定义是有着严格的规则和规范的;如下详细讲解

什么是标识符?

Java 对各种变量、方法和类等要素命名时定义的名字就是标识符

定义变量名要遵循的规则:

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

  • 数字不可以开头。

  • 不可以使用关键字和保留字,但能包含关键字和保留字。

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

  • 标识符不能包含空格。

标识符命名规范:

  • 包名:多单词组成时所有字母都小写:xxxyyyzzz
  • 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
  • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个 单词首字母大写:xxxYyyZzz
  • 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

示例

/**
* 标识符
*/
public class IdentifierDemo {
public static void main(String[] args) {
//数字不能开头
//int 1a = 2;
//数字字母_$组成
int a1_$ = 3;
//驼峰式
int userAge = 12;
final char USER_SEX = '女';
}
}

什么是关键字?

被Java语言赋予了特殊含义,用做专门用途的字符串(单词)

常见关键字如下

2.6 小节

  1. java的八大基本数据类型有什么?

  2. java的引用数据类型有什么?

  3. 如何定义八大基本数据类型变量、常量?

  4. 标识符规则与规范是什么?

  5. 什么是关键字?列举一二?

三、字符串类型与转义字符

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

使用方式与基本数据类型一致。例如:String str = “abcd”; 注意:字符串类型必须用“” 引起来。

一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。例如:

/**
* 字符串使用
*/
public class StringDemo {
public static void main(String[] args) {
//字符串可以和字符串拼接+
String str = "hello";
String str2 = "world";
System.out.println(str+str2);
//字符串和任何数据类型拼接的结果都是字符串
int a = 12;
boolean b = true;
String str3 = "hello";
System.out.println(str3+a+b);
}
}

字符串中应用转义字符

  • \r\n回车换行一般连用
  • \t代表一个制表位

示例:

public class StringDemo2 {
public static void main(String[] args) {
System.out.println("胖叔讲\tjava\r\n胖叔讲\tjava");
}
}

四、数据类型转换

4.1自动转换

小容量的数据类型转大容量的数据类型可以自动转换。

4.2 强制转换

大容量的数据转小容量的数据类型为强制转换 。

例如 int类型强制转换为btey类型:int a = 4; byte b = (byte)a; 强制类型转换可能出现精度降低或溢出。

示例 1

/**
* 基本数据类型转换演示
*/
public class TypeConversionDemo {
public static void main(String[] args) {
//自动转换
byte a = 1;
long b = a;
System.out.println(b);
// 'a' 和97的底层unicode码一样所以‘a’自动转为97
char c = 'a';
int d = c;
System.out.println(d);
//强制转换(注意越界问题)
int e = 128;
byte j = (byte)e;
System.out.println(j);
}
}

示例 2

/**
* 强制转换精度溢出问题
*/
public class TypeConversionDemo2 {
public static void main(String[] args) {
int i = 128;
byte j = (byte)i;
System.out.println(j);//结果-128
}
}

4.3 小结

  1. 自动转换?
  2. 强制转换?

五、进制转换

计算机底层是通过二进制存储数据的, 二进制数据是用0和1两个数码来表示的数;进位规则是“逢二进一”,借位规则是“借一当二”。

java语言中支持四种进制存储整数:二进制、十进制、八进制、十六进制。

5.1 四种进制整数

在java语言中,支持四种进制表示整数:二进制、十进制、八进制、十六进制;表示方式如下所示:

示例代码如下:

/**
* 二进制、十进制、八进制、十六进制演示
*/
public class SystemDemo {
public static void main(String[] args) {
//二进制0b开头
int a = 0b110;
System.out.println(a);
//十进制
int b = 12;
System.out.println(b);
//八进制 0开头
int c = 010;
System.out.println(c);
//十六进制 0x开头
int d = 0x1A;
System.out.println(d);
}
}

5.2 二进制

5.2.1 什么是原码、反码、补码

计算机底层是采用二进制存储数据的,这里我们详细讲解二进制存储数据。

java整数默认是int类型,用二进制表示整数时,其第32位是符号位;当是long类型时,二进制默认是64位,第64位是符号位;符号位0代表正数,1代表负数。

二进制的整数有三种表示形式:

  • 原码:直接将一个数值转换成二进制数。最高位是符号位。
  • 反码:正数的反码就是原码,负数的反码是对原码取反只是最高位(符号位)确定是1。
  • 补码:正数的补码就是原码,负数的补码就是反码加1。

示例:为了大家更好的理解原码、反码、补码、我们用byte类型表示整数

5.2.2 原码、反码、补码的作用

但是为什么要有反码和补码呢?

计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法。我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了。

计算机以二进制补码的形式 存储数据,就可以通过加法完成负数的加法运算了。

示例:

结论原码-原码 等于 补码+补码

5.2.3 进制转换

进制转换的过程是一样的,这里我们以二进制与十进制转换为例。

二进制转十进制过程如下:

练习:

二进制1000 转为十进制是多少?二进制1100转十进制是多少?

十进制转二进制过程如下

练习:

十进制8,9转为二进制是多少?

5.3 小结

  1. 如何表示二进制、八进制、十进制、十六进制数据
  2. 进制转换
  3. 原码、反码、补码的概念

六、运算符

运算符是一种特殊的符号,用来表示数据的运算、赋值、比较等操作;运算符包括以下几种:

  • 算术运算符
  • 赋值运算符
  • 比较运算符(关系运算符)
  • 逻辑运算符
  • 位运算符
  • 三元运算符

6.1 算术运算符

算术运算符语法如下:

注意:

% 取模运算,结果的符号只和被取模数有关,被取模数是正数,结果就是正数;被取模数是负数,结果就是负数;例如 -3%2 = -1 3%-2=1 -3%-2 = -1;

/除法运算,整数除以整数只保留整数部分,舍弃小数部分,结果一定是整数;如7/3 = 2 ;

"+"除字符串相加外,还能把非字符串转换成字符串。例如"胖叔"+"讲java"+5+5 结果为"胖叔讲java55"

示例1:

/**
* 算术运算符
*/
public class ArithmeticOperator {
public static void main(String[] args) {
int i = -3;
int j = 5;
System.out.println(i+j);
System.out.println(i-j);
System.out.println(i*j);
System.out.println(i/j);
System.out.println(i%j);
}
}

示例2:

/**
* 算术运算符:自增
*/
public class ArithmeticOperator2 {
public static void main(String[] args) {
int i = 1;
int j = 1;
int k = i++;
int m = ++j;
System.out.println(i);
System.out.println(j);
System.out.println(k);
System.out.println(m);
}
}

示例3:

/**
* 算术运算符:自增、自减运算
*/
public class ArithmeticOperator3 {
public static void main(String[] args) {
int i = 1;
int j = 1;
System.out.println(i++ + ++i + i-- + --i + j++);
}
}

练习:

  1. int i = 3 ; int j = -2; i/j等于多少?
  2. int i = 3 ; int j= -2 ; i%j等于多少?

6.2 赋值运算符

赋值运算符语法如下:

示例:

/**
* 赋值运算符
*/
public class AssignmentOperator {
public static void main(String[] args) {
int i = 1;
i += 2;
System.out.println(i);
i -= 1;
System.out.println(i);
i *= 3;
System.out.println(i);
i /= 2;
System.out.println(i);
i %= 2;
System.out.println(i);
}
}

6.3 比较运算符

比较运算符语法如下:

示例:

/**
* 比较运算符
*/
public class ComparisonOperator {
public static void main(String[] args) {
int i = 1;
int j = 3;
System.out.println(i==j);
System.out.println(i!=j);
System.out.println(i<j);
System.out.println(i>j);
System.out.println(i<=j);
System.out.println(i>=j);
}
}

6.4 逻辑运算符

逻辑运算符语法如下:

示例:

/**
* 逻辑运算符
*/
public class LogicalOperator {
public static void main(String[] args) {
System.out.println("逻辑与:");
System.out.println(true&true);
System.out.println(false&false);
System.out.println(true&false);
System.out.println(false&true); System.out.println("短路与:");
System.out.println(true&&true);
System.out.println(false&&false);
System.out.println(true&&false);
System.out.println(false&&true); System.out.println("逻辑或:");
System.out.println(true|true);
System.out.println(false|false);
System.out.println(true|false);
System.out.println(false|true); System.out.println("短路或:");
System.out.println(true||true);
System.out.println(false||false);
System.out.println(true||false);
System.out.println(false||true); System.out.println("取反:");
System.out.println(!true);
System.out.println(!false); System.out.println("异或:");
System.out.println(true^true);
System.out.println(false^false);
System.out.println(true^false);
System.out.println(false^true);
}
}

注意:

& 和 && 的区别

  • &:左边无论真假,右边都进行运算;
  • &&:如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

| 和 || 的区别

  • |:左边无论真假,右边都进行运算;
  • ||:如果左边为假,右边参与运算,如果左边为真,那么右边不参与运算。

示例:

/**
* 逻辑运算符&和&&的区别,|和||区别
*/
public class LogicalOperator2 {
public static void main(String[] args) {
int i = 1;
int j = 0;
//System.out.println(i*j==1 & i/j==0); 报错
System.out.println(i*j==1 && i/j==0);
//System.out.println(i*j==0 | i/j==0); 报错
System.out.println(i*j==0 || i/j==0);
}
}

练习:

int i = 1; 判断如下表达式的运行结果:

i<0 & i/0==0

i<0 && i/0==0

i>0 | i/0==0

i>0 || i/0==0

6.5 位运算符

位运算是直接对整数的二进制进行的运算;具体运算符如下:

刚才讲了计算机存储的是整数的二进制的补码,所以我们在位运算之前要先把数字转成二进制补码在进行位运算

2<<3 的过程如下:

-2<<3的过程如下:

总结:不管是正数左位移还是负数左位移过程是一样的,舍弃左边移除的高位,右边空位补0。

4>>1的过程如下

-4>>1的过程如下

总结:正数右移位,左边空缺位补0,右边移除位舍弃;负数右移位,左边 空缺位补1,右边移除位舍弃。

4>>>1的过程如下

-4>>>1的过程如下

总结: 无符号只有右移位,没有左移位,左边空缺位始终补0,右边移除位舍弃。

6&3 的运行过程如下

6|3 的运行过程如下

6^3 的运行过程如下

~6的取反过程如下

示例:Integer.toBinaryString(int number) 将十进制整数转为二进制代码(后面详细讲,先用)

package top.psjj;

/**
* 位移运算
*/
public class ShiftOperator {
public static void main(String[] args) {
//左位移
System.out.println(2<<3);
//查看二进制代码Integer.toBinaryString(int n)将整数转为二进制代码
System.out.println(Integer.toBinaryString(2<<3));
//左位移
System.out.println(-2<<3);
//查看二进制代码Integer.toBinaryString(int n)将整数转为二进制代码
System.out.println(Integer.toBinaryString(-2<<3)); //右位移
System.out.println(4>>1);
System.out.println(Integer.toBinaryString(4>>1));
System.out.println(-4>>1);
System.out.println(Integer.toBinaryString(-4>>1)); //无符号右位移
System.out.println(4>>>1);
System.out.println(Integer.toBinaryString(4>>>1));
System.out.println(-4>>>1);
System.out.println(Integer.toBinaryString(-4>>>1)); //按位与
System.out.println(6&3);
System.out.println(Integer.toBinaryString(6&3)); //按位或
System.out.println(6|3);
System.out.println(Integer.toBinaryString(6|3)); //异或
System.out.println(6^3);
System.out.println(Integer.toBinaryString(6^3)); //取反
System.out.println(~6);
System.out.println(Integer.toBinaryString(~6));
}
}

6.6 三目运算符

三目运算符语法如下:

示例:

/**
* 三目运算符
*/
public class TernaryOperator {
public static void main(String[] args) {
int i = 5;
System.out.println(i>0?"大于":"小于");
}
}

6.7 运算符优先级

运算符优先级如下表所示

6.8 小结

  1. 一共由几类运算符?
  2. &和&&的区别?
  3. |和||的区别?

七、编码

7.1 什么是ASCII码

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

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

缺点 :

  • 不能表示所有字符。
  • 不能表示中文。

7.2 unicode编码

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

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

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

0101010101001 A 1010010101010100101010 我 10101001 中

7.3 utf-8编码

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

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

7.4 gbk编码

gbk 国家标准 扩展码,中国人写的专门存储中文和英文字母的编码。

缺点:不能存储除中文和英文之外的字符。

扩展:ISO-8859-1编码 世界国际标准编码

7.5 小结

  1. utf-8和gbk编码的区别
  2. unicode与utf-8的区别

八、总结

  1. 八大基本数据类型有什么?
  2. 标识符规则与规范?
  3. final的作用?
  4. 数据类型转换?
  5. 原码、反码、补码?
  6. 运算符?
  7. utf-8和gbk的区别?

最新文章

  1. C++中extern关键字用法小结
  2. Sypder上手
  3. python中多进程(multiprocessing)
  4. 记一次 Ubuntu 使用 arptables 抵御局域网 ARP 攻击
  5. JS 之DOM对象(2)
  6. 【poj2728】Desert King
  7. 为你的PHP程序选择合适的密码库(初稿)
  8. php中的修饰符
  9. objective-c(初始化)
  10. STL系列
  11. TP3.2.3 接入银联支付
  12. Spring MVC Restful Put方法无法获取参数值
  13. MediatR 知多少
  14. Tomcat与Nginx服务器的配合使用及各自的区别
  15. AHOI(十二省联考)2019 退役记
  16. 全面理解Java内存模型(JMM)及volatile关键字
  17. python中的变量和算数运算
  18. java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servlet.Servlet
  19. Properties 类的使用
  20. a 超链接标签

热门文章

  1. tuandui last
  2. Event Loop 是什么?
  3. DOM 事件与事件委托
  4. c++动态内存分配需要注意的地方,可以不用尽量不用
  5. 好客租房55-props深入(2props校验)
  6. .NET C#基础(4):属性 - 本质是方法
  7. 优先队列STL
  8. Linux安装netstat命令
  9. Git使用 - 忽略特定文件 - gitignore
  10. BUUCTF-LSB