个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客
目录
前言:
初识Java
运行Java程序
注释
标识符
关键字
数据类型与变量
字面常量
数据类型
变量
类型转换
类型提升
字符串类型
运算符
算术运算符
关系运算符
逻辑运算符
位运算符
移位运算
条件运算符
运算符的优先级
前言:
接下来,Java前期的语法学习会和C语言非常的类似。
Java语言概述:
Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。
Java语言特性:
1. 简单性:Java语法是C++语法的一个“纯净版本”,相当于对C++做了一个减法。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等等。不仅如此,Java开发环境远远超出大多数其他编程语言的开发环境。 2. 面向对象:什么是面向对象? 在Java的世界里,一切皆对象。比如:人、狗、手机、电脑等都是对象。所谓面相对象,就是依靠对象之间的交互来完成事情,比如:人用手机网上购物,狗吃骨头... Java的面向对象特性与C++旗鼓相当,与C++的主要不同点在于多重继承。在Java中,取而代之的是更简单的接口概念。而且与C++相比,Java提供了更丰富的运行时自省功能。 3. 分布式(微服务): Java有丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络 上的对象,其便捷程度就好像访问本地文件一样。 4. 健壮性:Java与C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性(对于曾经花费几个小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性)。不仅如此,Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。 5. 安全性:Java适用于网络/分布式环境。为了达到这个目标,在安全性方面投入了大量的精力。使用Java可以构建防病毒、防篡改的系统。从一开始,Java就设计成能够防范常见的各种攻击: 运行时堆栈溢出。蠕虫和病毒常用的攻击手段。 破坏自己进程空间之外的内存。 未经授权读写文件 6. 体系结构中立:编译器生成一个体系结构中立的目标文件格式,按照该中规范生成的文件,只要有Java运行时系统,这些编译后的代码就可以在许多处理器上运行。Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易的在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。这就是为什么可以:“Wrice once,Run anywhere”(一次编译,到处运行)。而且其他语言编写的程序,在编译后如果能够严格按照字节码文件的规范生成.class文件,也可以在JVM上运行7. 可移植性:与C/C++不同,Java规范中没有“依赖具体实现的地方”。基本数据类型的大小以及有关运算都做了明确的说明。例如,Java中的int永远是32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定的其他大小。在Java中,数据类型具有固定的大小,这消除了代码移植时令人头疼的主要问题。 8. 解释性:Java为了实现与平台无关,自己维护了一套基于栈架构的指令集,Java源代码经过编译之后,字节码文件中的指令就是按照自己的指令集来组织的,但是在具体硬件环境中运行时,系统并不能识别,因为Java程序在执行时,Java解释器会逐条的将字节码文件中的指令翻译成CPU的指令集。 9. 高性能:边解释边执行,垃圾会说等导致了Java代码运行效率偏低,近年来JVM也在不断的优化,比如:JIT(即时编译Java在当时很超前。它是第一个支持并发程序设计的主流语言。多线程可以带来更好的交互响应和实时行为。并发程序设计绝非易事,但是Java在这方面表现出色,可以很好的管理这个工作。 11. 动态性:Java与C/C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端没有任何影响。在Java中找出运行时类型信息十分简单(反射的特性,后续会学到) 因此:Java不仅仅是一门编程语言,也是一个由一些列计算机软件和规范组成的技术体系 ),热点代码探测,让Java程序的执行效率大幅提高,在有些场合不亚于C/C++。 10. 多线程:Java在当时很超前。它是第一个支持并发程序设计的主流语言。多线程可以带来更好的交互响应和实时行为。并发程序设计绝非易事,但是Java在这方面表现出色,可以很好的管理这个工作。 11. 动态性:Java与C/C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端没有任何影响。在Java中找出运行时类型信息十分简单(反射的特性,后续会学到) 因此:Java不仅仅是一门编程语言,也是一个由一些列计算机软件和规范组成的技术体系。
初识Java
C语言打印Hello World:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
Java打印Hello World:
public class Test//类 {
public static void main(String[] args)//方法 {
System.out.println("Hello World");//语句
}
Java程序的结构由如下三个部分组成:1.源文件(扩展名为.java):源文件带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个 类。类的内容必须包含在花括号里面。 2.类:类中带有一个或多个方法。方法必须在类的内部声明。 3.方法:在方法的花括号中编写方法应该执行的语句。 总结一下:类存在于源文件里面;方法存在于类中;语句存在于方法中。
注意:在一个源文件中只能有一个public修饰的类,而且源文件名字必须与public修饰的类名字相同。
运行Java程序
Java是一门半编译型、半解释型语言。先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节码组成的,与平台无关、面向JVM的文件。最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。
JDK、JRE、JVM之间的关系?
注释
Java中的注释主要分为以下三种:
1. 单行注释:// 注释内容(用的最多)
2. 多行注释:/* 注释内容*/(不推荐)
3. 文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可以被javadoc工具解析,生成一套以网页文件形式体现的程序说明文档.
注意: 1. 多行注释不能嵌套使用 2. 不论是单行还是多行注释,都不参与编译,即编译之后生成的.class文件中不包含注释信息。
标识符
在上述程序中,Test称为类名,main称为方法名,也可以将其称为标识符。即:在程序中由用户给类名、方法名或者变量所取的名字。
【硬性规则】 标识符中可以包含:字母、数字以及 下划线和 $ 符号等等。
注意:标识符不能以数字开头,也不能是关键字,且严格区分大小写。
【软性建议】 类名:每个单词的首字母大写(大驼峰) 方法名:首字母小写,后面每个单词的首字母大写(小驼峰) 变量名:与方法名规则相同。
关键字
将这些具有特殊含义的标识符称为关键字。即:关键字是由Java语言提前定义好的,有特殊含义的标识符,或者保留字。 注意:用户不能使用关键字定义标识符。下面是我们常见的关键字。
数据类型与变量
字面常量
常量即程序运行期间,固定不变的量称为常量。换句话说,就是无论程序何时运行,对应的结果是不变的。
public class Tset {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
上面代码中的Hello World就是属于字面常量。
注意:常量与字面常量是有区别的。
字面常量:字面常量是指直接出现在代码中的固定值。它们可以是整数、浮点数、字符、字符串或布尔值等。例如,整数字面常量可以是10、-5,浮点数字面常量可以是3.14、-0.5,字符字面常量可以是’a’、‘b’,字符串字面常量可以是"Hello World”。字面常量的值在编译时就确定了,不能被修改。
常量:常量是指在程序中定义的具有固定值的标识符。在Java中,常量使用关键字final进行声明,并且一旦被赋值后就不能再改变。常量可以是基本数据类型(如int、double等)或引用数据类型(如String、数组等)。常量的值在运行时才确定。
区别:
字面常量的值在编译时就确定了,而常量的值在运行时确定。
字面常量直接出现在代码中,不需要定义和声明,而常量需要使用关键字final进行声明。
字面常量的值不能被修改,而常量的值也不能被修改,但可以通过重新赋值来改变引用的对象。
数据类型
在Java中数据类型主要分为两类:基本数据类型和引用数据类型。
基本数据类型有四类八种: 1. 四类:整型、浮点型、字符型以及布尔型 2. 八种:
数据类型 | 关键字 | 内存占用 | 范围 |
字节型 | byte | 1个字节 | -128~127 |
短整型 | short | 2个字节 | -32768 ~ 32767 |
整型 | int | 4个字节 | -2^31 ~ 2^31-1 |
长整型 | long | 8个字节 | -2^63 ~ 2^63-1 |
单精度浮点型 | float | 4个字节 | 有范围,一般不关注 |
双精度浮点型 | double | 8个字节 | 有范围,一般不关注 |
字符型 | char | 2个字节 | 0 ~ 65535 |
布尔型 | boolean | 没有明确规定 | 两个取值:true,false |
注意: 不论是在16位系统还是32位系统,int都占用4个字节,long都占8个字节 整形和浮点型都是带有符号的 整型默认为int型,浮点型默认为double,字符串属于引用类型,该中类型后序介绍。
变量
语法格式:数据类型 变量名 = 初始值;
例如:
int i = 0;//注意整型变量在使用之前,必须赋予初始值,否则编译器会报错
char ch = 0;
float f = 3.14f;//注意如果不加f/F,编译器会默认为double类型,而且编译器会报错
double d = 3.14;
short s = 20;
boolean flag = true;//只能取true或者flag
//为了区分int和long类型,一般建议:long类型变量的初始值之后加L或者l
long l = 30L;//一般更加以加大写L,因为小写l与1不好区分
如果我们想要知道这些数据的范围,也可以直接在编译器中求。
public class Tset {
public static void main(String[] args) {
System.out.println("整型数据的取值范围:"+Integer.MIN_VALUE+" ~ "+Integer.MAX_VALUE );
System.out.println("短整型数据的取值范围:"+Short.MIN_VALUE+" ~ "+Short.MIN_VALUE);
System.out.println("字节型数据的取值范围:"+Byte.MIN_VALUE+" ~ "+Byte.MAX_VALUE);
}
}
代码内容后面介绍。
注意事项:在 Java 中, int 除以 int 的值仍然是 int(会直接舍弃小数部分)。
double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。
Java 中使用 单引号 + 单个字母 的形式表示字符字面值。计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符.。因此 一个字符占用两个字节, 表示的字符种类更多, 包括中文。
public class Tset {
public static void main(String[] args) {
char a = '我', b = '要', c = '学', d = '编' , e = '程';
System.out.print(a);
System.out.print(b);
System.out.print(c);
System.out.print(d);
System.out.print(e);
}
}
Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法。
类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验。在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。
自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时会自动进行。
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。特点:数据范围大的到数据范围小的。
我们就可以这样理解:当大碗装小碗里的水时,大碗能够全部装下;而小碗装大碗时,大碗里的水会溢出,导致水量减少。
类型提升
不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
byte 和 byte 都是相同类型, 但是出现编译报。 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误. 由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据。 为了硬件上实现方便, 诸如 byte 和 short 这种低于 4 个字节的类型, 会先提升成 int, 再参与计算 。
字符串类型
在Java中使用String类定义字符串类型。
在有些情况下,需要将字符串和整形数字之间进行转换:
int 转成 String
String 转成 int :
运算符
Java中运算符可分为以下:算术运算符(+ - * /)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。
算术运算符
运算法则和C语言是一样的。
public class Tset {
public static void main(String[] args) {
int a = 20;
int b = 10;
System.out.println(a + b); // 30
System.out.println(a - b); // 10
System.out.println(a * b); // 200
System.out.println(a / b); // 2
System.out.println(a % b); // 0
}
}
public class Tset {
public static void main(String[] args) {
int a = 3;
int b = 2;
//在数学中应该是1.5 但是在Java中输出结果为1。会向下取整,即小数点之后全部舍弃掉了
System.out.println(a / b);
//如果要得到数学中的结果,可以使用如下方式
double d = a*1.0 / b;
System.out.println(d);
}
}
% 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的。
当%两边的操作数是负数时,结果的正负号是由第一个运算符的正负决定的。
public class Tset {
public static void main(String[] args) {
System.out.println(10 % 3);
System.out.println(10 % (-3));
System.out.println((-10) % 3);
System.out.println((-10) % (-3));
}
}
关系运算符
关系运算符主要有六个: == != <= >= > <,其计算结果是 true 或者 false 。
public class Tset {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a < b); // true
System.out.println(a > b); // false
System.out.println(a <= b); // true
System.out.println(a >= b); // false
}
}
逻辑运算符
逻辑运算符主要有三个: && || ! ,运算结果都是 boolean类型。
语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。 两个表达式都为真,结果才是真,只要有一个是假,结果就是假。与我们之前学习的C语言是一样的,并且也有短路求值。当表达式1为假时,表达式2就无需运算了。因为一旦表达式1的结果为假,整个表达式就是为假,表达式2的结果是真还是假已经没有意义了。
public class Tset {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2);//左为真 且 右为真 则结果为真
System.out.println(a == 1 && b > 100);//左为真 但 右为假 则结果为假
System.out.println(a > 100 && b == 2);//左为假 但 右为真(无需判断) 则结果为假
System.out.println(a > 100 && b > 100);//左为假 且 右为假(无需判断) 则结果为假
}
}
逻辑 ||
语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果。注意:左右表达式至少有一个位真,则结果为真。 同样也有短路求值。当表达式1的结果为正,表达式2的结果无论真假,整个表达式的结果都为正。
public class Tset {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == 1 || b == 2);//左为真 且 右为真(无需计算) 则结果为真
System.out.println(a == 1 || b > 100);//左为真 但 右为假(无需计算) 则结果也为真
System.out.println(a > 100 || b == 2);//左为假 但 右为真 则结果也为真
System.out.println(a > 100 || b > 100);//左为假 且 右为假 则结果为假
}
}
逻辑非 !
语法规则:! 表达式 真变假,假变真。
public class Tset {
public static void main(String[] args) {
int a = 1;
System.out.println(!(a == 1));//a == 1 为true,取个非就是false
System.out.println(!(a != 1));//a != 1 为false,取个非就是true
}
}
& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值。
位运算符
按位与(&): 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0。
按位或(|): 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1。
按位取反(~): 如果该位为 0 则转为 1, 如果该位为 1 则转为 0。
按位异或(^): 如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1。
移位运算
左移(<<): 最左侧位不要了, 最右侧补 0。
右移(>>): 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)。
无符号右移 (>>>): 最右侧位不要了, 最左侧补 0。
1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方. 2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方. 3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替. 4. 移动负数位或者移位位数过大都没有意义。
条件运算符
条件运算符只有一个: 表达式1 ? 表达式2 : 表达式3 当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值. 也是 Java 中唯一的一个三目运算符, 是条件判断语句的简化写。
1. 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换。
如果我们把c的类型改为浮点型就可以了。
2. 表达式不能单独存在,其产生的结果必须要被使用。
运算符的优先级
与C语言是一样的,可以去看看下面这篇文章。操作符详解(下)-CSDN博客
通过上面的学习,我们会发现其实Java中的语法其实和C语言差不多。好啦!本期Java的学习就到此结束了,我们下一期再一起学习吧!