Java SE
一、数据类型
1、基本数据类型
字符集、命名规则、关键字、保留字、1byte = 8bit
整数:byte(1字节,-128~127),short(2字节),int(4字节),long(8字节)
浮点:float(4字节),double(8字节),默认double,浮点建议用BigDecimal
字符型:char(2字节)
布尔型:boolean(1位)
2、常量
final 、 static
3、运算
自动转换
强制转换
操作数1类型 | 操作数2类型 | 转换后类型 |
---|---|---|
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
= 号 右侧:所有变量先转换为字节数最多的数据类型,再计算
= 号 两侧:左侧宽度>右侧宽度 自动转换;左侧宽度<右侧宽度 强制转换
二、流程控制
1、选择
if、else、if-else、switch(jdk1.8后String,注意break)
2、循环
while 、for 、do-while、 foreach
3、跳转
break、continue、return
4、递归
注意结束条件
尽量避免使用递归、耗时、费内存
三、数组
1、概述
数组是相同类型数据的有序集合 、
数组属于引用类型
元素是任何数据类型(基本、引用)
长度确定且不变,需要避免越界
声明(可以不确定长度),分配空间(确定)、栈内存
int[] a = new int[5];
int[] b = new int[]{1,2,3}; //静态初始化
int[] c = {4,5,6}; //必须在一条语句中完成
2、二维(多维)数组
int[][] a = new int[2][2];
int[][] b = {{1,2},{3,4,5,6},{7,8,9}};
int[][] c = new int[3][];
int[][] d = new int[][4]; //非法
int e[3][2] = {{1,2},{2,3},{4,5}}; //非法
3、方法
1、 System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
2、Java.util.Arrays:
- .toString
- .equals
- .sort
- .binarySearch
四、类和对象
1、类、方法
方法中的参数传递是值传递
2、修饰符
成员(成员变量戒成员方法)访问权限共有四种:
-
public 公共的
可以被项目中所有的类访问。 (项目可见性)
-
protected 受保护的
可以被这个类本身访问;同一个包中的所有其他的类访问;被它的子类(同一个包以及不同包中的子类)访问 -
default/ friendly 默认的/友好的(包可见性)
被这个类本身访问;被同一个包中的类访问。 -
private 私有的
只能被这个类本身访问。(类可见性)
类的访问权限只有两种:
- public 公共的
可被同一项目中所有的类访问。 (必须与文件名同名) - default/ friendly 默认的/友好的
可被同一个包中的类访问。
3、关键字
this
表示当前对象的引用
构造方法中使用this 来调用其他构造方法,必须是第一条语句
this不能用于static方法
static
-
用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享( 对于该类的所有对象来说, static成员变量只有一份)
-
用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;前期绑定
在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
静态方法不能以任何方式引用this和super关键字 -
静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
1、类第一次被载入时先执行static代码块;类多次载入时, static代码块只执行一次;
是在类初始化时执行,不是在创建对象时执行。
2、代码块
普通代码块 --> 直接在方法戒语句中定义的代码块
构造代码块 --> 直接写在类中的代码块
静态代码块 --> 使用static声明的代码块
同步代码块 --> 多线程中使用 -
静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。
import static java.lang.Math.*;//导入Math类的所有静态属性 import static java.lang.Math.PI;//导入Math类的PI属性
final
- final修饰基本类型,使数值恒定不变。(若无static关键字,可以在创建对象初始化过程中改变数值)
- final修饰基本对象引用,使引用恒定不变,但是引用的对象其本身却是可以被修改的
- 一个既是static又是final的域(变量)只占据一段不能改变的内存空间
- final修饰类不允许继承
- final赋值初始化:必须在域的定义处或者每个构造器中用表达式对final进行赋值
- final修饰方法:把方法锁定,不能override,以防任何继承类修改它的含义。有效关闭动态绑定
super
- super只能出现在子类的方法和构造方法中
- super调用构造方法时,只能是第一句
- super和this不能同时出现在构造方法中
- super不能访问父类的private成员
- super和this都不能在static方法中
synchronize
volatile
-
保证该变量对所有线程的可见性:
-
在多线程的环境下:当这个变量修改时,所有的线程都会知道该变量被修改了,也就是所谓的“可见性”
-
不保证原子性:
-
修改变量(赋值)实质上是在JVM中分了好几步,而在这几步内(从装载变量到修改),它是不安全的。
4、内存分析
- 栈:
- 存放:局部变量
- 先进后出,自下而上存储
- 方法执行完毕,自动释放空间
- 堆:
- 存放new出来的对象
- 需要垃圾回收器来回收:System.gc()
- 方法区:
– 存放类的信息(代码)、 static变量、字符串常量等
5、继承、封装和多态
继承 extends
- 通过super 访问父类中被子类覆盖的方法或属性。 super代表父类对象
任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(…);那么Java默认都会调用super();作为父类的初始化函数。
-
子类继承父类的成员变量和成员方法,但不继承父类的构造方法 ,也不能访问父类private成员
-
注意protected关键字
-
多重继承初始化顺序
父类属性 > 父类构造方法 > 子类属性 > 子类构造方法
抽象类 abstract
抽象方法没有方法体
– 抽象方法必须在抽象类里
– 抽象方法必须在子类中被实现,除非子类是抽象类
多态
同一个引用类型,使用不同的实例而执行不同操作
实现多态的两种形式
– 使用父类作为方法形参实现多态
– 使用父类作为方法返回值实现多态
类型转换
向上转型——子类转换为父类,自动进行类型转换
如果子类重写了父类的某个方法,向上转型对象调用该方法时,是调用的重写方法。
向上转型对象丌能操作子类新增的成员变量和方法
向下转型——父类转换为子类,结合instanceof运算符进行强制类型转换
接口 interface
接口就是规范,定义了一组规则
接口不可以被实例化
实现类必须实现接口的所有方法
实现类可以实现多个接口
接口中的变量都是静态常量
接口中所有方法都是抽象的。
即使没有显式的将接口中的成员用public标示,也是public访问类型的
接口中变量默认用 public static final标示,所以接口中定义的变量就是全局静态常量。
可以定义一个新接口,用extends去继承一个已有的接口
可以定义一个类,用implements去实现一个接口中所有方法。
可以定义一个抽象类,用implements去实现一个接口中部分方法
内部类
普通内部类、静态内部类、匿名内部类、局部内部类
-
普通内部类中不能定义 static 属性
-
静态内部类也是作为一个外部类的静态成员而存在,创建一个类的静态内部类对象不需要依赖其外部类对象。静态内部类中可以定义 static 属性;静态内部类中也无法访问外部类的非静态成员
-
两种使用匿名内部类的情况:
1、直接 new 一个接口,并实现这个接口声明的方法,在这个过程其实会创建一个匿名内部类实现这个接口,并重写接口声明的方法,然后再创建一个这个匿名内部类的对象并赋值给前面的 OnClickListener 类型的引用;
2、new 一个已经存在的类 / 抽象类,并且选择性的实现这个类中的一个或者多个非 final 的方法,这个过程会创建一个匿名内部类对象继承对应的类 / 抽象类,并且重写对应的方法。
-
在局部内部类里面可以访问外部类对象的所有访问权限的字段,而外部类却不能访问局部内部类中定义的字段
-
非静态内部类可以访问外部类所有访问权限修饰的字段(即包括了 private 权限的),同时,外部类也可以访问内部类的所有访问权限修饰的字段。
6、重载(overload)和覆写(override)
方法重载
方法名相同,参数项不相同,羽返回值,修饰符无关
方法覆写(重写)
子类覆写父类方法
重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
7、类加载,对象初始化
类加载
1、确定类变量的初始值:在类初始化的时候,在准备阶段jvm会为类变量(static修饰的变量)初始化,如对象会被初始化为null,int被初始化为0
2、找到入口执行:找到main方法,开始执行,在执行之前会对main方法所在类进行初始化
3、执行类初始化方法:jvm 会按顺序收集类变量的赋值语句、静态代码块,组成类初始化方法去执行
4、执行对象实例化方法:JVM 会按照收集成员变量的赋值语句、普通代码块,最后收集构造方法,组成对象实例化方法去执行
对象初始化
1、**准备阶段是正式为类变量(static 成员变量)分配内存并设置类变量初始值(零值)的阶段,这些变量所使用的内存都将在方法区中进行分配。**这时候进行内存分配的仅包括类变量,而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在堆中。
2、在准备阶段,变量已经赋过一次系统要求的初始值(零值);而在初始化阶段,则根据程序猿通过程序制定的主观计划去初始化类变量和其他资源,或者更直接地说:初始化阶段是执行类构造器()方法的过程。()方法是由编译器自动收集类中的所有**类变量(static变量)的赋值动作和静态语句块static{}**中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句块只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问。
3、在同一个类加载器下,一个类型只会被初始化一次。
4、在Java中, 创建一个对象常常需要经历如下几个过程:父类的类构造器() -> 子类的类构造器() -> 父类的成员变量和实例代码块 -> 父类的构造函数 -> 子类的成员变量和实例代码块 -> 子类的构造函数。
五、异常
1、异常分类
- Error
- Exception
- RuntimeException
* - Checked
- RuntimeException
2、异常处理
1、注意: try-catch-finally中存在return语句的执行顺序 ,先执行完finally中的语句(不含return),再执行catch中的return,如果finally中有return,会覆盖catch中的return
try{
//...
}catch(Exception e){
//...
throw new Exception;
} finally{
//...
}
2、throw和throws的区别
六、常用类
1、String、StringBuffer、StringBuilder
String类位于java.lang包中 , 不可变字符序列
char charAt(int index) //返回字符串中第index个字符。
boolean equals(String other) //如果字符串与other相等,返回true
boolean equalsIgnoreCase(String other)//如果字符串与other相等(忽略大小写),则返回true
int indexOf(String str/int char)//用于查找当前字符串中字符或子串,返回字符或子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。
int lastIndexOf(String str/int idx) //从字符串的末尾位置向前查找
String concat(String str) //将参数中的字符串str连接到当前字符串的后面,效果等价于"+"。
int length() //返回字符串的长度。
String replace(char oldChar,char newChar) //返回一个新串,它是通过用 newChar 替换此字符串中出现的所有oldChar而生成的
String replaceFirst(String regex, String replacement) //该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。
String replaceAll(String regex, String replacement) //该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。
boolean startsWith(String prefix) //如果字符串以prefix开始,则返回true
boolean endsWith(String prefix) //如果字符串以prefix结尾,则返回true
String substring(int beginIndex) 该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。
String substring(int beginIndex,int endIndex) //返回一个新字符串,该串包含从原始字符串beginIndex到串尾戒endIndex-1的所有字符
String toLowerCase() //返回一个新字符串,该串将原始字符串中的所有大写字母改成小写字母
String toUpperCase() //返回一个新字符串,该串将原始字符串中的所有小写字母改成大写字母
String trim() //一个新字符串,该串删除了原始字符串头部和尾部的空格
equals判断字符串值相等, ==判断字符串对象引用相等
StringBuffer:String增强版。字符串缓冲区,是一个容器 ,线程安全
StringBuilder:可变字符序列、效率高、线程不安全
2、时间相关
3、Math
数学相关方法
4、File
IO
5、枚举
- 只能够取特定值中的一个
- 使用enum关键字
- 所有的枚举类型隐性地继承自 java.lang.Enum。(枚举实质上还是类!而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final的。可以直接通过枚举类型名直接使用它们。)
6、包装类
自动装箱和自动拆箱 (auto-boxing & unboxing)
装箱: 基本 -->类 new Integer(int) Integer.valueOf(int i) ;
拆箱: 类 -->基本 intValue()