JAVA新手 2018年12月26日
术语解释
JDK
JDK英文全拼为java development kit,所以jdk就是程序员编写java程序所需要的软件
JRE
JRE英文全拼为java runtime enviroment,所以jre就是运行java程序所需要的环境
OpenJDK
javase的免费开源实现
JAVA程序为什么可以跨平台运行
java是一门解释性语言,因此java源代码
(后缀为.java的文件)在编译完成后生成的是字节码文件(后缀为.class),但是字节码文件并不能直接运行,需要由java虚拟机进行解释然后运行。不同的平台会有不同类型的虚拟机,但是同一份class文件可以交给不同的虚拟机来解释运行,并且最后执行结果相同,所以java是一门跨平台的语言。
基本数据类型
| 数据类型 | 长度(字节) | 备注 |
| byte | 1 | |
| short | 2 | |
| char | 2 | char相当于C中的无符号16位数,数据范围为0-65535 |
| int | 4 | |
| long | 8 | |
| float | 4 | |
| double | 8 | 浮点数字面值默认为double,若要转换为float类型,在字面值后面加F |
| boolean |
常量
用final关键字来修饰变量,常量类型只能被初始化一次
修饰方式:表示该方法不可被重写
class Base{
static final int sf = 11;// 静态常量
final int f1 = 10;// 定义时初始化
final int f2;
{
this.f2 = 10;// 代码块初始化
}
final int f3;
public Base(){
this.f3 = 10;// 构造器初始化
}
public static void main(String[] arg){
final int c = 1;// 定义时初始化
final int d;// 定义
d = 11;// 后初始化
}
}
注意:静态常量只会在类加载的时候进行一次初始化,而实例常量在每次创建对象的时候都会进行一次初始化。
对象创建过程
字面值类型数据相加
(11D + 11F) => double
(11F + 11L) => float
(11L + 11) => long
(11 + 11) => int
short s = s + 1;? 为什么执行错误? short s += 1;? 为什么正确
第一个表达式:字面值1默认为int类型数据,存在类型不匹配问题
第二个表达式:+=操作符会进行数据类型强制转换操作
运算符
- & 位与、非短路逻辑或
- | 位或、非短路逻辑或
- && 短路逻辑与
- || 短路逻辑或
- >> 带符号右移
- << 带符号左移
- >>> 无符号右移
带符号移位不动符号位的位置,无符号移位会移动符号位的位置
原码、反码和补码
- 原码:数字原本的二进制表达
- 反码:正数不变,负数符号位不变,其他位取反
- 补码:正数不变,负数符号位不变,其他位取反后再加1
字符串
String是引用类型数据,不是基本数据类型
// String用final修饰,是一个不可继承类
public final class String implements ...{
/**
* 常量字符数组
* 对象创建完毕之前只能初始化一次,因此字符序列也被固定
* String对象本身的值不能被改变,只能让String类型的引用指向一个新的String对象
*/
private final char value[];
}
字符串常量池
- 字符串字面值拼接时,会从常量池中查找字符串对象,如果有就引用,没有就创建一个
- 字符串类型变量相加时,会创建一个StringBuilder进行字符串拼接
字符串常用方法
- substring
- split
- equals
- charAt
- getBytes
- trim
- length()
StringBuilder和StringBuffer
- StringBuilder线程不安全,效率高
- StringBuffer线程安全,效率低
控制流程
switch
- 适用于byte、char、short、int和String,不适用long和浮点数
面向对象
四个特性
- 封装:将数据和操作数据的方法绑定起来,对外屏蔽内部实现细节,只提供访问接口
- 继承:从现有类获取继承信息,创建新类的过程
- 多态:不同的子类型对象对同一事件作出不同的响应
- 抽象:将某一类对象的属性和行为提取出来,创建新类的过程
类之间的关系
- 依赖(use a):一个类的方法操作另一类的对象
- 聚合(have a):一个类的对象包含另外一个类的对象
- 继承(is a):
对象创建
/**
* name 对象引用,指向对象,name引用在方法内创建则存储在栈
* 对象始终存储在堆
*/
String name = new String("lily");
方法
- 在java中方法参数只存在值传递,不管是基本数据类型,还是引用数据类型
重载
发生在同一个内部,方法的名称相同,通过入口参数的不同进行区分,返回值、权限修饰符和抛出异常类型可以不相同,但不能用来区分方法
重写
发生在继承了父类的子类中,对继承的方法实现重写,方法名称和入口参数相同,访问权限只能扩大
静态绑定和动态绑定
- 静态绑定:private方法、static方法、final方法
- 动态绑定:在运行时确定具体要调用的方法
equals方法
- 特性:自反性、对称性、传递性、一致性、与null equals为false
hash值
- 哈希值是一个常数,默认情况下等于对象存储地址
- 也可以重写hashCode方法,自己实现哈希值的计算方法
- 哈希值和equals方法之间存在关联
-
- 两个对象equals为true,那么哈希值一定相等
- 哈希值相等,两个对象equals不一定true
hash值和equals之间为什么存在这样的关系
- 两个对象equals为true保证哈希值相同,那么在那些用哈希值判断存储索引并且元素不重复的集合中可以保证相同的对象存储在同一个位置
- 哈希值相同,但是两个对象不相同,就会在同一个位置存储不相同的对象,这就是哈希冲突,但是可以通过改变存储方式解决该问题,虽然会引起读取、存储的性能下降