Java SE01_Java基础笔记
1. Java基础
1.1 新建项目
File—New—New Project—Empty Project—next—选择项目名和项目地址—Finish—Create(提示该路径不存在,询问是否创建,有路径的可能没有这一步)—关闭Project Structure—File—New—Module—Java—Module SDK选择1.8—next—输入项目名和项目地址—Finish
配置该项目Jdk:File—Project Structure—Project Settings—Project—Project SDK选择1.8—Project language level选择8—Apply—OK
1.2 注释
注释并不会被执行,是给我们写代码的人看的
书写注释是一个非常好的习惯
平时写代码一定要注意规范
Java中的注释有三种:
单行注释:只能注释当行文字 //
多行注释:可以注释多行文字 /* */
文档注释(JavaDoc):多行,可以加一些注释参数 /** */
1.3 标识符
关键字
Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
所有的标识符都应该以字母(A-Z或者a-z),美元符($0),或者下划线(_)开始
首字符之后可以是字母(A-Z或者a-z),美元符($0),下划线(_)或者数字的任何字符组成
不能使用关键字作为类变量或方法名
标识符是大小写敏感的
可以使用中文命名,但是一般不建议这样去使用,也不建议使用拼音。
1.4 数据类型
强类型语言(Java就是,安全性上升,速度下降)
例如Java、.net、Python、C++等语言,其中Python是动态语言,是强类型定义语言,是类型安全的语言,Java是静态语言,是强类型定义语言,也是;类型安全的语言;
要求变量的使用要严格符合规定,所有的变量都必须先定义后才能使用。
一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了。
弱类型语言
例如:VB,PHP,JavaScript等语言,其中VBScript是动态语言,是一种类型不安全的语言。
要求变量的使用符合规定,所有的变量都必须先定义后才能使用。
某一个变量被定义类型,该变量可以根据环境变化自动进行转换。
两者的优缺点
强类型语言和弱类型原因其判断的根本是是否会隐形进行语言类型转变。强类型原因在速度上可能略逊于弱类型语言,但是强类型定义语带来的严谨性又避免了不必要的错误。
Java的数据类型分为两大类
基本类型(primitive type)
数值类型:
- 数值类型:
- 整数类型
- byte:占1字节,范围:-128~127
- short:占2字节,范围:-32768~32767
- int:占4字节,范围:-2147483648~2147483647
- long:占8字节,范围:-9223372036854775808~9223372036854775807
- 浮点类型
- float:占4字节
- double:占8字节
- 字符类型:char:占2字节
- 整数类型
- boolean类型:占1位,其值只有true和false
引用类型(reference type):类、接口、数组
类型 | 包装类 | 字节位数 |
---|---|---|
byte | Byte | 8位,-128~127 |
boolean | Boolean | 1位,默认false |
short | Short | 16位,-32768~32767 |
char | Character | 16位,存储Unicode码 |
int | Integer | 32位 |
long | Long | 64位 |
float | Float | 32位 |
double | Double | 64位 |
//八大基本数据类型
//整数
int num1 = 10; //最常用
byte num2 = 20;
short num3 = 30;
long num4 = 40L; //Long类型要在数字后面加个L
//小数:浮点数
float num5 = 50.0F; //Long类型要在数字后面加个F
double num6 =3.1415926;
//字符
char name1 = '字';
//字符串,String不是关键字,是类
//String name2 = "字符串";
//布尔值:是否
boolean flag1 = false;
boolean flag2 = true;
1.5 字节
-
位(bit):是计算机内部数据存储的最小单位。11001100是一个八位二进制数
-
字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示
-
1B(byte,字节)= 8bit(位)
-
字符:是指计算机中使用的字母,数字、字和符号
-
1bit表示1位
-
1Byte表示一个字节 1B=8b
-
1024B = 1KB
-
1024KB = 1MB
-
1024MB = 1GB
1.6 数据类型扩展
//整数扩展:进制 二进制0b 十进制 八进制0 十六进制0x
int i1 = 10;
int i2 = 010; //八进制0
int i3 = 0x10;//十六进制0x
System.out.println(i1); //10
System.out.println(i2); //8
System.out.println(i3); //16
//---------------------------------------
//浮点型扩展?银行业务怎么表示?钱
//BigDecimal 数学工具类
//---------------------------------------
//float 有限的 离散 舍入误差 大约 接近但不等于
//double
//最好完全使用浮点数进行比较
float f = 0.1f; //0.1
double d = 1.0/10; //1.0
System.out.println(f == d); //false
float d1 = 22223232323232f;
float d2 = d1 + 1;
System.out.println(d1 == d2);//true
//---------------------------------------
//字符扩展
//---------------------------------------
char c1 = 'a';
char c2 = '中';
System.out.println(c1); //a
System.out.println((int)c1); //97,强制换类型
System.out.println(c2); //中
System.out.println((int)c2); //20013,强制换类型
//所有的字符本质还是数字
//编码 Unicode 2字节 65535 Excel 2^16 = 65535 0-65535,65535个数
//(97 = a,65 = A)
//U0000 -UFFFF
char c3 = '\u0061';
System.out.println(c3); //a
//---------------------------------------
//转义字符
// \t 制表符
// \n 换行
//---------------------------------------
System.out.println("Hello\tworld");//Hello world
System.out.println("Hello\nworld");
/*
Hello
world
*/
//---------------------------------------
System.out.println("----------------------");
String sa = new String("Hello world");
String sb = new String("Hello world");
System.out.println(sa == sb); //false
String sc = "Hello world";
String sd = "Hello world";
System.out.println(sc == sd); //true
//对象 从内存分析
//布尔值扩展
boolean flag =true;
if(flag == true){} //新手
if(flag){} //老手
//Less is More!代码要精简易读
1.7 类型转换
由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换
低—————————————————————–>高
byte,short,char—> int —> long —> float —> double
运算中,不同类型的数据线转化为同一类型,然后进行运算
强制类型转换
自动类型转换
int i = 128;
byte b = (byte)i;//内存溢出,强制转换
double c = i;//自动转换
//强制转换(类型)变量名 高->低
//自动转换,低->高
System.out.println(i);//128
System.out.println(b);//-128
System.out.println(c);//128.0
//---------------------------------------
/*
注意点:
1.不能对布尔值进行转换
2.不能把对象类型转换为不相干的类型
3.在把高容量转换到低容量的时候,强制转换
4.转化的时候可能存在内存溢出,或者精度问题!
*/
System.out.println((int)23.7);//23
System.out.println((int)-45.89f);//-45
char a1 = 'a';
int a2 = a1 + 1;
System.out.println(a2);//98
System.out.println((char)a2);//b
//---------------------------------------
//操作比较大的时候,注意溢出问题
//Jdk新特性,数字之间可以使用下划线分割
int money = 10_0000_0000;
int years = 20;
int total = money * years;
long total2 = money * years; //默认是int,转换之前已经存在问题了
long total3 = ((long)money) * years;//先把一个数转换成long
System.out.println(money);//1000000000
System.out.println(total);//-1474836480,计算的时候溢出了
System.out.println(total2);//-1474836480,计算之前就溢出了
System.out.println(total3);//20000000000
//L和 l都可以表示long类型,但是一般使用大写L,方便区分,代码的规范性
1.8 变量
变量:就是可以变化的量
Java是一种强类型语言,每个变量都必须声明其类型。
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域
变量的命名规范
- 所有的变量,方法,类名:见名知意
- 类成员变量:首字母小写和驼峰原则:eg:monthSalary,除了第一个单词以外,后面的单词首字母大写
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:eg:MAX_VALUE
- 类名:首字母大写和驼峰原则:Man,GoodMan
- 方法名:首字母小写和驼峰原则:eg:run(),runRun()
注意事项:
- 每个变量都有类型,类型可以是最基本类型,也可以是引用类型
- 变量名必须是合法的标识符
- 变量声明是一条完整的语句,因此每一个声明都必须以分号结束
变量作用域
- 类变量
- 实例变量
- 局部变量
public class Variable {
static int allClicks = 0; //类变量,static
String str = "hello world"; //实例变量
//实例变量:从属于对象,如果不自行初始化,值为类型的默认值,
//int默认值为0,0.0,布尔值默认值为false
//除了基本类型,其余的类型的默认值都是null
public void method(){
int i = 1; //局部变量
}
}
1.9 常量
常量(Constant):初始化(initialize)后不能再改变的值!
所谓常量可以理解为一种特殊的变量,它的值被固定后,在程序运行过程中不允许被改变。
常量名一般使用大写字符,关键字为final
修饰符,不存在先后顺序
final 常量名 = 值;
final double PI = 3.14;
static final double A = 'A';//修饰符顺序可以改变
1.10 Java运算符
-
算术运算符:+,-,,*,/,%(取余,模运算),++,–
-
赋值运算符:=
-
关系运算符:>,<,>=,<=,==,!=,instanceof
-
逻辑运算符:&&,||,!
-
位运算符:&,|,^,>>,<<,>>>
-
条件运算符:?:(三目运算符)
-
扩展赋值运算符:+=,-=,*=,/=
-
优先级
instanceof(测试左边的对象是不是右边类的实例,是的话就返回true,不是的话返回false。)
>>>:无符号右移。无论是正数还是负数,高位通通补0。
对于正数而言,>>和>>>没区别。
对于负数而言,-2 >>> 1,结果是2147483647(Integer.MAX_VALUE),-1 >>> 1,结果是2147483647(Integer.MAX_VALUE)。
符号 | 名称 |
---|---|
&& | 短路与运算符 |
|| | 短路或运算符 |
& | 与运算符 |
| | 或运算符 |
代码演示:
//二元运算符
//Ctrl+D:赋值当前行到下一行
int a = 10;
int b = 20;
int c = 30;
int d = 40;
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("---------------------------------");
//自动向上转型
long a1 = 112312312312312313L;
int b1 = 123;
short c1 = 10;
byte d1 = 8;
System.out.println(a1+b1+c1+d1);//112312312312312454(Long)
System.out.println(b1+c1+d1);//141(Int)
System.out.println(c1+d1);//18(Int)
System.out.println("---------------------------------");
//关系运算符返回的结果:正确,错误 布尔值
int a2 = 10;
int b2 = 20;
int c2 = 21;
System.out.println(a2 > b2); //false
System.out.println(a2 < b2);//true
System.out.println(a2 == b2);//false
System.out.println(a2 != b2);//true
//取余,模运算
System.out.println(c2%a2);//1, c2/a2,21/10 = 2 ---- 1
System.out.println("---------------------------------");
//++ -- 自增,自减 一元运算符
int a3 = 3;
int b3 = a3++; //a3++ a3 = a3 + 1 //执行完这行代码后,先给b赋值,再自增
int c3 = ++a3;//执行完这行代码前,先自增,再给b赋值
System.out.println(a3);//5
System.out.println(b3);//3
System.out.println(c3);//5
System.out.println("---------------------------------");
//幂运算2^3 2*2*2 = 8 很多运算,我们会使用一些工具类来操作
double pow = Math.pow(2, 3);
System.out.println(pow);//8.0
System.out.println("---------------------------------");
//逻辑运算符
//与(and),或(or),非(取反)
boolean a4 = true;
boolean b4 = false;
//逻辑与运算:两个变量都为真,结果才为true
System.out.println("a4 && b4:" + (a4 && b4));//a4 && b4:false,
//逻辑或运算:两个变量都为假,结果才为false
System.out.println("a4 || b4:" + (a4 || b4));//a4 || b4:true
//逻辑非运算:如果为真,则变为假,反之亦然
System.out.println("!false:" + !false);//!false:true
//短路运算
int c4 = 5;
boolean d4 = (c<4)&&(c++<4);
System.out.println(d4);//false
System.out.println(c4);//5
System.out.println("---------------------------------");
//位运算
/*
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A/B = 0011 1101
A^B = 0011 0001 (异或,同0异1)
~B = 1111 0010 (取反)
位运算效率极高,和底层打交道
<< 左移*2
>> 右移/2
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
0001 0000 16
*/
//面试题:2*8 怎么最快 位运算
System.out.println(2<<3);//16
System.out.println("---------------------------------");
//扩展赋值运算符
int a5 = 10;
int b5 = 20;
a5+=b5;//a5 = a5 + b5
System.out.println(a5);//30
a5 = 10;
a5-=b5;//a5 = a5 - b5
System.out.println(a5);//-10
System.out.println("---------------------------------");
//字符串连接符 +, String
int a6 = 10;
int b6 = 20;
System.out.println(""+a6+b6);//1020
System.out.println(a6+b6+"");//30
//三元运算符 x?y:z
//如果x==true,则结果为y,否则结果为z
int score1 = 80;
int score2 = 50;
System.out.println(score1<60? "不及格": "及格");//及格
System.out.println(score2<60? "不及格": "及格");//不及格
1.11 包机制
为了更好的组织类,Java提供了包机制,用于区别类名的命名空间
包语言的语法格式为:
package pkg1.[pkg2[.pkg3……]];
一般利用公司域名倒置作为包名;com.baidu.www
为了能够使用某一个包的成员,我们需要在Java的程序中明确导入该包。使用import语句可完成此功能
import com.*;//导入这个包下的所有文件
1.12 JavaDoc
javadoc命令是用来生成自己的API文档的
命令:
javadoc -encoding UTF-8 -charset UTF-8 文件名.java
//-encoding UTF-8 -charset UTF-8 为设置编码格式,避免乱码
idea生成javadoc
Tools—>Generate JavaDoc
-
Generate JavaDoc scope 生成文档范围
-
Whole project 整个项目
-
File ‘….src\com….. 当前文件
-
Custom scope 自定义范围
-
lnclude JDK and library sources in -sourcepath 包含JDK和第三方库
-
link to JDK documentation 链接到JDK文档,即API
-
output directy 生成文档存放的位置
-
private、package、protected、public 生成文档的级别,即类和方法
-
@use 等是指生成文档包含的内容信息
-
Generate hierarchy tree 包含层级树
-
Generate navigation bar 包含导航
-
Generate index 包含索引
-
Separate index per letter 每个字母的单独索引
-
Locale 语言类型,一般设置为zh_CN
-
Other command line arguments 其它命令参数,一般用于设置统一文件编码与字符集 -encoding UTF-8 -charset UTF-8
-
Maximum heap size(Mb) 最大堆大小
-
Open generated documentation in browser 在浏览器中打开生成的文档