java面试基础知识
1、静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量是属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配内存空间,才可以使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会分配内存空间,而且只分配一次,静态变量就可以被使用了。总之,实例变量必须创建后才可以通过这个对象来使用,静态变量则直接可以使用类名来调用。
2、什么是反射机制?
java反射是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法,对于任何一个对象,都能够调用它的任意一个属性和方法,这种动态获取信息以及动态调用对象的方法的功能称为java的反射机制。
3、什么是装箱?什么是拆箱?
装箱:自动将基本数据类型转换为包装器类型。
拆箱:自动将包装器类型转换为基本数据类型。
4、Java 中覆盖和重载是什么意思?
覆盖(Override)是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小,被覆盖的方法不能是 private的,否则只是在子类中重新定义了一个新方法。
重载(Overload)表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同。
java基础知识面试题及答案
1、static关键字什么意思?java中是否可以覆盖一个private或者是static的方法?
“static”表明一个成员变量或者是成员方法可以在没有所属类的实例变量的情况下访问。
java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法与类的任何实例都不相关。
java中不可以覆盖private方法。因为private修饰的变量和方法只能在当前类中使用,如果是其他类继承当前类,继承类中是不能访问到private变量和方法的。
2、能否在static环境中访问非static变量?
不能。static变量是属于类的。当类被虚拟机载入时,会对static变量进行初始化。非static变量是属于实例的,这个时候实例还没有被创建,编译器会报错。
3、java基本类型,什么是自动拆装箱?
基本类型:byte,short,int,float,long,double,boolean,char
自动装箱:是java编译器在基本类型和对应的对象包装类型之间做一个转化。比如把int转化为Integer等等。反之为自动拆箱。
4、java的方法覆盖overriding和方法重载overloading是什么意思?
java中方法重载发生在同一个类中有两个或者多个方法名字相同但是参数不同的情况。方法覆盖是子类重新定义父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。
5、java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
当新对象被创建时,构造方法会被调用。每一个类都有一个构造方法,在没有给类提供构造函数时,编译器会自动创建一个默认的构造方法
java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法,每一个构造方法必须有它自己唯一的参数列表
6、java支持多继承吗?
不支持。只能支持单继承,即一个类只有一个父类。可以用implements实现多个接口扩展
7、接口与抽象类的区别
(1)接口中所有方法隐含都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法
(2)接口中声明的变量默认都是final,而抽象类可以包含非final的变量
(3)接口中成员函数默认都会public。抽象类的成员函数可以是private,protected或者public
(4)类可以不实现抽象类和接口声明中的所有方法,这种情况下,类也必须声明为抽象的
8、jdk与jre区别是什么?
java运行时环境(jre)是将要执行的java程序的java虚拟机,同时也包含了执行applet需要的浏览器插件。java开发工具包(jdk)是完整的java软件开发包,包含了jre,编译器和其他工具(比如:javadoc,java调试器),可以让开发者开发,编译,执行java应用程序。
9、什么是只传递和引用传递
值传递是对基本类型变量而言,传递是该变量的一个副本,改变副本不会影响原变量
引用传递一般是对于对象型变量而言,传递的是该对象地址的一个副本,改变副本,会影响原变量
10、进程和线程的区别?
进程是执行着的应用程序,线程是进程内部的一个执行序列。一个进程可以有多个线程
区别:
(1)地址空间和其他资源:进程之间相互独立。同一个进程的各个线程间共享。某进程内的线程在其他进程不可见
(2)通信:进程之间通信ipc,线程间可以直接读写进程数据段(如全局变量)来进行通信--需要进程同步和互斥手段的辅助,以保证数据的一致性
(3)调度和切换:线程之间上下文切换比进程上下文切换快的多
(4)在多线程os中,进程不是一个可执行的实体
11、同步方法和同步代码块的区别
同步方法默认是用this或当前类对象作为锁
同步代码块可以选择以什么来加锁,比同步方法更细粒度。我们可以选择只同步会发生同步问题的部分代码而不是整个方法
12、什么是死锁?
死锁是值多个线程因资源竞争而造成的一种僵局,若无外力作用,这些线程都无法向前推进。产生死锁的4个必要条件
(1)互斥条件
(2)不剥夺条件
(3)请求和保持条件
(4)循环等待
13、如何确保N个线程可以访问N个资源同时又不导致死锁?
一种非常简单的避免死锁的方式:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁
14、java集合类框架的基本接口有哪些?
Collection,Set,List,Map
15、HashMap工作原理
hashMap是以键值对的形式存储。hashmap需要一个hash函数,它使用hashCode和equals方法来向集合/从集合添加和检索元素。当调用put时,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在,value会被更新成新值。hashMap的一些重要的特性是它的容量,负载因子和扩容极限。
16、hashcode和equals重要性体现在什么地方?
hashmap通过hashcode和equals确定键值对索引
17、hashmap和hashtable区别?
hashmap允许键和值是null,hashtable不允许键或值为null
hashtable同步,而hashmap不是
Java面试基础知识整理
1、Static存在的意义
static主要意义是在于创建独立的具体对象的域变量或者方法,以至于即使没有创建对象,也能使用属性和调用方法,static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序的性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个statci块,并且只会执行一次。为什么说static块可以用来优化程序性能,是因为它的特性,只会在类加载的时候执行一次。因此,很多时候可以将一些只需要进行一次的初始化操作放在static代码块中进行,被static修饰的变量或者方法是独立于当前类的任何对象,也就是说这些静态的变量或者方法不属于任何一个实例化对象,而是被类直接的所共享。static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的。被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。
2、面向对象与面向过程的区别?
面向过程优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机,嵌入式开发、Linux、Unix等等一般都是采用面向过程的开发,性能是最重要的因素。缺点:没有面向对象便于维护、容易复用、容易扩展。面向对象优点:易复用、易扩展、易维护,由于是面向对象有封装、继承、多态性的特点,可以设计出低耦合的系统,使得系统更加灵活、更加易于扩展。缺点:性能比面向过程低。面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。面向对象是模块化的,你只需要抽象出来一个类对象,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法,需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,不需要了解。最后,面向对象的底层还是面向过程,把面向过程抽象出类,然后封装,方便我们使用就是面向对象了。
3、面向对象的三大特性:
抽象,抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两个方面,抽象只关心对象的有哪些属性和行为,并不关心这些行为的细节是什么。封装,封装是把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法。继承,继承是使用已有的类的定义作为基础建立的新的技术,新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但是不能选择性的继承父类。有一下三个方面,一、子类拥有父类非private的属性和方法。二、子类可以拥有自己属性和方法,即子类可以对父类进行扩展。三、子类可以用自己的方法实现父类的方法。多态,所谓的多态就是程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用编程时并不确定,而是在程序运行的时候才确定,即一个引用变量到底会指向那个类的实例对象,该引用变量发出的方法调用到底是那个类中的实现方法,必须由程序运行期间才能决定。
4、什么是多态机制?
Java语言是如何实现多态的?所谓的多态是程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。多态分为编译时多态和运行时多态,其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,在运行时谈不上多态。而是运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。
5、多态的实现,Java中实现多态有三个必要条件:
继承、重写、向上转型。继承:在多态中必须存在有继承关系的子类和父类。重写:子类对父类中的某些方法进行重新定义,在调用这些方法时候就会调用子类的方法。向上转型:在多态中需要将子类的引用赋值给父类,只有这样该引用才能具备技能调用父类的方法和子类的方法。只有满足上述三个条件,才能在同一个继承结构中国使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为,对于Java而言,它的多态实现截至遵循一个原则,当超类的对象引用变量引用子类的对象时候,被引用的对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖了的方法。
6、面向对象的五大基本原则?
单一职责:类的功能单一,不能包罗万象。开发封闭原则:一个模块对于扩展是开放的,对于修改是关闭的,想要增加功能热烈欢迎,想要修改功能不行。里氏替换原则:子类可以替换父类出现在父类能够出现的地方。依赖倒置原则:高层模块不应该依赖于底层模块,他们都应该依赖于抽象,抽象不应该依赖细节实现。细节实现依赖于抽象。接口分离原则:设计时采用多个于特定客户有关的接口。