Java基础语法
基础不牢,地动山摇
目录
1. 注释、标识符、关键字
(1)注释
书写注释是一个非常好的习惯
分类:单行注释//、多行注释/* */、文档注释/** */
在新创建一个项目时,我们在学习初期,可以创建一个空项目(empty project)-右键new一个module-选择java的module-自己命名-找到project structure-发现报红-选择自己的SDK和相对应的language level-apply-OK
——如何修改IDEA中注释的颜色?file-settings-editor-java-comments
注释不会执行,只是写给程序员看的
(2)标识符和关键字
关键字 | ||||
---|---|---|---|---|
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 |
标识符:类名、变量名、方法名都称为标识符
注意
-所有标识符应该以字母(A-Z/a-z),$, _开头
-首字母之后可以是字母(A-Z/a-z),$, _或者数字的任何字符的组合
-不能使用关键字作为变量名或者方法名
-标识符是大小写敏感的
(一些非法的例子:123abc不能以字母开头, -salary不能以减号开头, #abc不能以井号开头)
-可以使用中文命名,但是不建议,也不建议用拼音
//可以尝试运行下面的代码,是欧克的
String 原神 = "芭芭拉";
System.out.println(原神);
2.数据类型
强类型语言:变量使用要严格符合要求,所有变量必须先定义后才能使用
java属于强类型语言
(强类型语言安全性高,but速度慢)(对应语言为弱类型语言比如javascript)
(1)基本类型和引用类型
1)8个基本类型
包括数值类型(整数byte,short,int,long,浮点数float,double,字符char)和boolean类型(其值只有true&false)
String不是关键字,而是类
在定义一些变量时,要注意规范化:long类型要在数字后面加L,float要在后面加F
2)引用类型
包括类、接口、数组
【补充一些基础知识点:涉及计算机组成原理】
位(bit):计算机内部存储的最小单位,1100 1100是一个八位二进制数,在存储器中用一个CMOS晶体管表示0/1
字节(byte):计算机中数据处理的基本单位,用B表示,1B=8bit
具体有关位、字节、字的关系以及其在硬件上的联系,计算机如何存储0和1,可以学习计算机组成存储器的相关知识
字符:计算机中使用的字母、数字、字和符号
-1024B=1KB,即2的10次方=1KB,B,KB,MB,GB之间的转换间隔都是2的十次方
-问:电脑的32位和64位的区别是什么? 这里是多少位指的是机器字长,32位只能装32位的OS,64位既可以装64位OS也可以32位,32位支持4GB内存(2的32次方B),64位支持128GB,代表了计算机的寻址能力,也对应了计算机中寄存器的位数。
(2)整数、浮点数、字符、布尔值拓展
1)整数拓展——进制
整数数值的表示常常用二进制、十进制、八进制和十六进制表示
通常在数字前面加上0b表示二进制,加上0表示八进制,0x表示十六机制
int i = 10; //十进制
int i2 = 010; //八进制
int i3 = 0x10; //十六进制
System.out.println(i); //输出结果为10
System.out.println(i2); //输出结果为8
System.out.println(i3); //输出结果为16
2)浮点数拓展——浮点数比较
--浮点数表示的数是有限、离散的,拥有舍入误差,得到的结果都是大约数,是接近的但是不等于的
--因此,最好完全避免使用浮点数进行比较
float f = 0.1f; //其实最好f用F
double d = 1.0/10;
System.out.println(f==d); //输出结果是false
float d1 = 232323232f;
float d2 = d1+1;
System.out.println(d1==d2); //输出结果是true,因为浮点数是约数
提前预告:在银行表示金钱不得不用浮点数的时候,我们一般采用BigDecimal(数学工具类),用以表示大金额
3)字符拓展
char都是表示一个字母或者一个汉字,一定要与字符串相区分;
所有的字符本质还是数字,比如ASCII码
我们可以采用强制转换,看到字符是数字表示的本质
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
char c3 = '\u0061';
System.out.println(c3); //输出a
转义字符
转义字符是一种特殊的字符常量,以\开头,后跟一个或者多个字符,具有特定的含义,不同于字符原有的意义
转义字符 | 含义 |
---|---|
\n | 换行(LF),将当前位置移到下一行开头 |
\t | 水平制表符(HT),用于对齐输出 |
\b | 退格(BS),将当前位置移到前一列 |
\r | 回车(CR),将当前位置移到本行开头 |
\ ' | 单引号字符 |
\ " | 双引号字符 |
\ \ | 一个反斜线字符 |
\? | 一个问号 |
\0 | 空字符(NULL) |
4)布尔值拓展
布尔值常常用来作为标志变量进行判断
boolean flag = true;
if(flag){
System.out.println("less is more");
}
后续提前预告
为什么会出现以下情况?从对象、内存分析
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
3.类型转换
从低到高——byte,short,char->int->long->float->double小数优先级大于整数
运算中,不同类型的数据先转化为同一类型,然后进行运算。不能对布尔值进行转换,也不能把对象类型转换为不相干的类型。
(1)强制转换
(类型)变量名 ——从高到低的转换,容易出现内存溢出和精度问题,要尽量避免
内存溢出举例:
int i = 128;
byte b = (byte)i; //属于强制转换,从高到低,发生内存溢出
System.out.println(b); //输出-128
(2)自动转换
从低到高的转换
【补充:操作比较大的数,需要注意溢出问题
JDK新特性,数字之间可以用下划线分割,比如1000000000可以表示为10_0000_0000】
【一个溢出和转换的小应用】
int money = 10_0000_0000;
int years = 20;
int total = money * years; //int在计算的时候发生溢出
long total2 = money * years; //默认是int,在计算时发生溢出,得到结果是int,是溢出的,然后从int转换为long,所以也溢出
long total3 = money * ((long)years);
System.out.println(total); //输出-1474836480
System.out.println(total2); //输出-1474836480
System.out.println(total3); //输出20000000000,结果才正确
我们的数值后缀尽量用大写,不然容易看花眼,l——L,f——F
4.变量、常量
同一元二次方程中的未知数和常数
(1)变量
可以变化的量,可能就是指的一块内存空间
type varName [=value][{,varName[=value]}];
//数据类型 变量名 = 值:可以使用逗号隔开来声明多个同类型变量,但是不建议一行定义多个值
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域
【变量声明是一条完整的语句,因此每个声明必须以分号结束】
【变量声明的规范化】
int a = 1, b = 2, c =3; //可以一行进行多个变量的声明,但是不建议这样做,影响程序可读性
//下面是规范的
int a = 1;
int b = 2;
int c = 3;
String name = "Delia";
char x = 'X';
double pi = 3.14;
1)变量名
变量名必须是合法的标识符
2)变量类型
每个变量都有类型,类型可以是基本类型,可以是引用类型
3)作用域
按作用域分类,变量分为类变量,实例变量和局部变量
类变量:写在类里面的
实例变量:类中间
局部变量:写在方法里面的
public class Variable{
static int allClicks = 0; //类变量,要加关键词static,写在类里面
String str = "hello world"; //实例变量,没有static关键词,类中间
public void method(){
int i = 0; //局部变量,写在方法里面
}
}
具体举例:
//类变量
//需要用static修饰,从属于类,和类一同出现一同消失
public class Demo{
//类变量,属于Demo类
static double salary = 2500;
//main方法
public static void main(String[] args){
System.out.println(salary);
}
//其他方法
public void add(){
//lalala
}
}
//实例变量
//类里面,方法外面,从属于对象,没有static
//如果不进行初始化,会自动默认
//整数-0,浮点数-0.0,布尔值-false,除了基本类型,其余的默认值都是null
public class Demo{
//实例变量
String name; //不需要初始化
int age;
public static void main(String[] args){
//不用特别看懂,后面会单独讲用法
//变量类型 变量名字=new Demo();
Demo demo = new Demo();
System.out.println(demo.age);
System.out.println(demo.name);
}
}
//局部变量
//必须声明和初始化值
//生命周期在所属的方法的大括号里面
public class Demo{
public static void main(String[] args){
//局部变量
int i = 10;
System.out.println(i); //result---10
}
//other methods
public void add(){
System.out.println(i); //Error!!!
}
}
(2)常量
初始化后就不能改变的值,被设定后,就不允许改变
//final 常量名 = 值;
final double PI = 3.14;
常量名一般用大写字母。//类似C-const
final是修饰符,不存在先后顺手,适当使用常量可以提高程序可读性
static final double PI = 3.14;
final static double PI2 = 3.14;
//两条语句含义完全相同
(3)变量的命名规范
1)所有变量、方法、类名:见名知意
2)类成员变量:首字母小写和驼峰原则:monthSalary,除了第一个单词以外,后面的单词首字母大写
3)局部变量:首字母小写和驼峰原则
4)常量:大写字母和下划线:MAX_VALUE
5)类名:首字母大写和驼峰原则:Man, GoodMan
6)方法名:首字母小写和驼峰原则:run(), runRun()
5. 运算符
Java所支持的运算符:
算术运算符:+,-,*,/,%,++,--
有关自增自减:一元运算符
int a = 3;
int b = a++; //b=3,执行后a=4
int c = ++a; //a先自增=5,c=5
【疑问?如何实现幂运算?Java中提供了Math】
//幂运算
double pow = Math.pow(2,3);
System.out.println(pow); //8.0
赋值运算符=
关系运算符:>, <, >=, <=, ==, != instanceof,返回的结果只有true和false
逻辑运算符:&&,||, !,就是与或非
逻辑与运算:两个变量都为真,结果才为true
逻辑或运算:两个变量有一个为真,则结果才为true
逻辑非运算:如果为真,则变量为假;如果为假,则变量为真
//与或非
boolean a = true;
boolean b = false;
System.out.println("a&&b:"+(a&&b)); //false
System.out.println("a||b:"+(a||b)); //true
System.out.println("!(a&&b):"+!(a&&b)); //true
【注意】与运算和或运算具有短路运算
--与运算只要出现一个0,则第二个表达式不用执行直接为false,或只要第一个为1,第二个不执行直接为true
//短路运算
int c =5;
boolean d = (c<4)&&(c++<4);
System.out.println(d); //输出false
System.out.println(c); //输出5
在上述代码中,由于c<4为false,&&运算必定为false,故而没有执行c++,因此c仍然为5
位运算符:&, |, ^, ~, >>, <<, >>>(了解)
&表示按位与运算,|是按位或运算,^是异或(相同为0,不同为1),~是每位取反
<<和>>是左移和右移,例子,2*8如何计算是最快的,换成四个2相乘,按照位运算效率最高,2<<3
条件运算符 ?:
//三元运算符
//格式:x?y:z,如果x==true,则结果为y,否则为z
int score = 80;
String type = score < 60 ? "不及格" : "及格"; //必须掌握,常常用来替代if
System.out.println(type); //输出结果为及格
扩展赋值运算符:+=, -=, *=, /=
a+=b相当于a=a+b, a-=b相当于a=a-b,以此类推
优先级可以在自己应用中学会,可以多打括号
有关字符串连接符
通过代码例子来感受
int a = 1;
int b = 2;
System.out.println(a+b); //输出为3
System.out.println(""+a+b); //输出为12
System.out.println(a+b+""); //输出为3
因此,如果字符串连接符两侧都是整数或者浮点数,那么输出结果就是两数相加;
如果字符串连接符左侧是字符串,那么会默认右侧的所有都为字符串,直接输出数字的数值;
如果字符串连接符右侧是字符串,那么会默认左侧的数字为加法运算,然后输出右侧的字符串。
6.包机制、Java Doc
(1)包机制
为了更好的组织类,提供包机制,用于区分类名的命名空间
包的本质就是文件夹,一般利用公司域名倒置作为包名
比如com.liu.xxx
//包语句的语法格式
package pkg1[. pkg2[. pkg3...]];
一般IDEA都是自动默认添加在第一行的。
尽量不要让包内的文件名重复;
为了能使用某一个包的成员,需要在Java程序中明确导入该包,使用import语句
import package1[.package2...].(classname|*);
//classname是某一个,*是导入该包的所有文件
学习规范可以参考阿里巴巴规范手册
(2) JavaDoc
Javadoc命令是用来生成自己的API文档的
Overview (Java Platform SE 8 ) (oracle.com)
参数信息:
参数信息 | 表示内容 |
---|---|
@author | 作者名 |
@version | 版本号 |
@since | 指明需要最早使用的jdk版本 |
@param | 参数名 |
@return | 返回值情况 |
@throws | 异常抛出情况 |
举例:
package Base;
/**
* @author delia
* @version 1.0
* @since 1.0
*/
public class Demo06 {
String name;
//此处的文档是点击文档注释自动生成的部分内容
/**
* @author delia
* @param name
* @return
* @throws Exception
*/
public String test(String name) throws Exception{
return name;
}
}
【如何生成javadoc文档?】
【法一】命令行生成
选中所在包——右键找到openin——explorer——在文件夹中打开终端——输入javadoc [options] [packagenames] [sourcefiles] [@files] (例如javadoc -encoding UTF-8 -charset UTF-8 Demo06.java——打开所在文件夹多出来的index.html
具体步骤如下图所示:
选中所在包右键
进入所在文件夹之后进入终端命令行
在终端输入相关语句生成javadoc
可以看见在该所选的文件夹中多出了许多之前没有的文件
点击其中的index.html,打开,可以看到我们的javadoc文档
选中Demo06我们就可以看到文档中具体的所有内容
【法二】在IDEA中实现
工具栏Tools——Generate JavaDoc——按下图设置,output directory可以自定义——generate
工具栏找到
选中开始设置
生成文档