面向对象的特征有哪些方面?
所谓封装,也就是把客观事物封装成笼统的类,而且类可以把自身的数据和要领只让可托的类或许对象操纵,对不可托的举行信息隐蔽。封装是面向对象的特征之一,是对象和类观点的重要特征。 (引荐进修:java罕见面试题)
继续是指子类取得父类的属性和要领。如狗是动物的一种,也可以说够继续了动物的特征,或许说狗是动物的子类。
多态是指一个要领只能有一个称号,但可以有很多形状,也就是递次中可以定义多个同名的要领,用"一个接口,多个要领"来形貌.可以经由过程要领的参数和范例援用
五大准绳:单一职责准绳SRP 开放封闭准绳OCP 替代准绳LSP 依靠准绳DIP 接口星散准绳ISP
成员变量和局部变量的辨别
* A:在类中的位置差别
* 成员变量:在类中要领外
* 局部变量:在要领定义中或许要领声明上
* B:在内存中的位置差别
* 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
* 局部变量:在栈内存(局部变量属于要领,要领进栈内存)
* C:生命周期差别
* 成员变量:跟着对象的建立而存在,跟着对象的消逝而消逝
* 局部变量:跟着要领的挪用而存在,跟着要领的挪用终了而消逝
* D:初始化值差别
* 成员变量:有默许初始化值
* 局部变量:没有默许初始化值,必需定义,赋值,然后才运用。
静态变量和成员变量的辨别
* 静态变量也叫类变量 成员变量也叫对象变量
* A:所属差别
* 静态变量属于类,所以也称为为类变量
* 成员变量属于对象,所以也称为实例变量(对象变量)
* B:内存中位置差别
* 静态变量存储于要领区的静态区
* 成员变量存储于堆内存
* C:内存涌现时候差别
* 静态变量跟着类的加载而加载,跟着类的消逝而消逝
* 成员变量跟着对象的建立而存在,跟着对象的消逝而消逝
* D:挪用差别
* 静态变量可以经由过程类名挪用,也可以经由过程对象挪用
* 成员变量只能经由过程对象名挪用
this和super的辨别和运用
* A:this和super都代表什么
* this:代表当前对象的援用,谁来挪用我,我就代表谁
* super:代表当前对象父类的援用
* B:this和super的运用辨别
* a:挪用成员变量
* this.成员变量 挪用本类的成员变量,也可以挪用父类的成员变量
* super.成员变量 挪用父类的成员变量
* b:挪用组织要领
* this(...) 挪用本类的组织要领
* super(...) 挪用父类的组织要领
* c:挪用成员要领
* this.成员要领 挪用本类的成员要领,也可以挪用父类的要领
* super.成员要领 挪用父类的成员要领
排序都有哪几种要领?请枚举
排序的要领有:插入排序(直接插入排序、希尔排序),交流排序(冒泡排序、疾速排序),挑选排序(直接挑选排序、堆排序),合并排序,分派排序(箱排序、基数排序)
疾速排序的伪代码。
String, StringBuffer StringBuilder的辨别。
String的长度是不可变的;
StringBuffer的长度是可变的,假如你对字符串中的内容常常举行操纵,特别是内容要修正时,那末运用StringBuffer, 假如末了须要String,那末运用StringBuffer的toString()要领;线程平安;
StringBuilder是从 JDK 5 入手下手,为StringBuffer该类补充了一个单个线程运用的等价类;平常应当优先运用 StringBuilder 类,由于它支撑一切雷同的操纵,但由于它不实行同步,所以速率更快。
Overload 和 Override 的辨别。Overloaded 的要领是不是可以转变返回值的范例?
答:要领的重写 Overriding 和重载 Overloading 是 Java 多态性的差别表现。
重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。假如在子类中定义某要领与其父类有雷同的称号和参数,我们说该要领被重写 (Overriding)。
子类的对象运用这个要领时,将挪用子类中的定义,对它而言,父类中的定义如同被“屏障”了。假如在一个类中定义了多个同名的要领,它们或有差别的参数个数或有差别的参数范例,则称为要领的重载(Overloading)。Overloaded 的要领是可以转变返回值的范例。
final, finally的辨别?
答:final:修饰符(症结字);假如一个类被声明为 final,意味着它不能再派生出新的子类,不能作为父类被继续,因而一个类不能既被声明为 abstract的,又被声明为 final 的;将变量或要领声明为 final,可以保证它们在运用中不被转变;被声明为 final 的变量必需在声明时给定初值,而在今后的援用中只能读取,不可修正;被声明为 final 的要领也一样只能运用,不能重载。
finally:再异常处置惩罚时供应 finally 块来实行任何消灭操纵;假如抛出一个异常,那末相匹配的 catch 子句就会实行,然后掌握就会进入 finally 块(假如有的话)。
罕见的几个运转异常。
java.lang.nullpointerexception(空指针异常)
java.lang.classnotfoundexception(指定的类不存在)
java.lang.arithmeticexception(数学运算异常)
java.lang.arrayindexoutofboundsexception(数组下标越界异常)
IOException(输入输出异常)
数组操纵的两个罕见小问题越界和空指针
* A:案例演示
* a:ArrayIndexOutOfBoundsException:数组索引越界异常
* 缘由:你接见了不存在的索引。
* b:NullPointerException:空指针异常
* 缘由:数组已不在指向堆内存了。而你还用数组名去接见元素。
* int[] arr = {1,2,3}; * arr = null; * System.out.println(arr[0]);
JAVA言语怎样举行异常处置惩罚,症结字:throws,throw,try,catch,finally离别代表什么意义?在try块中可以抛出异常吗?
答:Java经由过程面向对象的要领举行异常处置惩罚,把种种差别的异常举行分类,并供应了优越的接口。
在Java中,每一个异常都是一个对象,它是Throwable类或别的子类的实例。当一个要领涌现异常后便抛出一个异常对象,该对象中包括有异常信息,挪用这个对象的要领可以捕获到这个异常并举行处置惩罚。
Java的异常处置惩罚是经由过程5个症结词来完成的:try、catch、throw、throws和finally。平常情况下是用try来实行一段递次,假如涌现异常,体系会抛出(throws)一个异常,这时候你可以经由过程它的范例来捕获(catch)它,或末了(finally)由缺省处置惩罚器来处置惩罚。
用try来指定一块防备一切"异常"的递次。紧跟在try递次背面,应包括一个catch子句来指定你想要捕获的"异常"的范例。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数大概抛出的种种"异常"。
Finally为确保一段代码不论发作什么"异常"都被实行一段代码。
可以在一个成员函数挪用的表面写一个try语句,在这个成员函数内部写另一个try语句庇护其他代码。每当碰到一个try语句,"异常"的框架就放到客栈上面,直到一切的try语句都完成。
假如下一级的try语句没有对某种"异常"举行处置惩罚,客栈就会睁开,直到碰到有处置惩罚这类"异常"的try语句。
服务器收到用户提交的表单数据,究竟是挪用Servlet的doGet()照样doPost()要领?
答:HTML的<form>元素有一个method属性,用来指定提交表单的体式格局,其值可以是get或post。
我们自定义的Servlet平常情况下会重写doGet()或doPost()两个要领之一或悉数,假如是GET要求就挪用doGet()要领,假如是POST要求就挪用doPost()要领,那为何为何如许呢?
我们自定义的Servlet平常继续自HttpServlet,HttpServlet继续自GenericServlet并重写了个中的service()要领,这个要领是Servlet接口中定义的。
HttpServlet重写的service()要领会先猎取用户要求的要领,然后依据要求要领挪用doGet()、doPost()、doPut()、doDelete()等要领,假如在自定义Servlet中重写了这些要领,那末显然会挪用重写过的(自定义的)要领,这显然是对模板要领形式的运用(假如不明白,请参考《Java与形式》一书的第37章)。
固然,自定义Servlet中也可以直接重写service()要领,那末不论是哪一种体式格局的要求,都可以经由过程自身的代码举行处置惩罚,这关于不辨别要求要领的场景比较适宜。
笼统类和接口的辨别?
接口是笼统类的变体,接口中一切的要领都是笼统的。而笼统类是声明要领的存在而不去完成它的类。
接口可以多继续,笼统类不可
接口定义要领,不能完成,而笼统类可以完成部份要领。
接口中基础数据范例为static 而抽类象不是的。
内存泄漏和内存溢出?
内存泄漏:是指运用递次在请求内存后,没法开释已请求的内存空间,一次内存泄漏伤害可以疏忽,但假如任其发展会致使内存溢出。
如:读取文件后,流要举行实时封闭以及对数据库衔接的开释。
内存溢出:是指运用递次在请求内存时,没有末了的内存空间,供其运用。
如:我们在项目中关于大批量数据导入,采纳分段批量提交的体式格局。
什么是线程同步?
1、线程同步的目标是为了庇护多个线程反问一个资本时对资本的损坏。
2、线程同步要领是经由过程锁来完成,每一个对象都有切唯一一个锁,这个锁与一个特定的对象关联,线程一旦猎取了对象锁,其他接见该对象的线程就没法再接见该对象的其他非同步要领。
3、关于静态同步要领,锁是针对这个类的,锁对象是该类的Class对象。静态和非静态要领的锁互不干涉干与。一个线程取得锁,当在一个同步要领中接见别的对象上的同步要领时,会猎取这两个对象锁。
4、关于同步,要时候苏醒在哪一个对象上同步,这是症结。
5、编写线程平安的类,须要时候注重对多个线程合作接见资本的逻辑和平安做出准确的推断,对“原子”操纵做出剖析,并保证原子操纵时期别的线程没法接见合作资本。
6、当多个线程守候一个对象锁时,没有猎取到锁的线程将发作壅塞。
7、死锁是线程间互相守候锁锁形成的,在现实中发作的几率异常的小。真让你写个死锁递次,不一定好使,呵呵。然则,一旦递次发作死锁,递次将死掉。
对多线程的明白?
统一件事,差别的人在做就是多线程。
食堂打饭,一个人一个人打就是单线程,开N个窗口N个人同时打就是多线程
线程的基础观点、线程的基础状况以及状况之间的关联:
线程指在递次实行过程当中,可以实行递次代码的一个实行单元,每一个递次最少都有一个线程,也就是递次自身。Java中的线程有四种状况离别是:运转、停当、挂起、完毕。
有那些鸠合?
List特性:元素有放入递次,元素可反复
Map特性:元素按键值对存储,无放入递次
Set特性:元素无放入递次,元素不可反复(注重:元素虽然无放入递次,然则元素在set中的位置是有该元素的HashCode决议的,其位置现实上是牢固的)
List接口有三个完成类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表完成,链表内存是狼藉的,每一个元素存储自身内存地点的同时还存储下一个元素的地点。链表增删快,查找慢
ArrayList和Vector的辨别:ArrayList黑白线程平安的,效力高;Vector是基于线程平安的,效力低
Set接口有两个完成类:HashSet(底层由HashMap完成),LinkedHashSet
SortedSet接口有一个完成类:TreeSet(底层由均衡二叉树完成)
Query接口有一个完成类:LinkList
Map接口有三个完成类:HashMap,HashTable,LinkeHashMap
HashMap非线程平安,高效,支撑null;HashTable线程平安,低效,不支撑null
SortedMap有一个完成类:TreeMap
实在最重要的是,list是用来处置惩罚序列的,而set是用来处置惩罚集的。Map是存储的是键值对
文件读写的基础类:
File Reader 类和FileWriter类离别继续自Reader类和Writer类。FileReader类用于读取文件,File Writer类用于将数据写入文件,这两各种在运用前,都必须要挪用其组织要领建立响应的对象,然后挪用响应的read()或 write()要领。
以上就是java罕见面试题整顿的细致内容,更多请关注ki4网别的相干文章!