一、Java数据类型
1.1 基本数据类型
数据类型 | 大小 | 范围 | 默认值 | |
整型 | byte | 1字节 | -27—27-1 | 0 |
short | 2字节 | -215—215-1 | 0 | |
int | 4字节 | -231—231-1 | 0 | |
long | 8字节 | -263—263-1 | 0L | |
浮点型 | float | 4字节 | -3.4E38—3.4E38 | 0.0f |
double | 8字节 | -1.7E308—1.7E308 | 0.0d | |
字符型 | char | 2字节 | \u0000—u\ffff | ‘\u0000’ |
布尔型 | boolean | true、false | false |
① 浮点数计算会出现误差,用BigDecimal类
1.2 引用数据类型
类(class) 接口(interface) 数组(array)
二、运算符
2.1 算数运算符
一元运算符 | ||||
正 | 负 | 自增1 | 自减1 | |
+ | - | ++ | -- | |
二元运算符 | ||||
加 | 减 | 乘 | 除 | 取余 |
+ | - | * | / | % |
① a++ 先赋值,后自增 ++a 先自增,后赋值
eg. 若a初始值为1 //a=a++ a为1 //a=++a a为2
2.2 位运算符
十进制转二进制
按位与 | & | 两个数都为1则为1,否则为0 |
按位或 | | | 有一个为则为1,否则为0 |
异或 | ^ | 两个数字相同则为0,否则为1 |
非 | ~ | 1转0,0转1,然后转补码(正数补码为自己,负数补码符号位不变再按位取反加1) |
带符号左移 | << | 左移低位补0 |
带符号右移 | >> | 右移使用符号扩展机制,如果正数,则高位补0,如果负数,则高位补1. |
无符号右移 | >>> | 无论正数还是负数,都高位补0 |
2.3 关系运算符
等于 | 不等于 | 小于 | 大于 | 不大于 | 不小于 | |
== | != | < | > | <= | >= |
① == 对于基本数据类型而言是校验其值是否相等,对于引用类型是判断引用地址是否相同
2.4 逻辑运算符
与 | 或 | 非 | 短路与 | 短路或 |
& | | | ! | && | || |
① 短路与/或和物理串联一样,一个gg,全都gg
&& 与 &的区别:前者只要有一个条件不满足,后面条件不再判断,而后者全判断
|| 与 |的区别:前者只要有一个条件满足,后面条件不再判断,而后者全判断
2.5 三目运算符
布尔表达式?表达式1:表达式2
true 返回表达式1值,false返回表达式2值
2.6 赋值运算符
=、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、|=、^=
2.7 instanceof运算符
a instanceof B 若a继承B或a是B类型,则为true;否则false
注:
a为某个实例,且a必须是可以通过(B)a强转成B类型的,不然编译器会报错。 B不能指定泛型参数
2.8 优先级:
优先级 | 运算符 | |
1 | ()、[] | 从左往右 |
2 | !、+(正)、-(负)、~、++、-- | 从右往左 |
3 | *、/、% | 从左往右 |
4 | +(加)、-(减) | 从左往右 |
5 | <<、>>、>>> | 从左往右 |
6 | <、<=、>、>=、instanceof | 从左往右 |
7 | ==、!= | 从左往右 |
8 | &(按位与) | 从左往右 |
9 | ^ | 从左往右 |
10 | | | 从左往右 |
11 | && | 从左往右 |
12 | || | 从左往右 |
13 | ?: | 从左往右 |
14 | =、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、|=、^= | 从右往左 |
三、流程控制
3.1 条件语句
1.if-else
if(A)
①
else
②
A为true执行①,否则执行②
2.if-else if-esle if...
if(A)
①
else if(B)
②
else if(C)
③
A为true执行①跳出结构体,下面代码不执行
3.2 循环语句
1.for
for(initialization;Boolean-expression;step)
statement
2.foreach
for(variable : collection)
statement
3.while
while(A)
①
A为true执行①,直到A为false停止执行①
4.do-while
do{
①
} while(A);
A为true执行①,直到A为false停止执行①,与while的区别,do-while至少执行语句①一次
3.3 中断流程控制
break、continue、return
注:
①break是跳出当前循环,continue是跳出当前当次循环
②若循环里嵌套循环break只能跳出一个,return可以跳出整个循环
3.4 多选择语句
1.switch
switch(A)
case B:
①;
break;
case C:
②;
break;
注:
①A必须是byte、short、char、int及其包装类、String(jdk1.7以上)、enum
②若不用break,不会跳出结构体代码会继续执行
四、面向对象
4.1 三大特征
1.封装
把对象的属性、方法结合成一个独立的整体,并尽可能隐藏对象的内部细节,只需要调用不用知道里面的如何实现,就像调试接口一样,只要管入参和返回结果即可,这样做有利于程序的安全以及可以减少耦合度。举个例子,我想吃碗汤面,去哪家面馆都行,但是如果我知道有一家面馆汤是药草精炼特制而成能大补,我会更想去那家依赖大补的功能,倘若我知道那汤是如何做的,我可以把配方拿出去卖,对于那家面馆就失去了核心竞争力。
2.继承
子类继承父类,子类可以获取父类的属性和行为,并根据自身的需要扩展新的属性和行为,这样利于代码的复用以及程序的扩展。举个例子,先定义一个类汤面,有属性:汤、面,而这时我需要给汤面加块大肉就可以派生出大肉汤面或者加块大排骨就可以派生出排骨汤面。
注:
①.子类继承父类,子类会拥有父类所有行为和属性,但是访问权(指子类调用)不一定都有
修饰符 | 当前类 | 同包内 | 子孙类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
③.java类不支持多继承,继承破坏了封装性因为子类拥有父类private修饰的属性或方法并且会拥有父类所有属性和行为,请谨慎使用继承,问自己是否需要向上转型需要则用继承(is-a),否则使用组合(has-a)(可以看看《敏捷软件开发:原则、模式与实践》第十四章)
3.多态
不同类对象对同一行为做出不同响应。
多态必要条件:①继承;②重写;③向上引用(父类引用指向子类对象)
## 4.2 抽象类与接口 若父类方法可以没有方法体且该类对象没有任何意义,那么我可以把这个方法定义为抽象方法,并且该类定义为抽象类。
注:抽象类可以没有抽象方法,有抽象方法的类一定是抽象类。抽象类不能实例化,若父类有抽象方法,子类继承不重写那么子类也是抽象类。抽象类与一般类的区别就是抽象...
因为java不支持多继承,只能扩展一个类,并且若一个类并不想拥有另一类的所有属性及行为并无本质上的联系,相互之间只是一种契约关系,那么接口应声而出,接口相对于抽象类而言抽象类是对类抽象,接口是对类局部行为的抽象,是更纯粹的抽象类。
接口与抽象类区别:
①接口没有构造方法,抽象类可以有
②接口没有成员属性,所定义的变量都是static final修饰的,抽象类可以有(1.8因为出了函数式编程,又因为OCP原则,接口可以申明默认方法具有方法体,不要在接口中定义常量)
③接口没有静态方法,抽象类有
④多实现,单继承
4.3 重载与重写
重载:发生在同一个类,方法名必须相同,参数类型不同,个数不同,方法返回值和访问修饰符可以不同
重写:发生在父子类,方法签名必须相同,返回值类型不大于父类,抛出异常不大于父类,访问修饰符不小于父类
4.4 static
static修饰的是属于这个类,和类对象无关,建议直接用类调用即可.
注:
①.执行顺序:
父类静态变量和静态代码块
子类静态变量和静态代码块
父类成员变量和非静态代码块
父类构造方法
子类成员变量和非静态代码块
子类构造方法
②静态方法不会预先执行,非静态代码块在每申明一个新对象时都会执行一次
③.因为static修饰的最先加载,所以static修饰的方法不能直接调用非静态的方法和属性,也因此不能使用this、super,不能被重写
4.5 final
final就是最终的,不可修改的意思。修饰的类不能被继承,修饰的方法不能被重写,修饰的变量为常量只能赋值一次
4.6 call by value 与 call by reference
call by value:值传递(值指基本数据类型),不会改变实际参数的数值
call by reference:引用传递,不能改变实际参数的参考地址, 能改变实际参数的内容
注:
无论哪种传递传参传递的都是是参数的拷贝
4.7 Object方法
①clone方法
默认克隆方法是浅复制(对象引用地址不一样,对象基本数据类型属性不一样而引用类型属性一样),而深复制对象引用地址不一样,对象基本数据类型属性不一样且引用属性也不一样。其次clone是protected的,因为Object类不知道其子类有哪些引用类型,做不到深拷贝,为此必须重新定义clone方法,并将其声明为public实现深拷贝,防止其他地方调用修改了对象引用属性而影响了此对象。当使用clone方法时类需要实现cloneable给一个标记,这样就不会抛出异常
②equals与hashCode方法
equals用于确认两个对象是否相同,默认equals方法比较的是内存地址,而两个不同对象(内存地址不同)具有相同属性时我们希望这两个对象相等,所以需要重写equals方法,而为什么需要重写hashCode方法,因为对象调用equals方法返回true时,他们的hashCode方法返回值也要相等,所以同时需要重写hashCode方法。哈希值相同的对象不一定equals,而equals放回true的两个对象一定哈希值相同。
③toString与getClass方法
toString返回对象值的字符串,当我们需要查看对象部分属性时则重写toString方法
getClass返回Class对象
④wait()、wait(long)、wait(long, int)、notify、notifyAll()
多线程用到(例如生产者消费者),wait方法当前线程由运行状态变为阻塞状态进入等待队列,会释放当前锁
notify唤醒一个线程,notifyAll唤醒所有线程,有关多线程等我看完并发实践会具体分析自己感悟..
⑤finalize
gc时用来确定被回收对象时候没有被引用