java基础面试题02

1. 值传递和引用传递的区别?

1.值传递:在方法调用中,实参会把它的值传给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽有相同的值,但却有着不同的存储单元。因此对形参的改变不会影响实参的值。
2.引用传递:在方法调用中,传递的是对象(地址值),这时形参与实参执行同一块存储单元,因此对形参的改变会影响实参的值。

2.什么是不可变类?

当创建了这个类的实例后,就不允许修改它的值了。也就是说一个对象一旦被创建出来,在其整个生命周期中,它的成员变量就不能被修改了。

3.Instanceof有什么作用

判断一个引用类型的变量所指向的对象是否是一个类的实例。

4.static关键字有哪些作用?

1.为特定数据类型或对象分配单一的储存空间,而与创建对象的个数无关;
2.实现某个方法或属性与类(而不是对象)关联在一起。
static主要有4中使用情况:
4.1修饰成员变量。static修饰的变量叫静态变量/类变量/全局变量。随着类的加载而加载到方法区中的静态区,并且在静态区赋予了初始值。静态变量优先于对象加载,通过类名.来调用;
4.2修饰成员方法。static修饰的方法叫静态方法,也叫类方法。也是随着类的加载而加载到方法区中的静态区。通过类名.来调用;
4.3修饰静态代码块。静态代码块在类中是独立于成员变量和成员方法的代码块,它不在任何一个方法体内,jvm在加载类时会执行静态代码块,静态代码块优先于构造代码块执行,在类加载时执行,且只执行一次;
4.4静态内部类。静态内部类可以不依赖于外部类实例对象而被实例化,通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通资源,只能访问外部类的静态资源。因为静态只能调用静态的。

5.双亲委派机制

双亲委派机制的工作原理是:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其他父类加载器,则进一步向上委托,依次递归,请求最终达到顶层的类加载器。如果父类的加载器可以完成加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子类加载器才会尝试自己去加载。

6.谈谈jvm的内存结构和内存分配

java虚拟机将其管辖的内存大致分为3个逻辑部分:方法区、栈和堆
6.1方法区是静态分配的,编译器将变量绑定在某个存储位置上,而这些绑定不会在运行时改变。常数池,String常量和static变量保存在方法区;
6.2栈:是一个逻辑概念。特点是先进后出,后进先出,就行子弹匣。一个栈的空间可以是连续的也可以是不连续的。最典型的应用就是方法调用,java虚拟机没调用一次方法就创建一个方法帧(frame),退出该方法时则对应的方法帧被弹出。栈中存储的数据是运行时确定的。
6.3堆分配意味着以随意的顺序,在运行时进行储存空间分配和回收的内存管理模型。堆中储存的数据往往是大小、数量和生命周期在编译时无法确定的。java对象的内存总是在堆中分配
java内存分配:
    1.基本数据类型直接在栈空间分配;
    2.方法的形参直接在栈空间中分配,当方法调用完成后从栈空间回收;
    3.引用类型,需要用new来创建,在栈中分配一个地址空间,在堆中分配对象的类变量;
    4.方法的引用参数,在栈中分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收;
    5.局部变量new出来时,在栈和堆中分配空间,局部变量生命周期结束后,栈空间立即被回收,堆空间区域等待GC回收;
    6.数组在栈空间分配数组名称,在堆空间分配数组的实际大小。

7.如何通过反射创建对象

1.通过类对象调用newInstance()方法,例如String.class.newInstance()
2.通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器对象并调用其newInstance()方法创建对象。

8.java如何实现序列化,有何意义

8.1序列化是一种用来处理对象流的机制。对象流就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可以将流化后的对象传输于网络之间。
8.2要实现序列化,需要让类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可以序列化的。然后用一个输出流来构造一个对象输出流并通过writeObject()方法就可以实现对象的写出;
如果需要反序列化,就用一个输入流来建立一个对象输入流,然后通过readObject方法从流中读取对象。
8.3序列化解决了对象流读写操作时引发的乱序问题。
序列化除了实现对象的持久化之外,还能够用于对象的深度克隆。

9请说出与线程同步以及线程调度相关的方法

wait():使一个线程处于等待(阻塞)状态,并释放所持有的对象的锁;
sleep():使一个正在运行的线程处于休眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
notify():唤醒一个处于等待状态的线程,在调用此方法时,并不能确切的唤醒某一个等待状态的线程,而是有JVM确定唤醒那个线程,而且与优先级无关;
notityAll():唤醒所用处于等待状态的线程,调用该方法并不是将对象的锁给所用线程,而是让他们竞争,只有获得锁的线程才能进入就绪状态。
线程的5个状态:新建状态-可运行状态-运行状态-阻塞状态-终止状态

你可能感兴趣的:(java)