Java基础语法
零、运行前准备
-
新建Project:File-》New-》Project-》Empty Project-》……
-
新建Module:File-》New-》Module-》Java-》……
-
File-》Project Structure-》Project,选择相对应的SDK和Language level(这里我使用的版本是1.8和8)
一、注释
注释相当于对代码进行解释的笔记。当项目结构变得复杂时,注释就变得非常必要。在写代码的同时书写注释,是一个非常好的习惯,以便日后再看代码的时候能迅速理解代码的内容,同时也方便他人看懂你写的代码。注释并不会被执行,是写给人看的。
Java中的注释有三种:
- 单行注释
- 多行注释
- 文档注释
示例如下:
public class HelloWorld {
public static void main(String[] args) {
//什么是单行注释? Line Comment
//它的开头是两个斜杠
//这就是单行注释
/*什么是多行注释?Block Comment
它的开头是斜杠和一颗星;
它可以注释一段文字;
这就是多行注释!*/
/** 什么是文档注释?
* 它的开头是斜杠和两颗*
* 它的每一段前面都有*
* @Description 这就是有功能的,可以被识别;和JavaDoc联合使用
* @Author WANGqiuwai
这就是文档注释!*/
System.out.println("Hello,World!");
}
}
其他:
1. 给注释改颜色
File-》Settings-》Editor-》Color Scheme-》Java-》Comments-》Line Comment-》Foreground
2. 搜索“有趣的代码注释”
二、标识符、关键字
标识符
类名、变量名、方法名都被称为标识符
命名规则:
- 所有标识符都应该以字母(AZ,az)、美元符号($)或下划线(_)开始
- 首字符之后可以是字母(AZ,az)、美元符号($)、下划线(_)或数字(0~9)的任何字符组合
- 不能使用关键字作为标识符
- 标识符是大小写敏感的
- 可以使用中文命名,但不建议,也不建议使用拼音命名;尽量做到“见名知意”
关键字
关 | 键 | 字 | ||
---|---|---|---|---|
abstract | assert | boolean | break | byte |
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
示例如下:
//练习使用标识符:
public class Demo01 {
public static void main(String[] args) {
//合法用法:
String Ahello = "xiaowang";
String hello = "xiaowang";
String $hello122_ = "xiaowang";
String _hell$_o = "xiaowang";
//非法用法:
/*String 1hello = "xiaowang";
String #hello = "xiaowang";
String hell%^o = "xiaowang";
String class = "xiaowang";*/
//大小写敏感:
String Class = "xiaowang";
String Man = "xiaowang";
String man = "xiaowang";
//可以使用中文命名:
String 王者荣耀 = "最强王者";
System.out.println(王者荣耀);
}
}
三、数据类型
-
强类型(定义)语言,如:Java
要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
-
弱类型语言,如:JavaScript
Tips:
- Java是一种强类型语言,每个变量都必须声明其类型;
- 变量声明是一条完整的语句,因此每一个声明都必须以分号结束;
- Java变量是程序中最基本的存储单元,其要素包括变量名、变量类型和作用域
Java的数据类型
1. 基本类型(Primitive Type)
- 数值类型
-
整数类型
-
byte:占1个字节范围
-
short:占2个字节范围
-
int:占4个字节范围
-
long:占8个字节范围;long类型要在数字后面加个L
-
-
浮点类型
- float:占4个字节;float类型要在数字后面加个F
- double:占8个字节;默认
-
字符类型
- char:占2个字节
- 布尔类型
- boolean:占1位,其值只有true和false两个
2. 引用类型(Reference Type)
- 类
- 接口
- 数组
示例如下:
//认识Java的数据类型:八大基本数据类型
public class Demo02 {
public static void main(String[] args) {
//整数类型:
int num1 = 10; //最常用
byte num2 = 20;
short num3 = 30;
long num4 = 40L; //大小写都可以,但为了代码直观性,最好使用大写L
//小数(浮点数):
float num5 = 50.1F;
double num6 = 3.1415926535897932384626433;
/*可以通过数据类型对应的类去查看该数据类型所能表示的范围
Integer
Byte
Short
Long
Float
Double
*/
//字符类型:
char name1 = 'W';
//字符串(非基本数据类型,而是引用类型):
String name2 = "WANGqiuwai"; //String不是关键字,是一个类
//布尔类型:
boolean flag1 = true; //是
boolean flag2 = false; //非
}
}
拓展
1. 整数拓展之进制
- 二进制:以0b开头,每位表示0~1
- 十进制:每位表示0~9
- 八进制:以0开头,每位表示0~7
- 十六进制:以0x开头,每位表示0~9 A~F
//整数拓展:进制
public class Demo03 {
public static void main(String[] args) {
int i1 = 0b10; //二进制:0b
int i2 = 10; //十进制
int i3 = 010; //八进制:0
int i4 = 0x10; //十六进制:0x
System.out.println(i1); //2
System.out.println(i2); //10
System.out.println(i3); //8
System.out.println(i4); //16
}
}
2. 浮点数拓展
- float能表现的字长是有限的、离散的;由于舍入误差,float型数据是“大约”数(接近但不等于)
- 最好完全避免使用浮点数进行比较
- 若要将浮点数进行比较,可以使用数学工具类BigDecimal(大数类)
//浮点数拓展
public class Demo03 {
public static void main(String[] args) {
float f = 0.1f;
double d = 1.0 / 10;
System.out.println(f); //0.1
System.out.println(d); //0.1
System.out.println(f == d); //false
float f1 = 23232323231232132f;
float f2 = f1 + 1;
System.out.println(f1); //2.32323242E16
System.out.println(f2); //2.32323242E16
System.out.println(f1 == f2); //true
}
}
3. 字符拓展
- char型可以强制类型转换成int型
- 所有的字符本质上还是数字
- char型涉及到编码问题,即Unicode(可以处理各种语言的文字);占2个字节(每一位在Unicode表上对应一个字符),最多可以表示2^16=65536个字符(065535,也即u0000uFFFF)
- 早期的Excel最长只有2^16=65536行
//字符拓展
public class Demo03 {
public static void main(String[] args) {
char c1 = 'w';
char c2 = '王';
System.out.println(c1); //w
System.out.println(c2); //王
//强制类型转换
System.out.println((int) c1); //119
System.out.println((int) c2); //29579
//Unicode编码
char c3 = '\u0077'; //w的编码为119,其十六进制为77
System.out.println(c3); //w
//转义字符
System.out.println("Hello\tWorld\n"); //\t表示制表符;\n表示换行符
}
}
4. 布尔值拓展
- Less is More! 代码要精简易读
//布尔值拓展
public class Demo03 {
public static void main(String[] args) {
boolean flag = true;
if (flag == true) { }
//改进后:
if (flag) { }
}
}
5. 其他拓展
//其他拓展
public class Demo03 {
public static void main(String[] args) {
//new一个对象,从内存分析:比较的是地址
String s1 = new String("hello world");
String s2 = new String("hello world");
System.out.println(s1 == s2); //false
//比较的是字符串常量
String s3 = "hello world";
String s4 = "hello world";
System.out.println(s3 == s4); //true
}
}
四、类型转换
-
由于Java是强类型语言,要进行某些运算时,需要用到类型转换
-
运算中,不同类型的数据先转换为同一类型,然后进行运算
- ---------------------------------------------------------------------->从低到高---------------------------------------------------------------------->
byte,short,char int long float double - 小数优先级大于整数
强制类型转换
从高到低需要强制类型转换,表示为:(需要转换成的类型)变量名
自动类型转换
从低到高进行自动类型转换
示例如下:
//强制、自动类型转换
public class Demo04 {
public static void main(String[] args) {
int i = 128;
System.out.println(i); //128
//自动转换
double a = i;
System.out.println(a); //128.0
//强制转换:(类型)变量名
//内存溢出
byte b = (byte)i; //byte最大只能表示127
System.out.println(b); //-128
//精度丢失
System.out.println((int)23.7); //23
System.out.println((int)-45.89f); //-45
char c = 'a';
int d = c + 1;
System.out.println(d); //98
System.out.println((char)d); //b
}
}
注意:
1. 不能对布尔值进行转换;
2. 不能把对象类型转换为不相干的类型;
3. 从高到低必须强制转换;
4. 转换的时候可能存在内存溢出,或者精度问题
//操作比较大的数的时候,注意溢出问题
public class Demo05 {
public static void main(String[] args) {
//JDK7新特性:数字之间可以用下划线分割
int money = 10_0000_0000;
System.out.println(money); //1000000000
int years = 20;
int total1 = money * years;
System.out.println(total1); //-1474836480,计算的时候溢出了
long total2 = money * years;
System.out.println(total2); //-1474836480
//money * years计算完是int型
long total3 = money * (long)years;
System.out.println(total3); //20000000000
}
}
五、变量、常量
变量
变量就是可以变化的量,代表一个空间(比如一个“鞋盒”)
相关概念:
-
Java变量是程序中最基本的存储单元,其要素包括变量名、变量类型和作用域;
-
每个变量都有类型,类型可以是基本类型或引用类型;
-
变量名必须是合法的标识符;
-
变量声明是一条完整的语句,因此每一个声明都必须以分号结束
-
数据类型 变量名 = 值1, 值2; //可以使用逗号隔开来声明多个同类型的变量,但不建议
示例如下:
//声明变量
public class Demo06 {
public static void main(String[] args) {
//不建议这样写,程序可读性差
/*int a,b,c;
int a=1, b=2, c=3;*/
int a = 1;
int b = 2;
int c = 3;
String name = "xiaowang";
char x = 'w';
double pi = 3.14;
}
}
变量作用域
1. 类变量
- 在类中使用(方法外面,类里面);
- 从属于该类;
- 开头要加上static
2. 实例变量
-
在类中使用(方法外面,类里面);
-
从属于对象:变量类型 变量名 = new 变量类型(); 即“new一个对象”,相当于拿到自己
-
可以不进行初始化,就是默认值
数据类型 默认值 String null(除了基本类型,其余的默认值都是null) byte 0 int 0 short 0 long 0 float 0.0 double 0.0 char u0000 (啥也不显示) boolean false
3. 局部变量
- 在方法中使用;
- 使用之前必须声明和初始化值
4. 示例如下:
//认识变量作用域
public class Demo07 {
//类里面还能定义一些属性,如变量
//代码块
static{
//使用static关键字,作用域就非常高了
}
//实例变量
String name;
int age;
//类变量
static double salary = 2500; //(自动类型转换)
//主程序方法(main方法)
public static void main(String[] args) {
//局部变量
int i = 10;
System.out.println(i);
//实例变量
Demo07 demo07 = new Demo07();
System.out.println(demo07.name); //null
System.out.println(demo07.age); //0
//类变量
System.out.println(salary); //2500.0
}
//其他方法
public void add(){
}
}
常量
初始化之后不再变动的值。可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变
相关概念:
-
常量名一般使用大写字符
-
final 常量名 = 值;
示例如下:
//练习使用常量
public class Demo08 {
//在变量类型前的修饰符们不存在先后顺序
static final double PI = 3.14;
final static double PAI = 3.1415;
public static void main(String[] args) {
System.out.println(PI);
System.out.println(PAI);
}
}
命名规范
-
所有变量、方法、类名:见名知意
-
类成员变量、局部变量:首字母小写和驼峰原则,如monthSalary
-
类名:首字母大写和驼峰原则,如GoodMan
-
方法名:首字母小写和驼峰原则,如addNum()
-
常量:大写字母和下划线,如MAX_SIZE
六、运算符
Java支持如下运算符(括号的优先级最高,多使用):
运算符类型 | 运算符 |
---|---|
算术运算符 | +、-、、/、%、++、–* |
赋值运算符 | = |
关系运算符 | >、<、>=、<=、==、!=、instanceof |
逻辑运算符 | &&、||、! |
位运算符 | &(与)、|(或)、^(异或)、~(非)、>>(右移)、<<(左移)、>>> |
条件运算符 | ? : |
扩展赋值运算符 | +=、-=、=、/=* |
1. 算术运算符
- 加、减、乘、除、取模
//练习使用算术运算符01
public class Demo09 {
public static void main(String[] args) {
//二元运算符
int a = 10; //IDEA快捷键:Ctrl+D复制当前行到下一行
int b = 20;
int c = 21;
System.out.println(a+b); //30
System.out.println(a-b); //-10
System.out.println(a*b); //200
System.out.println(a/b); //0
System.out.println(a/(double)b); //0.5
System.out.println(c%a); //1
}
}
//练习使用算术运算符02
public class Demo10 {
public static void main(String[] args) {
long a = 123123123123123L;
int b = 123;
short c = 10;
byte d = 8;
//如果(全为整数类型的)表达式中有long型,则结果为long型;否则,都为int型
System.out.println(a+b+c+d); //long
System.out.println(b+c+d); //int
System.out.println(c+d); //int
//如果(全为浮点类型的)表达式中有double型,则结果为double型
double e = 43.1552354;
float f = 0.126f;
System.out.println(e+f); //double
System.out.println(f); //float
}
}
- 自增、自减
//练习使用算术运算符03
public class Demo11 {
public static void main(String[] args) {
//一元(单目)运算符
int a = 3;
int b = a++; //先b=a再a++:b=3,a=4
int c = ++a; //先++a再c=a:a=5,c=5
System.out.println(a); //5
System.out.println(b); //3
System.out.println(c); //5
}
}
-
幂运算
很多运算我们会使用一些工具类来做,以幂运算为例:
//练习使用幂运算
public class Demo12 {
public static void main(String[] args) {
//使用数学工具类Math,计算2^3=8
double pow = Math.pow(2, 3); //IDEA快捷键:Alt+Enter返回值
System.out.println(pow); //8.0
}
}
2. 关系运算符
- 关系运算符返回的结果:正确/错误,用布尔值表示(常与if使用)
//练习使用关系运算符
public class Demo13 {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a>b); //flase
System.out.println(a<b); //true
System.out.println(a==b); //false
System.out.println(a!=b); //true
}
}
3. 逻辑运算符
- &&:两个变量都为真才为真
- ||:两个变量都为假才为假
- !:真变假,假变真(取反)
//练习使用逻辑运算符
public class Demo14 {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
System.out.println(a&&b); //flase
System.out.println(a||b); //true
System.out.println(!(a&&b)); //true
//短路运算
/*
a&&b:若a为假,则直接判断表达式为假,不用判断b了
a||b:若a为真,则直接判断表达式为真,不用判断b了
*/
int c = 5;
boolean d = (c < 4) && (c++ < 4);
System.out.println(d); //false
System.out.println(c); //5
}
}
4. 位运算符
//练习使用位运算符
public class Demo15 {
public static void main(String[] args) {
/*
A = 0011 1100
B = 0000 1101
----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001 对应位相同为0,不同为1
~B = 1111 0010
*/
/* 面试题:-2*8怎么运算最快?-把2*8拆分成2*2*2*2,用位运算(效率极高)
<<就是*2
>>就是/2
--------------
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4 把2左移一位变成4
……
0000 1000 8 把2左移两位变成8
……
0001 0000 16 把2左移三位变成16
*/
System.out.println(2<<3); //16,把2左移3位
}
}
5. 条件运算符
- x ? y : z 意味着:如果x==true,结果为y;否则,结果为z
//练习使用条件运算符
public class Demo16 {
public static void main(String[] args) {
//三元运算符
int score = 80;
String result = score < 60 ? "不及格" : "及格";
System.out.println(result); //及格
}
}
6. 扩展赋值运算符
//扩展赋值运算符
public class Demo17 {
public static void main(String[] args) {
int a1 = 10;
int a2 = 10;
int b1 = 20;
int b2 = 20;
a1 += b1;
System.out.println(a1); //30
a2 -= b2;
System.out.println(a2); //-10
}
}
7. 扩展字符串连接符
//扩展字符串连接符
public class Demo18 {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a+b); //30
System.out.println("a+b="+(a+b)); //a+b=30
//在 + 两侧只要前方出现String类型,就会把后面一个操作数(及剩下操作数)都转换成String再进行连接
System.out.println("a+b="+a+b); //a+b=1020
System.out.println(""+a+b); //1020
System.out.println(a+b+""); //30
}
}
七、包机制、JavaDoc
包机制
-
为了更好地组织类,Java提供了包机制,用于区别类名的命名空间(包的本质就是相当于“文件夹”)
-
一般利用公司域名倒置作为包名
-
//包语句的语法格式为(必须放在最上面): package pkg1[.pkg2[.pkg3...]];
-
为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包(使用import语句)
//*(通配符)会将该包下的所有东西都导入 import package1[.package2[.package3...]].(classname|*);
JavaDoc
-
javadoc命令是用来生成自己的API文档的
-
参数信息
参数 说明 @author 作者名 @version 版本号 @since 指明需要最早使用的jdk版本 @param 参数名 @return 返回值情况 @throws 异常抛出情况
示例如下:
//类(给类加文档注释):
/**
* @author WANGqiuwai
* @version 1.0
* @since 1.8
*/
public class Doc {
//属性:
String name;
//方法(给方法加文档注释):
/**
* @author WANGqiuwai
* @param name
* @return
* @throws Exception
*/
public String test(String name) throws Exception{
return name;
}
}
如何生成JavaDoc文档?
-
通过命令行生成:
右键该类-》Show in Explorer-》找到该类的包路径-》在资源管理器的开头输入cmd 打开Dos窗口-》输入命令javadoc Doc.java,回车-》文档生成,可在文件夹中查看-》点击index.html可查看
若要解决中文显示的乱码问题,在输入命令中可以加上一些参数-encoding UTF-8 -charset UTF-8,使文档更美观,即完整输入:
C:\Users\WANGqiuwai\Desktop\JavaSE\Java基础语法\src\com\wangqiuwai\base>javadoc -encoding UTF-8 -charset UTF-8 Doc.java
-
使用IDEA生成IavaDoc文档