JavaSE总结

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、charintint
byte、short、char、intlonglong
byte、short、char、int、longfloatfloat
byte、short、char、int、long、floatdoubledouble

​ = 号 右侧:所有变量先转换为字节数最多的数据类型,再计算
​ = 号 两侧:左侧宽度>右侧宽度 自动转换;左侧宽度<右侧宽度 强制转换

二、流程控制

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
  1. final修饰基本类型,使数值恒定不变。(若无static关键字,可以在创建对象初始化过程中改变数值)
  2. final修饰基本对象引用,使引用恒定不变,但是引用的对象其本身却是可以被修改的
  3. 一个既是static又是final的域(变量)只占据一段不能改变的内存空间
  4. final修饰类不允许继承
  5. final赋值初始化:必须在域的定义处或者每个构造器中用表达式对final进行赋值
  6. final修饰方法:把方法锁定,不能override,以防任何继承类修改它的含义。有效关闭动态绑定
super
  1. super只能出现在子类的方法和构造方法中
  2. super调用构造方法时,只能是第一句
  3. super和this不能同时出现在构造方法中
  4. super不能访问父类的private成员
  5. 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

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、枚举

  1. 只能够取特定值中的一个
  2. 使用enum关键字
  3. 所有的枚举类型隐性地继承自 java.lang.Enum。(枚举实质上还是类!而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final的。可以直接通过枚举类型名直接使用它们。)

6、包装类

自动装箱和自动拆箱 (auto-boxing & unboxing)

装箱: 基本 -->类 new Integer(int) Integer.valueOf(int i) ;

拆箱: 类 -->基本 intValue()

七、IO

Java IO

八、Lambda表达式

Lambda表达式

九、Stream API

Stream API

十、自定义注解

自定义注解

十一、多线程

多线程基础

十二、java 容器

java 容器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值