本文将完整详细的总结,归纳Java的基础知识,但不面向0基础,用于帮助大家更好更深入的理解各种框架的原理以及应付面试中的问题。
Java中的常用关键字
比较容易问到的关键字有static
static有三种用法,main方法时自带static关键字的,这是规定。看图中第一处我们用在修饰成员变量上, 被static修饰的变量最先被jvm的类加载器加载,这就意味着在这个类还没有创建实例的时候,被static修饰变量这一行代码已经执行了,这也就是为什么我们可以通过类名直接访问它的静态变量。在JDK8之前static修饰的变量和方法等存在jvm内存中的方法区或永久区中,后来JDK8之后合并至堆区中的元数据区,元数据区中的变量也好方法也好是每个对象公有的,和普通的成员变量不一样,普通的成员变量引用连接的是每个对象私有的,每次创建新的对象时该对象下的引用连接的是被新创建出来的成员变量副本,就是重新copy了一个一模一样的,而静态练练引用是直接连接只元数据区的变量母本,不会产生副本。被staic修饰的都具备这个特点,因为Java的思想就是一切皆为对象,无论变量,方法还是类。
static还有一个用法就是修饰代码块,静态代码块的优先级仅次于静态变量。
static修饰方法时与静态变量具有相同用法。
static还可以修饰内部类,静态内部类有可能会出现在笔试题中,他会叫你修改几处代码使代码通过编译。
那么图中除了static还有一个关键字就是for了,for和while是常用的两种循环。在JDK10的版本中,Hotspot虚拟机对循环做了优化,就是虚拟机结合逃逸分析判断循环中是否存在重复执行却不对现在情况造成影响的代码,这部分代码不会被执行。比如循环获取一个单例对象的实例10000次,那么获取实例的方法只会执行1次。在面试题中可能会要求不使用for,while来实现循环。,看下图。
图中代码也被称为递归,它的思想就是通过一个计数器来控制调用次数,if中的内容也可以使用boolean变量,通过判断boolean来进行是否继续调用自己的操作。这里巧妙地用到了static这个关键词,如果递归中不用static修饰成员变量,每次方法都使用成员变量副本,那么index值永远都到不了100,反而它所在的栈结构会被撑爆。就会扔出stackOverFlow异常。
这里还用到了if关键字,与之类似的还有switch,instanceof等与boolean紧密相关的关键字。
Java是一门纯面向对象语言,那么面向对象的思想就是继承,封装和多态。我们编写符合面向对象思想的代码就是优质的代码,用好继承是其中一点。extends是继承的关键字,它能够拥有所继承父类的一切方法与属性,jvm在创建子类时会优先创建父类中的静态变量,静态块等一系列以供子类使用,所以子类不是凭空冒出来的,在这里没有鸡就是没有蛋的,那么子类对象被创建也就是被classLoader加载的时候,加载顺序是父类的静态变量,静态块,构造方法,然后是子类的静态资源然后父类的成员变量等其次是子类的一系列东西。
Java中还存在8个基本数据类型,常用的有int,long,float等。在这里我们通常会把小数乘10或者一百等来避免浮点运算,来减轻cpu压力,而这些基本类型-128到127是属于常量的,也就是byte的范围常年缓存在一个叫做常量池的容器里面,这也是常见的面试题不过比较简单。在二进制层面,可以把byte,short看做int类型的一部分,long和double也是同理。什么意思呢,int占四个字节就是01111111 111111111 11111 11111111 这种组成,最前面的叫做符号位,byte可以看做0000000000 00000000000 00000000 0111111111,这种形式也是四个字节,但是前面三个字节常年为0所以被忽略了,就成了一个字节的byte 。二进制运算在字符集编解码方面有很大应用,还有逻辑位移数学位移等,面试中不会问,但说出来有可能加分。但是这里有一道面试题,如下图
这两种写法都能算出结果是8,他会让你求出2的n次方最高效率写法。第一种应该都可以看的懂,第二种就是左移运算,2的2进制是000000000000 0000000000 0000000000 000000000010,这就是2。2是个很特殊的数字,因为目前计算机都是二进制的,所以我们如果要算2的3次方可以直接将2想做移动2 就是 000000000 000000000 00000000000 000000001000。为什么前面那么多0呢,因为java中默认数字都是int类型的,小数是double,这种位移运算算是最原生相比2*2*2也就蚊子腿提升,但是优化就是这样,1块钱不算很多钱,但是每个人的一块钱加到一起就是很多钱,越底层的运算越需要优化,其实我们java并不是很在乎这些,但是面试笔试题有可能出。
基础知识部分也就这么多了,如果有以后请大家在评论区提醒一下,后面的文章会专门讲解 常考不常用的算法,集合,多线程,反射,socket等知识。