详细介绍下static关键字的使用?(静态类、静态方法使用)
静态代码块是当Java类加载到JVM内存中而执行的代码块,由于类的加载在JVM运行期间只会发生一次,所以静态代码块也只会执行一次。
静态变量跟代码块类似,在类加载到JVM内存中,JVM会把静态变量放入方法区并分配内存,也由线程共享。访问形式是:类名.静态成员名。
静态方法可以直接调用类的静态变量和其他静态方法,不能直接调用成员变量和实例方法(除非通过对象调用)。
Java继承好处和坏处,详细介绍;
好处:
提高了代码的复用性(多个类相同的成员可以放到同一个类中,创建子类的对象时,无须创建父类的对象)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
坏处:
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
详细介绍下重写、重载
(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。 (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。 (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
Java的访问权限修饰符有哪几种?权限由大到小排序一下
public:java语言中访问权限最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包访问。
protected: 介于public和private之间 的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只允许被类本身及其子类访问,即使子类在不同的包中也可以访问。
default:即不加任何访问权限修饰符,通常称为“默认访问权限”或者“包访问权限”。该模式下,只允许在同一个包中访问。
private:java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性即方法只能被该类自身的对象访问,其子类不能访问,更不允许跨包访问。
详细介绍super关键字的使用
super.成员变量(访问父类的成员变量)
super.成员方法(访问父类的成员方法)
super(...)访问父类的构造方法(系统默认访问,子类初始化之前会先完成父类的初始化)
详细介绍final关键字的使用?(final修饰变量、final修饰类、final修饰方法)
final修饰变量:表明该变量是常量,不能被再次赋值
变量是引用数据类型会使地址值不能改变
变量是基本数据类型则数据值不能发生改变
final修饰类该类是最终类不能被其他类所继承
final修饰方法该方法是最终方法不能被重写
接口和抽象类的异同点?
相同点:
1.两者都是不断向上抽取而来的'
2.都需要在子类中实现具体的抽象方法
3.都不能用new关键字来创建对象
4.都定义了抽象方法
不同点:
1.抽象类在其类前必须加abstract关键字,而接口需要加interface;
2.在抽象类中除了有抽象方法还可以有其他非抽象方法和实例变量,子类继承后可以直接使用非抽象方法,而接口中,只能定义常量和抽象方法,必须由子类实现;
3.抽象类是需要被继承只能单继承,接口需要被实现可以多实现;
4.抽象类的继承是 is a 的关系,接口的实现是l ike a 关系;
Java多态好处和坏处,以及底层实现技术?
好处:
提高了代码的维护性(继承保证)
提高了代码的扩展性(由多态保证)
可以当作形式参数,可以接收任意子类对象
弊端:
不能使用子类的特有属性和行为。
匿名内部类和Lambda表达式区别?
1.所需类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
2.使用限制不同
如果接口中仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
3.实现原理不同
匿名内部类:编译之后,产生一个单独的.class文件
Lambda表达式:编译之后没有单独的.class字节码文件.对应的字节码会在运行的时候动态生成
手写递归实现阶乘代码
public int sum(int n){
if(n<=1){
return 1;
}
return sum(n-1)+n;
}
说一下开发中常见的异常类型
算数异常类:ArithmeticExecption
空指针异常类型:NullPointerException
类型强制转换类型:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
字符串转换为数字异常:NumberFormatException
输入输出异常:IOException
系统异常:SystemException
栈和队列的区别是什么?
栈是先进后出,栈的遍历速度慢
队列是先进先出,队列可以从头部或者尾部进行遍历,所以遍历速度快
使用栈结构,将一个十进制的数字转换为二进制。
参考8 4 2 1 码转换即可
什么是二叉查找树?
1.二叉树是一种树的特殊形式,它的每个节点最多两个孩子节点,分别为左孩子和右孩子。而二叉查找树在此基础上,还有一个特点,就是每个节点比它左子树的节点值都要大,而比右子树的节点值都要小。
2.二叉查找树常见操作有插入,查找,删除以及遍历。而实际上二叉查找树既可以使用数组来实现,也可以使用链表,本文采用链表来实现。另外本文也排除了两个节点存在相同值的情况。
多线程有几种实现方式?具体介绍一下
实现Runnable接口
实现Callable接口
-
好处: 扩展性强,实现该接口的同时还可以继承其他的类
-
缺点: 编程相对复杂,不能直接使用Thread类中的方法
继承Teached
-
好处: 编程比较简单,可以直接使用Thread类中的方法
-
缺点: 可以扩展性较差,不能再继承其他的类
线程常见状态有哪几种?之间是如何相互转换的?
/* 新建 */
NEW ,
/* 可运行状态 */
RUNNABLE ,
/* 阻塞状态 */
BLOCKED ,
/* 无限等待状态 */
WAITING ,
/* 计时等待 */
TIMED_WAITING ,
/* 终止 */
TERMINATED;
介绍下什么是悲观锁、什么是乐观锁?
synchronized总是从最坏的角度出发,认为每次获取数据的时候,别人都有可能修改。所以在每 次操作共享数据之前,都会上锁。(悲观锁)
cas是从乐观的角度出发,假设每次获取数据别人都不会修改,所以不会上锁。只不过在修改共享数据的时候,会检查一下,别人有没有修改过这个数据。
synchronized和volatile异同点?
相同点:
不同点:
线程写volatile变量的过程: JMM会把该线程对应的工作内存(本地内存)中的共享变量值刷新到主内存
线程读volatile变量的过程: JMM会把该线程对应的工作内存(本地内存)置为无效。线程接下来将从主内存中读取共享变量
synchronized:线程加锁时:
将清空工作内存中共享变量的值,从而使用共享变量时需要时从主内存中重新读取最新的线程值
synchronized:线程释放锁时:
必须把共享变量的最新值刷新到主内存中
同步代码块、同步方法区别?
区别: 同步方法默认用this或者当前类class对象作为锁; 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法; 同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
同步是高开销的操作,因此尽量减少同步的内容。通常没有必要同步整个方法,同步部分代码块即可。
简单介绍下TCP三次握手的具体步骤?
获取class类对象的三种方法
(通常选用第三种方法)
类名.class
对象名.getClass()方法
Class.forName(全类名)方法
详细介绍下反射机制?
什么是反射:
利用该机制可以在程序运行过程中无视访问修改符的操作类中的方法,属性,构造方法等成员。
使用反射的前提条件是:
获取Class字节码对象
如何获得私有成员:
使用带Declared的方法
利用反射使用私有成员前,面要设置什么: