菜鸟话Java--java基本语法

一个简单的Java程序

1
2
3
4
5
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

上面是一个简单的Java程序,作用是在控制台输出Hello World!。下面来分析这段代码

public

public是访问修饰符,这些修饰符用于控制程序的其他部分对这段代码的访问级别。访问
修饰符包括public private protect和默认修饰符.关于访问修饰符,后面会具体介绍。

class Main

class是关键字,class 类名用来定义一个类,Java程序的所有内容都必须放在类中。

Java类名的规则:

  1. 类名不能以数字开头,必须是字母
  2. 不能使用Java保留字(后面会介绍Java保留字)

Java类名的规范:(注意,规则是强制要求的,下面规范不是。不过遵守规范有利于代码结构清晰,建议遵守规范)

  1. 类名是以大写首字母开头的名词,如First
  2. 如果类名由多个单词组成,则每个单词首字母都应该大写(即驼峰命名法),如FirstSimple

public static void main(Strinf[] args){…}

这个是在类Main中定义了一个方法。static是指静态,void表示无返回值,main是方法名(后面的文章会介绍)。注意:main
方法是一个特殊的方法,每一个Java应用程序都必须有一个main方法,没有main方法程序将不能执行,而且main方法的修饰符必须是public

java的基本数据类型

java是一种强类型语言,这意味着必须给每一个变量声明一种类型。在Java中一共有八种基本类型,它们分别是
整形(byte,short,int,long),浮点型(float,double),字符型(char),表示真值的(boolean)

整形

整形表示没有小数部分的值,它允许是负数.java有四种整形,具体区别如下:

类型 储存需求 取值范围
int 4字节 -2,147,483,648(-2^31)~ 2,147,483,647(2^31 - 1)(正好超过20亿)
short 2字节 -32768(-2^15)~ 32767(2^15 - 1)
byte 1字节 -128(-2^7)~ 127(2^7-1)
long 8字节 -9,223,372,036,854,775,808(-2^63)~ 9,223,372,036,854,775,807(2^63 -1)

注意:long类型后面通常有Ll(l容易和1混淆,所以推荐使用大写的L),如2000000000000000L

二进制,八进制,十六进制

二进制 : 加上前缀0b0B表示二进制,如0b1001表示9

八进制 : 加上前缀0表示八进制,如010表示8,不过八进制表示法容易混淆,所以不推荐使用

十六进制 : 加上前缀0x0X表示十六进制.

从Java 7 开始,还可以为数字字面量加下划线,如用1_000_000表示一百万.这些下划线只为了让人更
易读,Java编译器会除去这些下划线。

浮点型

浮点型用于表示有小数部分数值的类型,在Java中有两种浮点类型,具体的区别如下:

类型 储存需求 取值范围
float(单精度浮点值) 4节字 float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
double(双精度浮点值) 8字节 double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数

float类型的数值有一个后缀fF,如果没有后缀的浮点值默认为double(也可以往浮点值后面加dD,表示double类型)

特殊的浮点数值 :

  • 正无穷大
  • 负无穷大
  • NaN 表示0/0或负数的平方根,不是一个数字

注意:不能用浮点型做精确运算;更不能使用while( i == 浮点数)作为循环条件,由于二进制本身的特性。

char

char类型的值用’’表示,如char a = 'a'.具体的关于char的说明请看后面的文章

char类型特殊字符的转义序列

转义序列 名称 Unicode值
\b 退格 \u0008
\t 制表 \u0009
\n 换行 \u000a
\r 回车 \u000d
\” 双引号 \u0022
\’ 单引号 \u0027
\ 反斜杠 \u005c
\u2122
π \u03c0

boolean类型

boolean(布尔)类型有两个值truefalse.用来判断逻辑条件

String

String表示字符串类型如”abcdefg”,与上面的基本类型不同,String是引用类型(具体的后面会介绍)

数组

声明数组变量

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

1
2
3
dataType[] arrayRefVar;   // 推荐

dataType arrayRefVar[]; // 效果相同,但不是首选方法

注意: 建议使用 dataType[] arrayRefVar 的声明风格声明数组变量。 dataType arrayRefVar[] 风格是来自 C/C++ 语言 ,
在Java中采用是为了让 C/C++ 程序员能够快速理解java语言。

1
2
3
double[] myList;         // 首选的方法

double myList[]; // 效果相同,但不是首选方法

创建数组

Java语言使用new操作符(后面会介绍)来创建数组,语法:arrayRefVar = new dataType[arraySize];

上面的语法语句做了两件事:

  • 使用 dataType[arraySize] 创建了一个数组。
  • 把新创建的数组的引用赋值给变量 arrayRefVar。
1
2
3
4
//数组变量的声明,和创建数组可以用一条语句完成,如下所示:
dataType[] arrayRefVar = new dataType[arraySize];
//另外,你还可以使用如下的方式创建数组。
dataType[] arrayRefVar = {value0, value1, ..., valuek};

数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 arrayRefVar.length-1。

数组的拷贝

1
2
3
4
5
6
//错误示例,这种方式两个数组变量将引用同一个数组
int[] a1 = new int[3];
int[] a2 = a1

//正确示例
int[] a3 = Arrays.copyOf(a1,a1.length);

注释

在Java中有三种标记注释的方式

1
2
3
4
5
6
7
8
9
10
//单行注释

/*
*多行注释
*/

/**
* Java doc,这里的注释会生成文档
*
*/

变量

声明变量

在Java中声明变量的语法是类型 变量名,例如

1
2
3
4
int a;
boolean A;//Java是大小写敏感的
float c;
double m,n;//不推荐

注意:每个变量声明都必须以;结尾

变量初始化

1
2
3
int a = 1;//直接初始化
int b;
b = 3;//对已经声明过的变量进行初始化

注意:声明一个变量之后,必须进行初始化,不能使用未初始化的值,否则会报错。(成员变量声明后有默认值,已经初始化了,所以可以直接使用)

常量

在Java中,利用关键字final指示常量(常量是指不会变的量),例如:

1
final int A = 10;//必须直接赋值,赋值后就不能再更改,习惯上常量名全大写

运算符

算术运算符

操作符 描述 例子
+ 加法 a + b
- 减法 a - b
* 乘法 a * b
/ 除法 a / b
取余 a % b
++ 自增 a++++a两种,具体区别见下文
自减 a----a两种,具体区别见下文

a++++a的区别:

++a:先进行自增运算,再进行表达式运算,而a++先进行表达式运算,再进行自增运算.(a----a类似)

1
2
3
4
int a = 1;
int b = 1;
System.out.println(a++);//先执行println方法,再执行a++,输出结果为 1
System.out.println(++b);//先执行b++,再执行println方法,输出结果为 2

关系运算符

运算符 描述
== 检查如果两个操作数的值是否相等,如果相等则条件为真。
!= 检查如果两个操作数的值是否相等,如果值不相等则条件为真。
> 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。
< 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。

逻辑运算符

操作符 描述
&& 当且仅当两个操作数都为真,条件才为真。
` ` 如果任何两个操作数任何一个为真,条件为真。
用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。

位移运算符

操作符|描述|
|—–|—-|
||与运算|
|||或运算|
||按位取反运算符|
|<<|按位左移运算符|
|>>|按位右移运算符|
|>>>|按位右移补零操作符|

赋值运算符

操作符 描述 例子
= 赋值运算符
+= 加和赋值操作符 C += A等价于C = C + A
-= 减和赋值操作符 C -= A等价于C = C-A
* = 乘和赋值操作符 C = A等价于C = C A
/= 除和赋值操作符 C / = A等价于C = C / A

以上只列举了比较常用的运算符,具体的运算符可以看菜鸟教程

java循环结构

while循环

while循环的基本形式:

1
2
3
while(布尔表达式){
//循环语句,只要布尔表达式一直为true,循环就会一直执行下去
}

do…while循环

基本形式:

1
2
3
do{
//循环语句,只要布尔表达式一直为true,循环就会一直执行下去
}while(布尔表达式);

do...while循环和while循环的区别?

do...while循环中的语句至少会执行一次,而while循环里面的语句至少执行0次

for循环

例如:

1
2
3
for (int i = 0; i < 10; i++) {
System.out.println(i);
}

首先i = 0与10比较,其结果为true,执行System.out.println(i);语句;之后执行i++,此时i = 1,再与10进行比较,直到i < 10的结果为false为止.

增强 for 循环

示例:

1
2
3
4
int a[] = {1,2,3,4,5};
for (int c : a) {
System.out.println(c);
}

break和continue

break

break主要用在循环语句或者 switch 语句中,用来跳出整个语句块。

break的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
break;  //是跳出里层循环(针对几层循环而言))

//示例如下,下面这段代码将一直循环运行
while (true){
for (int i = 0; i < 20 ; i++) {
if (i == 3)
break ;
System.out.println(i);
}
}

break name; //跳出指定名字的循环

//示例如下,输出结果为 0 1 2

name:while (true){
for (int i = 0; i < 20 ; i++) {
if (i == 3)
break name;
System.out.println(i);
}
}

continue

continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。

  • 在 for 循环中,continue 语句使程序立即跳转到更新语句。
  • 在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
  • continue也可以指定循环的名字,直接跳到该循环

条件语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//if语句
if(布尔表达式)
{
//如果布尔表达式为true将执行的语句
}

//if...else语句
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}

//if...else if...else语句
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}

switch

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch(expression){
case value1 :
//语句
break; //可选
case value2 :
//语句
break; //可选
case value3 :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}

注意:

  • expression变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
  • 如果expression与任意case中的值匹配,就相当于打开了开关,之后的值不会再比较而是直接运行语句,直到碰到过break.

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char grade = 'C';

switch(grade)
{
case 'A' :
System.out.println("优秀");
break;
case 'B' :
case 'C' :
System.out.println("良好");
break;
case 'D' :
System.out.println("及格");
break;
case 'F' :
System.out.println("你需要再努力努力");
break;
default :
System.out.println("未知等级");
}