0%

java零散知识点一

1,什么是java的接口回调?有什么作用?
回调是一种向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口。
学习自回调
先看代码:

回调

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package test2;

//定义回调接口
interface CallBackInterface {
void execute();
}

//创建回调对象
class Boss implements CallBackInterface {
@Override
public void execute() {
System.out.println("收到了!!" + System.currentTimeMillis());
}
}

//创建控制类
class Employee {
private CallBackInterface callBackInterface = null;

//告诉老板的联系方式,也就是注册
public void setCallBack (CallBackInterface callBackInterface) {
this.callBackInterface = callBackInterface;
}
//工人干活
public void doWork () {
//1,开始干活
for (int i = 0; i < 10; i++) {
System.out.println("第[" + i + "]件事干完了!" );
}
//2,告诉老板干完了
callBackInterface.execute();
}
}

public class CallBack {

public static void main(String[] args) {
//测试代码
Employee employee = new Employee();

//将回调对象(上层对象)传入,注册
employee.setCallBack(new Boss());
//开启控制器对象运行
employee.doWork();
}

}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
第[0]件事干完了!
第[1]件事干完了!
第[2]件事干完了!
第[3]件事干完了!
第[4]件事干完了!
第[5]件事干完了!
第[6]件事干完了!
第[7]件事干完了!
第[8]件事干完了!
第[9]件事干完了!
收到了!!1547188964051

为什么会出现回调机制呢?在 现实生活中,比如有如下场景:工厂的老板(Boss,也是上层模块)很忙,他没有时间盯着员工(下层模块)干活,然后他告诉自己的雇员,干完这些事后,告诉他干活的结果。这个例子就是回调+异步的例子。再比如,A程序员写了一个程序a,其中预留了回调函数接口,并封装好了该程序,程序员B让a调用自己的程序b中的一个方法,于是它通过a中的接口回调自己b中的方法。注意:回调和异步不同,回调不是解决时间过长的问题,异步才是。
2,s什么是菱形继承问题?
答:这个问题反映了为什么在java中不允许多继承,如果两个类共同继承一个类,那么该类的方法会被两个子类重写,如果同时继承这两个子类,那么调用该重写方法时,编译器是不能识别你要调用哪个方法的,这个问题被称为菱形继承问题。

3,final,finally和finalize三者之间有什么区别?
答:

  • 1,final关键字是用来在多个语境下定义只能分配一次的实体,final可以声明成员变量、方法、类以及本地变量,一旦将引用声明作final,就不能改变这个引用了,编译器会检查代码,如果试图将变量再次初始化的话,编译器会报编译错误。
  • 2,finally代码块是用于执行重要代码(如关闭连接、流、数据库等)的代码块,无论是否处理异常,finally代码块都会被执行。finally代码块紧跟try或catch代码块。
  • 3,finalize是在删除或销毁对象之前垃圾回收器总会调用的方法,该方法使得垃圾回收机制能够执行清理活动。

4,父类的静态方法能否被重写?为什么?
答:静态方法只与类有关,不与具体实现相关。而且static方法不是后期绑定的,它在编译时期就绑定了。所有引用到该方法的对象(父类也好子类也好)所指向的都是同一块内存中的数据,也就是该静态方法,父类的静态不能被子类继承,就更谈不上重写了。
5,接口回调过程
答:定义一个回调函数,给事件发送方传入接口,在需要的地方调用未实现方法;在事件接收方实例化并处理结果。当事件发生时,会通知回调函数进行处理、
6,泛型原理
答:java的泛型是伪泛型,使用泛型的时候加上的类型参数,会在编译的时候去掉,这个过程叫泛型檫除。泛型只在编译时有效。
7,创建对象的方式
答:

  • 1,new 关键字
  • 2,通过反射创建
  • 3,采用clone方法
  • 4,通过序列化机制

8,object中的公共方法有哪些?
答:equals(),clone(),getClass(),wait(),notify(),notifyAll(),toString(),finalize()。
9,反射中,class.forName()和classLoader的区别?
答:

  • 1,class.forName()除了将类的.class文件加载到JVM中之外,还会对类进行解释,执行类中的static代码块
  • 2,classLoader只做一件事,就是将.class文件加载到JVM中,不会执行static代码块

10,throw与throws的区别
答:

  • 1,throws出现在函数头(声明异常);而throw出现在函数体(指抛出具体的异常)
  • 2,throws表示出现异常的一种吗可能性,并不一定会发生该异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
    1
    2
    3
    throw new NumberFormatException();

    voiud funtion() throws NumberformatException{}

11,java什么被称为与平台无关的语言
答:”一次编译,到处运行”,这是java的口号,java有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得java程序员只需要生成在java虚拟机上运行的目标代码(也就是字节码),就可以在多种平台上运行(当然在不同的平台用不同的虚拟机,比如在window是和mac系统中java的虚拟机就不一样,但是正是虚拟机自己和操作系统底层打交道,而不要程序员编码的时候去考虑这个问题,我们只要生成字节码就可以了,字节码在不同的虚拟机中都可以运行,这样才可以实现”一次编译,到处运行”)。
12,JDK和JRE区别
答:

  • 1,jdk是java Development Kit(java开发工具包),它包含一整套java开发工具,包括JRE和编译器,可以开发、编译执行java程序。
  • 2,JRE是java运行环境,包括java虚拟机和applet
  • 3,JDK包含JRE

13,static修饰的方法能否被覆盖?
答:不能,覆盖试是运行时动态绑定的,而static是编译时静态绑定的,static变量在java中是属于类的,它在所有的实例中值是一样的。
14,finalize()方法
答:finalize()方法是Object()类的一个方法,GC回收对象前会调用finalize()方法
15,为什么内部类调用的外部变量必须final修饰?
答:方法中的局部变量,方法结束后这个变量就要释放掉,然而内部类的某个方法还没有执行完,这个时候它所引用的外部变量已经找不到了。如果定义成final的,java会将这个变量复制一份作为成员变量内置于内部类中。为了解决:局部变量的生命周期与局部内部类的对象的生命周期不一致性的问题。
16,迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object Obj)删除,可以通过迭代器的remove()方法删除
17,array可以包含基本类型和引用类型,ArrayList只能包含引用类型,如果要存基本数据类型,也要用它们的包装类才可以
18,compareable和comparetor接口
答:comparetor:需要实现compare(o1,o2)和equals()方法返回int值,负数,小于;正数,大于;0,等于。
19,异常处理完成后,Exception会发生什么变化?
答:exception对象会在下一个垃圾回收过程中被回收掉
20,浅拷贝和深拷贝以及引用的拷贝
答:先看代码:
引用的拷贝:

1
2
3
4
5
6
7
8
9
//其它的代码省略了
Person p = new Person("zhangsan", 25);
Person p1 = p;

System.out.println(p);
System.out.println(p1);
//运行结果
Test.Person@2c13da15
Test.Person@2c13da15

打印结果是一样的,也就是说两者引用的是同一个对象,并没有创建一个新的对象,

浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着与原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址
深拷贝
会拷贝所有的属性,并拷贝属性所指向的动态分配的内存,当对象和它所引用的对象一起拷贝时发生深拷贝
21,Session和Cookie区别
答: