目录
三.bug解决:Welcome.java:6: 错误: 编码GBK的不可映射字符
4.boolean布尔型_if语句使用要点_布尔型占用空间问题
虽然大二的的时候学的挺熟的,但是毕竟过去那么长时间了,还是再来一遍的好,毕竟要系统学习。当然不会太细。
一.注释(单行,多行,文档)
//单行注释
/*多行
注释*/ (多行注释也可以放在有效代码之间)
文档注释:
文档注释以"/**"开头以"*/"结尾,注释中包含-些说明性的文字及一些JavaDoc标签(后期写项目时,可以生成项目的API )——后面会讲
/**
* test 文档注释
* @author 深海鱼肝油
* @version 1.0
*/
public class Welcome {
public static void main(String[] args /*参数名称,可变*/){
//单行注释
System.out.println("hello world!");
}
}
/*
多行啊
百无聊赖啊
*/
二.标识符_关键字_驼峰原则
标识符命名规则:
标识符必须以字母、下划线、美元符号$开头。
标识符其它部分可以是字母、下划线
美元符“$”和数字的任意组合。
Java标识符大小写敏感,且长度无限制。
标识符不可以是Java的关键字。
Java不采用通常语言使用的ASCII字符集而是采用Unicode这样标准的国际字符集。因此,这里字母的含义不仅仅是英文,还包括汉字等等。但是不建议大家使用汉字来定义标识符!
ASCII字符集是用一个字节表示字符,故只有2^8=256个字符;而Unicode字符集是两个字节表示一个字符,故是2^16=65536个字符。
eg:
public class Welcome {
public static void main(String[] args /*参数名称,可变*/){
int 随便=123;//java用的是Unicode字符集,所以汉字可以作为变量名称
int abc=12;
int $salary=3500;
int _year=2021;
System.out.println("hello world!");
}
}
表示类名的标识符:每个单词的首字母大写,如Man, GoodMan
表示方法和变量的标识符:第一个单词小写, 从第二个单词开始首字母大写,我们称之为“驼峰原则”, 如eat(), eatFood()
三.bug解决:Welcome.java:6: 错误: 编码GBK的不可映射字符
当在命令行用 javac 文件名 来编译时报编码错误,就在idea下转化为GBK编码,因为命令行用的是本地操作系统的编码。
在右下角转化为GBK类型即可。
当然一般用不到命令行来编译,除非是用notepad或记事本来写的代码。。
四.常量constant
用final修饰的即成为常量,赋值之后值便不可更改,否则报错。
五.数据类型
Java不像C++一样,编译器不同对应的数据类型的字节数也可能随之变化,Java是固定的。
定义变量的时候建议一行一行的定义,提高可读性,而不是像int i,j;这样。
1.整型
byte1字节,short2字节,int4字节,long8字节
八进制数:开头加0,如016
十六进制数:开头加0x或0X,如0x16
二进制数:开头加0b或0B,如0b1000101
还有,要声明为long类型必须在后面加L或l
eg:
int a=100;
int b=5030303;
int c=05;//八进制
int d=0x15;//十六进制
int e=0b101011;//二进制
long f=5555555;
long f2=55555555555555L;//将整数常量定义为long类型
2.浮点型
因为小数是无限的,所以float4字节和double8字节是肯定不够的,多少位都不够,因为小数无限!所以小数的存储是有误差的。
float类型的数值有一个后缀F 或者f,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d,以明确其为double类型。
eg:
代码:
double d1=3.14;
double d2=3.14e2;//科学计数法表示小数
System.out.println(d2);
//浮点数是不精确的,尽量不要直接进行比较
float d3=0.1F;
double d4=1.0/10;
System.out.println(d4);
System.out.println(d3==d4);
float f5=1234567412356L;//long转float
float f6=f5+1;//如果f5和f6都是整型性的话肯定不相等
System.out.println(f5==f6);
输出结果:
314.0
0.1
false
true
3.字符型
可以转为int型查看字符的序号:(int)c
Unicode具有从0到65535之间的编码,他们通常用从’\u0000‘ 到’\uFFFF’之间的十六机制来表示,前缀为u表示Unicode。
代码:
char c1='a';
char c2='中';
//也可以通过每个字符对应的编码来输出字符
char c3='\u0061';//0061的十六进制就是97
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
//java中的字符串不是基本数据类型,而是一个独立定义的类
String str ="我爱中国";
System.out.println(str);
//转义字符
System.out.println("a\nb\nc\nd\te\tf\tg,\",\',\\");
输出结果:
a
中
a
我爱中国
a
b
c
d e f g,",',\
4.boolean布尔型_if语句使用要点_布尔型占用空间问题
关于boolean类型几个字节的说明:
在《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非
常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令, Java语言表达式所操作的
boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java
虚拟机的byte数组. 每个元素boolean元素占8位"。也就是说JVM规范指出boolean当做int处理,
也就是4字节, boolean数组当做byte数组处理,这样我们可以得出boolean类型占了单独使用是4个
字节,在数组中是确定的1个字节。
建议:
不要这样写:if(flag==true),只有新手才那么写。关键也很容易写错成if(flag=true) ,这样就变成赋值flag为true而不是判断!老手的写法是if ( flag )或者if ( !flag)
示例代码:
boolean b1=true;
boolean b2=false;
if (b1){
System.out.println("正确");
}
else{
System.out.println("错误");
}
六.运算符
整数运算:
如果两个操作数有一 个为long,则结果也为long.
没有long时,结果为int。 即使操作数全为short, byte ,结果也是int。
eg:
int a=5;
long b=7;
long c=a+b;//要用long类型来接受a与b的和,否则报错类型不兼容
浮点运算:
如果两个操作数有一 一个为doubler则结果为double.
只有两个操作数都是 float ,则结果才为float.
取模运算:
其操作数可以为浮点数一 般使用整数,结果是"余数”, “余数”符号和左边操作数相同,如: 7%3=1,-7%3=-1, 7%-3=1。
eg:
int a=1;
Long b=2L;
boolean flag=b instanceof Long;//注意是Long(包装类)
System.out.println(flag);
long c=a+b;
System.out.println(c);
double d=31/3;//先31/3=10(整型运算),之后,再将10赋给double型
System.out.println(d);
输出:
true
3
10.0
关系:
&&,||对比&,| 就是前者是短路,即前半段不符合条件后半段就不用看了!
移位:
int a=5<<2; //相当于5*2*2=20
System.out.println(a);
System.out.println(40>>3); //相当于40/2/2/2=8
字符串连接符:
String a="3";
int b=4;
System.out.println(a+b);
//条件是String,不是char,为char时,仍然是加号。不是连接符
char c1='h';
char c2='i';
System.out.println(c1+c2);
System.out.println(""+c1+c2);//通过加""+,将整个运算转化为字符串连接操作
输出:
34
209
hi
条件运算符:
int score=90;
String a=score<60?"不及格":"及格";
System.out.println(a);
优先级:
不需要去刻意的记这些优先级,表达式里面优先使用小括号来组织! !
逻辑与、逻辑或、逻辑非的优先级一定要熟悉! ( 逻辑非>逻辑与>逻辑威)。如:
allb&c的运算结果是: al(b&c),而不是(alb)&c
自动类型转换:
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型,如下图:
实线表示无数据丢失的类型转换,虚线表示转化可能会有精度的损失!
可以将整型常量直接赋值给byte,short,char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
//从容量小的类型可以自动转化为容量大的类型
int a = 2345;
long b=a;
//int c= b; //long类型不能自动转为int
double d = b;
float f= b;
//特例:整型常量是int类型,但是可以自动转为: byte,short,char。只要不超过对应类型的表数范围。
byte h1 = 123;
//byte h2 = 1234; //1234超过 了byte的表数范围[-128,127]。
char h3 = 600;
//char[0,65535]之间
System.out.println(h3);
输出:
ɘ
强制类型转换:
double a = 3.9415;
int b = (int)a;//b:3.浮点数强制转成整数,则直接丢失小数部分(不会四舍五入)
System.out.println(b);
int c=97;
System.out.println((char)c);
//强制转型,超过了表数范围,则会转成一个完全不同的值。
byte d = (byte)300;
System.out.println(d);
输出:
3
a
44
常见的转换溢出问题(L问题):
出现在该用长整型long时却用了int
//溢出问题
int money = 1000000000; //10亿
int years = 20;
//返回的total是负数,超过了int的范围
int total = money*years;
System.out.println(" total= " + total);
//返回的total仍然是负数。默认是int ,因此结果会转成int值,再转成long。但是已经发生了数据丢失
long total1 = money*years;
System.out.println(" total1="+ total1);
//返回的total2正确:先将一个因子变成long ,整个表达式发生提升。全部用long来计算。
long total2 = (money*(long)years);
//long total2 = 1L*money*years;
System.out.println(" total2=" + total2);
//人的寿命是80岁,经历了多少次心跳
long num = 100L *60*24*365*80; //注意这里100L是长整型
System.out.println("人的一-生心跳次数: " +num);
输出:
total= -1474836480
total1=-1474836480
total2=20000000000
人的一-生心跳次数: 4204800000
成员变量的默认值:
整性:0
浮点型:0.0
字符型:'\u0000'
布尔型:false
所有引用类型:null
七.构造方法
无论自己写的是无参还是有参的构造器,系统都不会再自动生成一个构造器了。
构造器通过new关键字调用! !
构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则编译器不会自动添加!
构造器的方法名必须和类名一致!
OOP:Oriented-Object project 面向对象设计
OOA:Oriented-Object analysis 面向对象分析
将Module理解为子项目。Module也可以设置单独的JDK。