Java基础篇 2021/02/23 持续更新中
一、IDEA创建一个Empty Project
-
首先File-> New -> Project
-
next 后 注意命名与路径
-
新建模块,module,之后直接和JavaProject类似
-
设置项目结构(File -> Project Structure)调好自己的版本
-
最后在Module 里面的 src 中新建 java文件书写即可
二、java注释、关键字和标识符
2.1 java 注释(和 C 一样)
java中的注释主要分为三种单行注释,多行注释已经JavaDoc文档注释
public class HelloWorld {
public static void main(String []args)
{
// 这是单行注释
/*这是是多行注释
多行注释*/
/**
* @Description Hello World
* @Author LuckyLight
* 这是javaDoc文档注释
* javaDoc文档注释
*/
System.out.print("Hello World");
}
}
可以在 File -> Settings -> Color Scheme -> java -> comment 修改我们的配色格式
2.2 java 标识符
-
关键字
-
类名称、变量名称、方法的名称也都是被称为标识符
-
标识符命名规则,可以有$
- 所有的标识符都由字母、下划线、美元符号开始
- 首字母后之后可以由字母、下划线、美元符号和数字。
- 标识符大小写 敏感。
三、java数据类型
- java是一个强类型语言:变量必须先定义后使用。 python也是强类型语言,一个变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。
- 弱类型语言, JavaScript, vb等等
3.1 基本数据类型(primitive type)
数据类型 | 表示 | 范围 |
---|---|---|
整数类型 | byte | 1byte, -128~127 |
整数类型 | short | 2byte, |
整数类型 | int | 4byte |
整数类型 | long | 8byte, 后缀是L |
浮点类型 | float | 4byte, 后缀是 F |
浮点类型 | double | 8byte |
boolean类型 | boolean | 1bit |
字符类型 | char | 2byte |
public class HelloWorld {
public static void main(String []args)
{
byte a = 127; // 8 bit
short b = 1024 * 5; // 16 bit
int c = 0x3f3f3f3f; // 32 bit
long d = 1203L; // c ++ 是LL
char ch = 'a';
float x = 0.12F;
double y = 12.241512;
boolean st = false;
}
}
3.2 引用数据类型(reference type)
引用数据类型主要包括类、接口和数组。
比如说 String 就是引用数据类型,他是一个类!
四、数据类型扩展与转换(进制、浮点、字符)
4.1 二\八\十\十六进制
含义 | 前缀 |
---|---|
二进制 | 0b, eg: 0b101010 |
八进制 | 0, eg: 07524 |
十进制 | 无, |
十六进制 | 0x, eg:0x3f3f3f3f |
4.2 浮点数精度 (float, double)
浮点数精度,不能直接判断相等,因为浮点数表示形式为 (由尾数和阶码组成,学过计算机组成原理应该明白),而且还存在舍入误差的情况。 所以出现了一个类BigDecimal,是一个数学工具类
因此,会有一些比较操蛋的情况出现,示例如下
4.3 字符数据(char)
在java中,汉字 居然可以被识别。。。 主要是char为2个字节(2 ^ 16 = 65536)把汉字包括去了。
同时,char 可以按照 ASCII 码强制类型转换为 INT 类型
注意java 的强制类型转化和c++不一样, (int)ch -->这种方法和 c 倒是一样。
下面我们介绍一下char 类型 和 string 类型的 的范围问题,详情查看博客https://www.cnblogs.com/pxb2018/p/10730412.html
1. char
java中的char确实使用2Byte空间,它实际使用的是UCS-2 也就是plane 0,只能表述65536个字符,对于超出其范围的其它plane内容,请看下图:
一旦你使用了大于UCS-2的字符,那么编译器会直接报错!
其实也就是说char使用的是UTF-16格式。有个建议是尽量别用char类型,因为它会导致一些隐蔽的错误。比如,当你在用String时你定义了一个“虫”,你想当然的认为一个char就能盛放String中的一个字符(毕竟char是字符,而String就是描述的char数组),但是你会发现其实这个String的length()是2而不是1,因为它超出了UCS-2,String用两个char的位置(4字节)来表示了这个char,而String本该用一个char的位置来表示它才对。
2. String
首先,String能够支持的字符与你写代码时选择的编码方式有关,当你选择UTF编码时,你可以随便使用Unicode字符,用没脚”虫“当变量名都随你。使用GB*时,没脚虫”虫“不被支持(GBK收录的少一些吧或者这是日本字吧?)
其次,String在Java中是被定义为char数组来组织的,所以你定义的String最终要被转换成char来存放,但是,不要认为超出char的65536就不能存了,如果超出了它会用2个char来存放
public class HelloWorld {
public static void main(String []args)
{
// 首先我们测试一下进制, 0b, 0, 0x
System.out.println("进制的测试!!!\n");
int num2 = 0b1000, num8 = 077, num16 = 0xff;
System.out.println(num2);
System.out.println(num8);
System.out.println(num16);
System.out.println("----------------");
// 测试一下浮点数
float x = 0.1f;
double y = 1.0 / 10;
System.out.println(x == y); // float 还是精度小,double 的话就会显示 true
float x2 = 233428352375878f;
float y2 = 233428352375878f;
System.out.println(x2 == y2); // 这个还是精度舍去了
// 测试一下 char 的强制类型转化
char ch = '好';
System.out.println(ch);
System.out.println((int)ch); // int(ch) 会报错,绝了
char ch2 = (int)97;
System.out.println(ch2);
// \U0000~ \UFFFF
char ch3 = '\u0061'; // 6 * 16 + 1 * 1 = 97,
System.out.println(ch3);
// 转移字符, \t, \n, \r.....
// 更有趣的是,下面这个(需要从对象、内存等的角度进行分析才可以)
System.out.println("=================================");
String sa = "123456";
String sb = "123456";
String sc = new String("123456"); // 这个 original 不是手打的,而是代码自
String sd = new String("123456"); // 己填充的,不要自己打
System.out.println(sa == sb);
System.out.println(sc == sd);
}
}
五、类型转换
基本格式:(类型)变量名
注意事项:
- 从低到高是可以进行自动转换的。
- 从高到低就需要进行强制转换(但是有时候需要注意溢出或者精度!!!问题)
- 不能对boolean进行转换。
- 有些时候 long的强制类型转换需要提前(算法的时候数字相乘就溢出)
- 数字方便的表示方法100_0000_0000L,可以加上辅助的下划线
public class test1 {
public static void main(String[] args) {
boolean flag = true;
// int a = (int)flag; Error:inconvertible types; cannot cast 'boolean' to 'int'
System.out.println("======================");
int x = (int) 1e9;
int y = 10_0000_0000; // 注意这个比较舒服的数字方式,下换线会被忽略!!_
long total = x * y; // 右侧就会溢出了
System.out.println(x);
System.out.println(y);
System.out.println(total);
System.out.println((long)x * y);
}
}
六、变量&常量&命名规范
变量就是可以变化的量,变量的定义形式如下,其中名字必须是合法的标识符(比正常c,c++多了一个美元符号$)
type varName [=value][{, varName[=value]}];
6.1 变量作用域
首先,我们将变量分为类变量(static 修饰的),实例变量(无static修饰的类的成员)和方法变量(类函数方法中的变量)。
// 类变量,实例变量,方法变量
public class demo1 {
// 属性:变量
// 类变量 static
static double salary = 2500;
// 实例变量:从属于对象,不初始化会有默认值
// 数值默认为 0, 0.0, false, 除了基本类型,(引用数据类型)其他为 null
String name;
int age;
// main 方法
public static void main(String[] args) {
// 局部变量:必须声明和初始化数字
int i = 10;
System.out.println(i);
// 变量类型 变量名字 = new 类名();
demo1 d1 = new demo1();
System.out.println(d1.age);
System.out.println(d1.name);
// 输出 类变量salary
System.out.println(salary); // 无static会报错。。。
// java: 无法从静态上下文中引用非静态 变量
}
// 其他方法
}
6.2 常量
- final 常量名=值;
- 常量名一般都大写。
- static final PI = 3.14 等价于 final static PI = 3.14;
- 原因是 static, final, private, public 都是修饰词,需区分前后
6.3变量&常量命名规范
- 首先所有变量方法必须见名知意
- 类成员变量:首字母小写加驼峰原则 lastName
- 局部变量 :首字母小写加驼峰原则 lastName
- 方法名 :首字母小写加驼峰原则 lastName
- 类名 :首字母大写加驼峰原则 LastName
- 常量 :大写字母加下换线 LAST_NAME
七、运算符(operator) & 优先级
7.1 运算符介绍
ctrl + d 复制当前行到下一行。
-
算数运算符 +, -, *, /, %, ++, --
-
赋值运算符 =
-
关系运算符 >, <, >=, <=, ==, !=, instance of
-
逻辑运算符 &&, ||, !
-
位运算符 &, |, ^, ~, >>, <<, >>>(>>>表示的是无符号右移)
-
条件运算符 ? :
-
扩展赋值运算符 +=, -=, *=, /=
下面说一些运算奇奇怪怪的东西
-
无论是short + byte还是byte + byte还是short + short,相加之后的类型为int, 就是说整数相加之后最少为int
-
true == 1 是不允许的, boolean类型无法做运算。
-
if (1) 或者是 if (boolean(1))都不行,和c++有些区别,可能是觉着这个太容易出bug了
-
a+++++b
幂运算使用Math工具类来运算
- \(a^b\)=Math.pow(a, b)
逻辑运算符(短路优化),位运算符和条件运算符
package package2;
public class demo1 {
public static void main(String[] args) {
int a = 5;
System.out.println("短路运算(主要是算法优化)" + (a < 5 && (++ a < 5))); // 后面 ++ a 并不会执行
System.out.println(a);
}
}
字符串连接符 也是 '+'
-
首先 (String)(1)会报错,这点可以理解,但是下面确实挺违反常理的
-
我们看第六行的,后面数字是直接转为 String 进行相连
-
第七行则是先进行了数字的相加,然后才作为String进行相连接。
package package2;
public class demo1 {
public static void main(String[] args) {
System.out.println("str1" + "str2\n");
System.out.println("a + b = " + 11 + 22);
System.out.println(11 + 22 + " = a + b");
}
}
输出结果为
str1str2
a + b = 1122
33 = a + b
7.2运算符优先级
运算符的优先级见下图1所示
八、包机制、 JavaDoc
- 包机制是为了更好的组织类,用于区别类名的命名空间,类似于我们的文件夹
- 定义包机制的语法如下
- package pkg1[. pkg2[. pkg3...]]
- 一般利用公司域名倒置作为包名,例如www.baidu.com--> com.baidu.www 注意用来整理包
整理之后的包文件会更舒服一些:
- 为了使用某一个包中的成员,需要在java程序中导入包,使用import(有点像python),导入包机制的语法如下
- import package1[.package2 ...].(classname|*), 其中 * 表示倒入全部类
// import javax.xml.crypto.Data; // 放在上面就报错,必要再package下面
package com.luckylight.package2; // 必须要写在整个类的最上面,有上面 那句就不行
// import com.luckylight.package1.demo1; // demo1 会冲突的
import javax.xml.crypto.Data;
public class demo1 {
public static void main(String[] args) {
Data a; // 用它必须要导入一个包。
demo1 b;
System.out.println("str1" + "str2\n");
System.out.println("a + b = " + 11 + 22);
System.out.println(11 + 22 + " = a + b");
}
}
九、JavaDoc
- javadoc命令是用来生成自己的API文档(API=Application Programming Interface)的。
- 可以是类的注释,也可以是方法的注释
- 参数信息如下所示:
- @author 作者名
- @version 版本号
- @since 指明需要最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
- 其中,@author 可以多次使用,以指明多个作者,生成的文档中每个作者之间使用逗号 (,) 隔开。
@version 也可以使用多次,只有第一次有效
可以通过命令行 java.doc生成文档,也可以通过idea生成
-
首先open in -> explorer,在cmd中打开,输入
- javadoc -encoding UTF-8 -charset UTF-8 Doc.java
- 其中 -encoding UTF-8 -charset UTF-8 部分是参数,防止乱码问题,Doc.java则是 java 的文件
- 之后再文件夹中找 索引文件 index.html 即可
-
下面介绍如何通过 idea 集成环境生成java API帮助文档
- 选择文档,然后 Tools -> Generate JavaDoc
- 下面的 Locale :语言类型,zh-CN 或者不填