JavaSE 1.1 基础知识
关于数据
基本类型概览
byte | short | int | long | float | double | char | boolean |
---|---|---|---|---|---|---|---|
8位 | 16位 | 32位 | 64位 | 32位 | 64位 | 16位 | 8位 |
下划线的作用
数据太长,可以使用下划线分割方便浏览:100_000_000 。好看,没有实际效果。
浮点数据格式化
"%4.2f",number
: %整个长度度.精度(小数点后面)转换码。
浮点计算为什么不准:
2进制无法表示十进制小数点,除不尽。如1/10,在16进制中为1.6/16,除不通。
所以尽量避免浮点的相等的判断。
如果需要使用浮点运算,且需要精度,可以使用BigDecimal
类。
位运算的符号:
假设整数变量 A 的值为 60 和变量 B 的值为 13
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
---|---|---|
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
数据类型转换:
整形缩小只要装的下也不用显式转换,浮点转整数需要强转,强制转换低位,高位舍去。
强制转换(数据类型) 数据
包装类:
byte | short | int | long | float | double | char | boolean |
---|---|---|---|---|---|---|---|
Byte | Short | Integer | Long | Float | Double | Character | Boolean |
包装类的意义:
基本数据类型没有方法和属性,而包装类有大量封装的方法可以使用,例如:
MIN_VALUE = 0x80000000
:整型最小值。
MAX_VALUE = 0x7fffffff
:整型最大值。
toBinaryString(int i)
:变成二进制的字符串。
parseInt(String s)
:将字符串解析成整型。
除此之外,包装类是引用类型,可以用于泛型。
变量的区别:
- 局部变量:
在方法的内部;出了方法就不能在用了; 没有默认值,必须手动进行赋值。
位于栈内存; 随着方法进栈而诞生,随着方法出栈而消失。 - 成员变量:
在方法的外部,类的里面; 整个类都可以用; 不赋值的话有初始值。
位于堆内存;随着对象创建而诞生,随着对象被“垃圾回收”而消失。
定义的位置不同;作用范围不同;默认值不一样;内存位置不同;生命周期不同。
Java关键字,这里找的图好像是1.5的:(后续JDK还有添加,如assert、default等)
访问控制修饰符
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
-
default (即默认,空): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
-
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
-
public : 对所有类可见。使用对象:类、接口、变量、方法
-
protected : 对同一包内的类和所有子类或无关类可见,不同包的子类。使用对象:变量、方法。 注意:不能修饰类(外部类)。
范围由大到小 public > protected > (default) > private
同一个类(我自己) | YES | YES | YES | YES |
---|---|---|---|---|
同一个包(我邻居) | YES | YES | YES | NO |
不同包子类(我儿子) | YES | YES | NO | NO |
不同包非子(陌生人) | YES | NO | NO | NO |
非访问修饰符
- static 修饰符,用来修饰类方法和类变量。
- final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
- abstract 修饰符,用来创建抽象类和抽象方法。
- synchronized 和 volatile 修饰符,主要用于线程的编程。
- native 用来表示本地的方法,一般是以C++和C写的。
static:
随着类的加载而加载的,且只加载一次。 直接通过类名.
调用。
静态的内容它优先于对象存在,所以,可以被所有对象共享。
static中不能进行this、super的调用。
静态内容不能直接访问非静态。(因为先有静态内容,后有动态内容)
本类中自己调用的自己的静态方法可以不加类名,编译器会自动添加,成员方法必须创建对象才能调用,而类变量和静态方法都推荐使用类名直接调用,而不需要创建类的对象。使用对象调用时,在编译时也会被编译成类名调用。
静态代码块: 会随着类的加载一块执行,可以随意放置,可以存在于该类的任何地方。
final:
表示不可改变。可以用于修饰类、方法和变量。
类: 被修饰的类,不能被继承。
如:public final class String 、 public final class Math 、 public final class Scanner
方法: 被修饰的方法,不能被重写。
对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。
变量:
- 修饰的局部变量为基本类型时,就是数据不能变
- 修饰的局部变量为引用类型时: 地址值不能变,只能指向一个对象,不影响对象内部的改变。
- 修饰成员变量时:不同于局部变量,成员变量有初始化。不能默认赋值,需要直接初始化或构造方法初始化,且每个构造方法都要有该局部变量的初始化。
枚举(enum)
Java 枚举是一个特殊的类,一般表示一组常量。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号,来分割。
一般枚举都是通过内部类实现的,且所有的枚举值都是 public static final 的。
enum Color
{
RED, GREEN, BLUE;
}
public class MyClass {
public static void main(String[] args) {
for (Color myVar : Color.values()) {
System.out.println(myVar);
}
}
switch(myVar) {
case RED:
System.out.println("红色");
break;
}
}
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口。
Enum类的方法
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
枚举类:
跟普通类一样有自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。
枚举既可以包含具体方法,也可以包含抽象方法。 如果有抽象方法,则枚举类的每个实例都必须实现它。
Java基础语句结构
循环标记,循环点
可以通过break直接结束标记的循环。用来结束多层循环,一般不建议使用。
mark:for( ; ; ){
break mark;
}
switch语句:
switch判断中能有基本类型byte/short/char/ 会强转至int,以及String,还有一种enum。
case后面为常量,或final过的变量。
default最好别省,且default的break可以省略但是也做好不省略。
可以使用return直接跳出函数就不用break了
穿透效果:
每个case无顺序要求但不能重复,包括default。
如果执行代码块没有break,那么程序会向下执行下一个case直至break,或者结束(所以最后一个选项可以没有break)。
continue和break的区别:
- continue是结束本次的循环会继续下一次循环,基本要通过条件判断,switch中不能使用。
- break是结束循环,switch中不加条件。
for循环
运行顺序:
for(初始化语句仅执行一次:先 ① 布尔表达式判断:循环体结束后 ③ 步进运算){
为True则 ② 执行循环体;
}
布尔表达式判断为false终止
for的增强循环:
主要用于遍历集合或数组,增删时不能使用,否则会抛出并发修改异常,终止程序。
for(Person x : array ){
System.out.print( x.getName() );
System.out.print(",");
}
for (;boolean expression;)
左右可以省略,或多个表达式,但如果中间是空的,表示中间是true。
do…while循环:
用途:一定会执行一次,先执行再判断while布尔值。
do{//循环体;
}while(布尔表达式);
方法基础
print方法:
System.out.printf("浮点型为:" + "%f, 整型为:" + " %d, 字符串为:" +
" %s", floatValue, intValue, stringValue);
定义方法:
与变量相同使用小驼峰形式,即第一单词的首字母小写例如:thisIsAnExample
public static void 方法名称(parameter){
//方法体
}
完整定义格式:
修饰符 返回值类型 方法名称(传入parametertype parameter,······){
方法体;
return(停止当前方法) 返回值还给调用处;
}
方法定义顺序无所谓,并列定义,不能进行方法嵌套定义。
方法的调用:
- 单独调用
- 嵌套调用
print(method(x))
- 赋值调用
int a = method(x)
return:
直接返回
返回1个值
多个值的返回可以使用数组,集合。
方法的重载(overload):
方法名称相同,参数列表不同。参数可以数量不同或者类型不同。但是只改变参数名称不行,而且与方法的返回值改变也没有关系。顺序不同也是。
**用途:**只需要记住一个方法的名称,即可以实现类似的多个功能,避免了命名的痛苦。
一些Tips
单引号为char,双引号为String
编译器的常量优化:
在编译时,如果在表达式中只有常量,那么编译时直接计算获得结果,在.class中已经是结果了
print类名:
cn.xxx.xxx.hello@1e643f //前面是类型,@后是地址
print时如果仅传入数字,那么+为求和,如果里面含有String类型,那么+为拼接方法。//不怎么确定
数组的地址,即名字。
方法的重载(overload):
方法名称相同,参数列表不同。参数可以数量不同或者类型不同。但是只改变参数名称不行,而且与方法的返回值改变也没有关系。顺序不同也是。
**用途:**只需要记住一个方法的名称,即可以实现类似的多个功能。
方法的重写(override):
和面向对象性质有关,重新改写方法,这里先不提及。
Tips
单引号为char,双引号为String
编译器的常量优化:
在编译时,如果在表达式中只有常量,那么编译时直接计算获得结果,即在.class中已经是结果了。
print:
调用toString
方法
引用类型默认toString
方法为
xxx.xxx.hello@1e643f //前面是包名类名,@后是地址相关的
print时如果仅传入数字,那么+为求和,如果里面含String类型,那么+为拼接。需要加括号,提前运算数据。