Java学习-2.简介、关键字、标识符、变量、数据类型、运算符
一、Java简介
Java最早是由SUN公司(已被Oracle收购)的詹姆斯·高斯林(高司令,人称Java之父)在上个世纪90年代初开发的一种编程语言,最初被命名为Oak,目标是针对小型家电设备的嵌入式应用,结果市场没啥反响。谁料到互联网的崛起,让Oak重新焕发了生机,于是SUN公司改造了Oak,在1995年以Java的名称正式发布,原因是Oak已经被人注册了,因此SUN注册了Java这个商标。随着互联网的高速发展,Java逐渐成为最重要的网络编程语言。
随着Java的发展,SUN给Java又分出了三个不同版本:
-
Java EE:Enterprise Edition,企业版,它只是在Java SE的基础上加上了大量的API和库,以便方便开发Web应用、数据库、消息服务等,Java EE的应用使用的虚拟机和Java SE完全相同。
- Java SE:Standard Edition,标准版,包含标准的JVM和标准库
-
Java ME:Micro Edition,它是一个针对嵌入式设备的“瘦身版”,Java SE的标准库无法在Java ME上使用,Java ME的虚拟机也是“瘦身版”。
┌───────────────────────────┐
│Java EE │
│ ┌────────────────────┐ │
│ │Java SE │ │
│ │ ┌─────────────┐ │ │
│ │ │ Java ME │ │ │
│ │ └─────────────┘ │ │
│ └────────────────────┘ │
└───────────────────────────┘
Java介于编译型语言和解释型语言之间。编译型语言如C、C++,代码是直接编译成机器码执行,但是不同的平台(x86、ARM等)CPU的指令集不同,因此,需要编译出每一种平台的对应机器码。解释型语言如Python、Ruby没有这个问题,可以由解释器直接加载源码然后运行,代价是运行效率太低。而Java是将代码编译成一种“字节码”,它类似于抽象的CPU指令,然后,针对不同平台编写虚拟机,不同平台的虚拟机负责加载字节码并执行,这样就实现了“一次编写,到处运行”的效果。当然,这是针对Java开发者而言。对于虚拟机,需要为每个平台分别开发。为了保证不同平台、不同公司开发的虚拟机都能正确执行Java字节码,SUN公司制定了一系列的Java虚拟机规范。从实践的角度看,JVM的兼容性做得非常好,低版本的Java字节码完全可以正常运行在高版本的JVM上。
JRE(Java Runtime Environment Java运行环境):包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
JDK(Java Development Kit Java开发工具包):JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等
简单而言:使用JDK开发完成的java程序,交给JRE去运行。
二者关系如下:
┌─ ┌──────────────────────────────────┐
│ │ Compiler, debugger, etc. │
│ └──────────────────────────────────┘
JDK ┌─ ┌──────────────────────────────────┐
│ │ │ │
│ JRE │ JVM + Runtime Library │
│ │ │ │
└─ └─ └──────────────────────────────────┘
┌───────┐┌───────┐┌───────┐┌───────┐
│Windows││ Linux ││ macOS ││others │
└───────┘└───────┘└───────┘└───────┘
Java语言特点:
- 简单性
- 解释性
- 面向对象
- 高性能
- 分布式处理
- 多线程
- 健壮性
- 动态
- 结构中立
- 安全性
- 开源
- 跨平台:通过Java语言编写的应用程序在不同的系统平台上都可以运行。原理:只要在需要运行java应用程序的操作系统上,先安装一个java虚拟机JVM即可。
程序解析:
- 首先编写java源代码程序,扩展名.java
- 在命令行模式中,输入javac命令对源代码进行编译,生成字节码文件 : javac 源文件名.java
- 编译完成后,如果没有报错信息,输入java命令对class字节码文件进行解释运行,执行时不需要添加.class扩展名:java HelloWorld
运行原理:
一个Java源码只能定义一个public
类型的class,并且class名称和文件名要完全一致;
使用javac
可以将.java
源码编译成.class
字节码;
使用java
可以运行一个已编译的Java程序,参数是类名。
二、基础语法
1.关键字和标识符
关键字:被Java语言赋予特定含义的单词
关键字特点:组成关键字的字母全部小写
关键字注意事项:goto和const作为保留字存在,目前并不使用。类似Notepad++这样的高级记事本,针对关键字有特殊的颜色标记,非常直观。
标识符:就是给类,接口,方法,变量等起名字时使用的字符序列。
组成规则:
英文大小写字母
数字字符
$和_
注意事项:
不能以数字开头
不能是Java中的关键字
区分大小写
常见命名规则:
- 变量名(驼峰命名法):变量的名字可大小写混用,但首字符应小写。词由大写字母分隔,限制用下划线,限制使用美元符($),因为这个字符对内部类有特殊的含义。如:inputTextSize。
- 包名:应该都是由一个小写单词组成。如:net.test.modules。
- 类名:每个单词的首字母都要大写,通常由多个单词合成一个类名。如:DataFile、InfoParser。
- 接口名:与类的命名一致,因为接口也是类的一种。
- 常量名:常量命名则前面应该是static final,后面变量的名字全部大写。如:static final MAX = 1024。常量名通常全部大写。
- 方法名:第一个单词应该是动词,但首字母小写,后面每个单词的首字母大写。大写字母将词分隔并限制使用下划线。方法如果有传入参数,参数的名字必须和变量的命名规范一致。使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字。
2. 注释
// 单号注释
/* */ 多行注释
/** */ 文本注释
3.变量和数据类型
变量概述:在程序执行的过程中,在某个范围内其值可以发生改变的量。
变量定义格式:数据类型 变量名 = 初始化值;
1:从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用。
数据类型,变量名,变量值
2:为什么要定义变量呢
用来不断的存放同一类型的常量,并可以重复使用
var关键字:如果想省略变量类型,可以使用var
关键字。编译器会根据赋值语句自动推断出变量的类型。
定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。
除了上述基本类型的变量,剩下的都是引用类型。例如,引用类型最常用的就是String
字符串
byte:-128 ~ 127
short: -32768 ~ 32767
int: -2147483648 ~ 2147483647
long: -9223372036854775808 ~ 9223372036854775807
Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把boolean
表示为4字节整数。
整数默认:int 小数默认:double
Java 各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以保证Java程序的可移植性。
Java语言的整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,如:
int i1 = 600; //正确 long l1 = 88888888888L; //必须加l否则会出错
特别注意:整数的除法对于除数为0时运行时将报错,但编译不会报错。
整数由于存在范围限制,如果计算结果超出了范围,就会产生溢出,而溢出不会出错,却会得到一个奇怪的结果。
与整数类型类似,Java浮点类型有固定的表数范围和字段长度,不受平台影响。
Java 浮点类型常量有两种表示形式
十进制数形式,如: 3.14 314.0
科学记数法形式,如 3.14e2 3.14*10^2
Java 浮点型常量默认为 double 型,如要声明一个常量为 float 型,则需在数字后面加 f 或 F ,如:
double d = 12345.6; //正确 float f = 12.3f; //必须加f否则会出错
在计算机中,浮点数虽然表示的范围大,但是,浮点数有个非常重要的特点,就是浮点数常常无法精确表示。
浮点数0.1
在计算机中就无法精确表示,因为十进制的0.1
换算成二进制是一个无限循环小数,很显然,无论使用float
还是double
,都只能存储一个0.1
的近似值。但是,0.5
这个浮点数又可以精确地表示。
因为浮点数常常无法精确表示,因此,浮点数运算会产生误差。
需要特别注意,在一个复杂的四则运算中,两个整数的运算不会出现自动提升的情况。
double d = 1.2 + 24 / 5; // 5.2
整数运算在除数为0
时会报错,而浮点数运算在除数为0
时,不会报错,但会返回几个特殊值:
NaN
表示Not a NumberInfinity
表示无穷大-Infinity
表示负无穷大
double d1 = 0.0 / 0; // NaN
double d2 = 1.0 / 0; // Infinity
double d3 = -1.0 / 0; // -Infinity
char 型数据用来表示通常意义上的“字符”
字符常量为用单引号括起来的单个字符,例如:char ch1= 'a'; char ch2='中';
Java 字符采用 Unicode 编码,每个字符占两个字节,因而可用十六进制编码形式表示。注:Unicode是全球语言统一编码
一个英文字符和一个中文字符都用一个char
类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char
类型直接赋值给int
类型即可。
int n1 = 'A'; // 字母“A”的Unicodde编码是65
int n2 = '中'; // 汉字“中”的Unicode编码是20013
// 注意是十六进制:
char c3 = '\u0041'; // 'A',因为十六进制0041 = 十进制65
char c4 = '\u4e2d'; // '中',因为十六进制4e2d = 十进制20013
字符串类型:用双引号"..."
表示字符串
常见转义字符包括:
\"
表示字符"
\'
表示字符'
\\
表示字符\
\n
表示换行符\r
表示回车符\t
表示Tab\u####
表示一个Unicode编码的字符
从Java 13开始,字符串可以用"""..."""
表示多行字符串(Text Blocks)了。
String s = """
SELECT * FROM
users
WHERE id > 100
ORDER BY name DESC
"""; //上述多行字符串实际上是5行,在最后一个DESC后面还有一个\n。
String s = """
...........SELECT * FROM
........... users
...........WHERE id > 100
...........ORDER BY name DESC
...........""";
//多行字符串前面共同的空格会被去掉
//如果多行字符串的排版不规则,那么,去掉的空格就会变成这样
String s = """
......... SELECT * FROM
......... users
.........WHERE id > 100
......... ORDER BY name DESC
......... """;
//即总是以最短的行首空格为基准。
Java的字符串除了是一个引用类型外,还有个重要特点,就是字符串不可变。基本类型的变量是“持有”某个数值,引用类型的变量是“指向”某个对象;
public class Main {
public static void main(String[] args) {
String s = "hello";
String t = s;
s = "world";
System.out.println(t); // t是"hello"
}
}
引用类型的变量可以指向一个空值null
,它表示不存在,即该变量不指向任何对象。
String s1 = null; // s1是null
String s2 = s1; // s2也是null
String s3 = ""; // s3指向空字符串,不是null
注意要区分空值null
和空字符串""
,空字符串是一个有效的字符串对象,它不等于null
。
boolean 类型适于逻辑运算,一般用于程序流程控制 。
boolean 类型数据只允许取值 true 或 false ,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。
使用变量注意事项:
作用域:变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。
初始化值:没有初始化值不能直接使用。
在一行上建议只定义一个变量,可以定义多个,但是不建议。
+是一个运算符, 我们应该能够看懂,做数据的加法。
boolean类型不能转换为其他的数据类型
默认转换
byte,short,char—int—long—float—double
byte,short,char相互之间不转换,他们参与运算首先转换为int类型
强制转换
目标类型 变量名=(目标类型)(被转换的数据);
一般建议,最好不要随意使用强制类型转换,容易造成数据精度的损失。
(1)容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意。
(2)有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算。
可以将浮点数强制转型为整数。在转型时,浮点数的小数部分会被丢掉。如果转型后超过了整型能表示的最大范围,将返回整型的最大值。
public class Main {
public static void main(String[] args) {
System.out.println('a'); //a
System.out.println('a'+1); //98
System.out.println("hello"+'a'+1); //helloa1
System.out.println('a'+1+"hello");//98hello
System.out.println("5+5="+5+5);//5+5=55
System.out.println(5+5+"=5+5"); //10=5+5
byte b1=3,b2=4,b;
b=b1+b2; //不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。
b=3+4; //3和4都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围。如果没有可以赋值。
}
}
//任何数据和字符串进行操作,结果都是字符串类型。但是要注意运算的顺序。
4.运算符
除法的时候要注意一个问题:
整数相除,只能得到整数
要想得到小数,可以*1.0
赋值运算符:
short s=1;s = s+1; //错
short s=1;s+=1;//对
比较运算符“==”不能误写成“=”
位运算是直接对二进制进行运算。
三目运算符格式:(关系表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
键盘录入数据:
//如何实现键盘录入数据呢?(目前先记住使用)
//导包(位置放到class定义的上面)
import java.util.Scanner;
//创建对象
Scanner sc = new Scanner(System.in);
//接收数据
int x = sc.nextInt();