定义递归定义就是循环定义对吗函数sum(n)计算1+2+...+n, 其中n的类型是int,函数类型是double


常见的算法都是通过递归定义就昰循环定义对吗和循环实现的这里通过计算1+...+n之和的递归定义就是循环定义对吗和循环实现,对这两种方法进行一个比较从而加深理解。测试代码

测试都是通过Junit进行测试的。

递归定义就是循环定义对吗实现时测试中发现n不能过大,在笔记本上面不能超过10000否则会出现StackOverflow異常。

 

 
循环实现时不会出现递归定义就是循环定义对吗中的异常。
 
}

本题集由尚学堂学员整理列举叻众多IT公司面试真题,对应聘Java程序员职位的常见考点和知识体系都进行的分类和归纳整理

本题集适合应聘Java和JavaEE职位的程序员作为面试复习、学习和强化的资料,也适合其他程序员作为拓展读物进行阅读

本题集包含了常见的算法、面试题,也包含了新的高级技术比如:微垺务架构等技术的面试题目。本题集非常全面对于工作1-5年左右的java程序员面试有非常好的指导作用。

1.大学生高端复合人才成长

四个专业都偠学从零开始2000小时,成为高端人才打下一生技术基础,不再是低端码农

1.Java跨平台原理(字节码文件、虚拟机)

C/C++语言都直接编译成针对特定平台机器码。如果要跨平台需要使用相应的编译器重新编译。

Java源程序(.java)要先编译成与平台无关的字节码文件(.class)然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的

字节码文件不面向任何具体平台,只面向虚拟机

Java虚拟机是可运行Java字节码文件的虚拟计算机。不同平台的虚拟机是不同的但它们都提供了相同的接口。

Java语言具有一次编译到处运行的特点。就是说编译后的.class可以跨平台运行前提是该平台具有相应的Java虚拟机。但是性能比C/C++要低

Java的跨平台原理决定了其性能没有C/C++高

语言层次的安全性主要体现在:

Java取消了强大但又危险的指针,而代之以引用由于指针可进行移动运算,指针可随便指向一个内存区域而不管这个区域是否可用,这样做是危险的因為原来这个内存地址可能存储着重要数据或者是其他程序运行所占用的,并且使用指针也容易数组越界

垃圾回收机制:不需要程序员直接控制内存回收,由垃圾回收器在后台自动回收不再使用的内存避免程序忘记及时回收,导致内存泄露避免程序错误回收程序核心类庫的内存,导致系统崩溃

强制类型转换:只有在满足强制转换规则的情况下才能强转成功。

底层的安全性可以从以下方面来说明

Java在字节碼的传输过程中使用了公开密钥加密机制(PKC)

在运行环境提供了四级安全性保障机制:

字节码校验器 -类装载器 -运行时内存布局 -文件访问限制

Java2岼台包括标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本:

比如:数据库连接、接口定义、输入/输出、网络编程

Micro Edition(微缩版) J2ME 包含J2SE中一部分类,鼡于消费类电子产品的软件开发

比如:呼机、智能卡、手机、PDA、机顶盒

他们的范围是:J2SE包含于J2EE中,J2ME包含了J2SE的核心类但新添加了一些专囿类

应用场合,API的覆盖范围各不相同

Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分所有的java程序会首先被编译为.class的类文件,這种类文件可以在虚拟机上执行也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互由虚拟机将程序解釋给本地系统执行。JVM是Java平台的基础和实际的机器一样,它也有自己的指令集并且在运行时操作不同的内存区域。 JVM通过抽象操作系统和CPU結构提供了一种与平台无关的代码执行方法,即与特殊的实现方法、主机硬件、主机操作系统无关JVM的主要工作是解释自己的指令集(即字节码)到CPU的指令集或对应的系统调用,保护用户免被恶意程序骚扰 JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(.class文件)

environment(java运行环境)的缩写。光有JVM还不能让class文件执行因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库而jvm和lib和起来就称为jre。所以在你写完java程序编译成.class之后,伱可以把这个.class文件和jre一起打包发给朋友这样你的朋友就可以运行你写程序了(jre里有运行.class的java.exe)。JRE是Sun公司发布的一个更大的系统它里面就囿一个JVM。JRE就与具体的CPU结构和操作系统有关是运行Java程序必不可少的(除非用其他一些编译环境编译成.exe可执行文件……),JRE的地位就象一台PC機一样我们写好的Win32应用程序需要操作系统帮我们运行,同样的我们编写的Java程序也必须要JRE才能运行。 

让我们看一下JDK的安装目录在目录丅面有六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中真正在运行java时起作用的是以下四个文件夹:bin、include、lib、jre。现在我们可鉯看出这样一个关系JDK包含JRE,而JRE包含JVM

(注意:这里的bin、lib文件夹和jre里的bin、lib是不同的)总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编譯的功能。eclipse、idea等其他IDE有自己的编译器而不是用JDK bin目录中自带的所以在安装时你会发现他们只要求你选jre路径就ok了。

jdk是JAVA程序开发时用的开发工具包其内部也有JRE运行环境JRE。JRE是JAVA程序运行时需要的运行环境就是说如果你光是运行JAVA程序而不是去搞开发的话,只安装JRE就能运行已经存在嘚JAVA程序了JDk、JRE内部都包含JAVA虚拟机JVM,JAVA虚拟机内部包含许多应用程序的类的解释器和类加载器等等

共有单行注释、多行注释、文档注释3种注釋类型。使用如下:

单行注释采用“//”方式.只能注释一行代码。如://类成员变量

多行注释采用“/*...*/”方式,可注释多行代码其中不允許出现嵌套。如:

文档注释采用“/**...*/”方式。如:

6.8种基本数据类型及其字节数

2、如果i++,++i是一条单独的语句两者没有任何区别

3、i++和++i的使用仅僅针对变量。 5++和++5会报错因为5不是变量。

&和&&都可以用作逻辑与运算符但是要看使用时的具体条件来决定。

情况1:当上述的操作数是boolean类型變量时&和&&都可以用作逻辑与运算符。

情况2:当上述的表达式结果是boolean类型变量时&和&&都可以用作逻辑与运算符。

表示逻辑与(and)当运算符两邊的表达式的结果或操作数都为true时,整个运算结果才为true否则,只要有一方为false结果都为false。

(1)、&逻辑运算符称为逻辑与运算符&&逻辑运算符稱为短路与运算符,也可叫逻辑与运算符

对于&:无论任何情况,&两边的操作数或表达式都会参与计算

对于&&:当&&左边的操作数为false或左边表达式结果为false时,&&右边的操作数或表达式将不参与计算此时最终结果都为false。

综上所述如果逻辑与运算的第一个操作数是false或第一个表达式的结果为false时,对于第二个操作数或表达式是否进行运算对最终的结果没有影响,结果肯定是false推介平时多使用&&,因为它效率更高些

、&还可以用作位运算符。当&两边操作数或两边表达式的结果不是boolean类型时&用于按位与运算符的操作。

9.用最有效率的方法算出2乘以8等于多少

使用位运算来实现效率最高位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数对于位运算符“<<”, 昰将一个数左移n位,就相当于乘以了2的n次方那么,一个数乘以8只要将其左移3位即可位运算cpu直接支持的,效率最高所以,2乘以8等于几嘚最效率的方法是2 << 3

10.基本数据类型的类型转换规则

基本类型转换分为自动转换和强制转换

自动转换规则:容量小的数据类型可以自动转换荿容量大的数据类型,也可

以说低级自动向高级转换这儿的容量指的不是字节数,而是指类型表述的范围

强制转换规则:高级变为低級需要强制转换。

(1)赋值运算符“=”右边的转换先自动转换成表达式中级别最高的数据类型,再进行运算

(2)赋值运算符“=”两侧嘚转换,若左边级别>右边级别会自动转换;若左边级别 == 右边级别,不用转换;若左边级别 < 右边级别需强制转换。

(3)可以将整型常量直接賦值给byte, short, char等类型变量而不需要进行强制类型转换,前提是不超出其表述范围否则必须进行强制转换。

11.if多分支语句和switch多分支语句的异同之處

相同之处:都是分支语句多超过一种的情况进行判断处理。

switch更适合用于多分支情况就是有很多种情况需要判断处理,判断条件类型單一只有一个入口,在分支执行完后(如果没有break跳出)不加判断地执行下去;而if—elseif---else多分枝主要适用于分支较少的分支结构,判断类型不昰单一只要一个分支被执行后,后边的分支不再执行switch为等值判断(不允许比如>= <=),而if为等值和区间都可以if的使用范围大。

while先判断后執行第一次判断为false,循环体一次都不执行

do while先执行 后判断,最少执行1次

如果while循环第一次判断为true, 则两种循环没有区别。

break: 结束当前循环并退出當前循环体

continue: 循环体中后续的语句不执行,但是循环没有结束继续进行循环条件的判断(for循环还会i++)。continue只是结束本次循环

14.请使用递归萣义就是循环定义对吗算法计算n!

15.递归定义就是循环定义对吗的定义和优缺点

递归定义就是循环定义对吗算法是一种直接或者间接地调用洎身算法的过程。在计算机编写程序中递归定义就是循环定义对吗算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且噫于理解

递归定义就是循环定义对吗算法解决问题的特点:

(1) 递归定义就是循环定义对吗就是在过程或函数里调用自身。

(2) 在使用递归定义僦是循环定义对吗策略时必须有一个明确的递归定义就是循环定义对吗结束条件,称为递归定义就是循环定义对吗出口

(3) 递归定义就是循环定义对吗算法解题通常显得很简洁,但运行效率较低所以一般不提倡用递归定义就是循环定义对吗算法设计程序。

(4) 在递归定义就是循环定义对吗调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储递归定义就是循环定义对吗次数过多容易造成栈溢出等。所以一般不提倡用递归定义就是循环定义对吗算法设计程序

数组是(相同类型数据)的(有序)(集合)

数组会在内存中开辟一块连續的空间,每个空间相当于之前的一个变量称为数组的元素element

数组元素有序的,不是大小顺序是索引 的顺序

数组中可以存储基本数据类型,可以存储引用数据类型;但是对于一个数组而言数组的类型是固定的,只能是一个

数组的长度是固定的一经定义,不能再发生变囮(数组的扩容)

17.请写出冒泡排序代码

18.请写出选择排序的代码

19.请写出插入排序的代码

20.可变参数的作用和特点

1.可变参数的形式 ...

2.可变参数只能昰方法的形参

3.可变参数对应的实参可以0,1,2.....个也可以是一个数组

4.在可变参数的方法中,将可变参数当做数组来处理

5.可变参数最多有一个只能是最后一个

6.可变参数好处:方便 简单 减少重载方法的数量

7.如果定义了可变参数的方法,不允许同时定义相同类型数组参数的方法

总结2:數组做形参和可变参数做形参联系和区别

1.实参都可以是数组;2.方法体中可变参数当做数组来处理

1.个数不同 可变参数只能有一个数组参数鈳以多个

2.位置不同 可变参数只能是最后一个 数组参数位置任意

3.实参不同 可变参数实参可以0,1,2.....个,也可以是一个数组数组的实参只能是数组

類是对象的抽象,而对象是类的具体实例类是抽象的,不占用内存而对象是具体的,占用存储空间类是用于创建对象的蓝图,它是┅个定义包括在特定类型的对象中的方法和变量的软件模板

类和对象好比图纸和实物的关系,模具和铸件的关系

比如人类就是一个概念,人类具有身高体重等属性。人类可以做吃饭、说话等方法

小明就是一个具体的人,也就是实例他的属性是具体的身高200cm,体重180kg怹做的方法是具体的吃了一碗白米饭,说了“12345”这样一句话

22.面向过程和面向对象的区别

两者都是软件开发思想,先有面向过程后有面姠对象。在大型项目中针对面向过程的不足推出了面向对象开发思想。

蒋介石和毛泽东分别是面向过程和面向对象的杰出代表这样充汾说明,在解决复制问题时面向对象有更大的优越性。

面向过程是蛋炒饭面向对象是盖浇饭。盖浇饭的好处就是“菜”“饭”分离從而提高了制作盖浇饭的灵活性。饭不满意就换饭菜不满意换菜。用软件工程的专业术语就是“可维护性”比较好“饭” 和“菜”的耦合度比较低。

编程思路不同: 面向过程以实现功能的函数开发为主而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、執行方法来完成功能

封装性:都具有封装性,但是面向过程是封装的是功能而面向对象封装的是数据和功能。

面向对象具有继承性和哆态性而面向过程没有继承性和多态性,所以面向对象优势是明显

方法重载和方法重写(覆盖)的区别

英文位置不同作用不同重载overload同┅个类中在一个类里面为一种行为提供多种实现方式并提高可读性重写override子类和父类间父类方法无法满足子类的要求,子类通过方法重写满足要求修饰符返回值方法名参数抛出异常重载无关无关相同不同无关重写大于等于小于等于相同相同小于等于

this是对象内部指代自身的引用,哃时也是解决成员变量和局部变量同名问题;this可以调用成员变量不能调用局部变量;this也可以调用成员方法,但是在普通方法中可以省略this在构造方法中不允许省略,必须是构造方法的第一条语句,而且在静态方法当中不允许出现this关键字

super代表对当前对象的直接父类对象嘚引用,super可以调用直接父类的成员变量(注意权限修饰符的影响比如不能访问private成员)

super可以调用直接父类的成员方法(注意权限修饰符的影响,比如不能访问private成员);super可以调用直接父类的构造方法只限构造方法中使用,且必须是第一条语句

static可以修饰变量、方法、代码块囷内部类

static属性属于这个类所有,即由该类创建的所有对象共享同一个static属性可以对象创建后通过对象名.属性名和类名.属性名两种方式来访問。也可以在没有创建任何对象之前通过类名.属性名的方式来访问

static变量和非static变量的区别(都是成员变量,不是局部变量)

不管有多少个对象static变量只有1份。对于每个对象实例变量都会有单独的一份

static变量是属于整个类的,也称为类变量而非静态变量是属于对象的,也称为实唎变量

2.在内存中存放的位置不同

静态变量:对象名.变量名 stu1.schoolName="西二旗小学"; 不推荐如此使用

4.在内存中分配空间的时间不同

static方法也可以通过对象名.方法名和类名.方法名两种方式来访问

static代码块当类被第一次使用时(可能是调用static属性和方法,或者创建其对象)执行静态代码块且只被執行一次,主要作用是实现static属性的初始化

static内部类:属于整个外部类,而不是属于外部类的每个对象不能访问外部类的非静态成员(变量或者方法),.可以访问外部类的静态成员

final和abstract是功能相反的两个关键字可以对比记忆

abstract可以用来修饰类和方法,不能用来修饰属性和构造方法;使用abstract修饰的类是抽象类需要被继承,使用abstract修饰的方法是抽象方法需要子类被重写。

final可以用来修饰类、方法和属性不能修饰构慥方法。使用final修饰的类不能被继承使用final修饰的方法不能被重写,使用final修饰的变量的值不能被修改所以就成了常量。

特别注意:final修饰基夲类型变量其值不能改变,由原来的变量变为常量;但是final修饰引用类型变量栈内存中的引用不能改变,但是所指向的堆内存中的对象嘚属性值仍旧可以改变例如

final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类不能作为父类被继承例如:String类、Math類等。将变量或方法声明为final可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值而在以后的引用中只能读取,不鈳修改被声明为final的方法也同样只能使用,不能重写但是能够重载。 使用final修饰的对象对象的引用地址不能变,但是对象的值可以变!

finally茬异常处理时提供 finally 块来执行任何清除操作如果有finally的话,则不管是否发生异常finally语句都会被执行。一般情况下都把关闭物理连接(IO流、数據库连接、Socket连接)等相关操作,放入到此代码块中

finalize方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作finalize() 方法是在垃圾收集器删除对象之前被调用的。它是在 Object 类中定义的因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其怹清理工作 一般情况下,此方法由JVM调用程序员不要去调用!

比较对象的地址值是否相等,如果子类重写则比较对象的内容是否相等;

public公共的 可被同一项目中所有的类访问。 (必须与文件名同名)

default默认的 可被同一个包中的类访问

成员(成员变量或成员方法)访问权限共有㈣种:

public 公共的 可以被项目中所有的类访问。(项目可见性)

protected 受保护的 可以被这个类本身访问;同一个包中的所有其他的类访问;被它的子类(哃一个包以及不同包中的子类)访问(子类可见性)

default 默认的被这个类本身访问;被同一个包中的类访问。(包可见性)

private 私有的 只能被这個类本身访问(类可见性)

29.继承条件下构造方法的执行过程

继承条件下构造方法的调用规则如下:

情况1:如果子类的构造方法中没有通過super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法则系统会默认先调用父类的无参构造方法。在这种情况下寫不写“super();”语句,效果是一样的

情况2:如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法而不执荇父类无参构造方法。

情况3:如果子类的构造方法中通过this显式调用自身的其他构造方法在相应构造方法中应用以上两条规则。

特别注意嘚是如果存在多级继承关系,在创建一个子类对象时以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为圵

“==”是关系运算符,equals()是方法同时他们的结果都返回布尔值;

“==”使用情况如下:

a) 基本类型,比较的是值

b) 引用类型比较的是地址

c) 不能比较没有父子关系的两个对象

a) 系统类一般已经覆盖了equals(),比较的是内容

c) 用户自定义类需要覆盖父类的equals()

注意:Object的==和equals比较的都是地址,作用楿同

实现多态的三个条件(前提条件向上转型、向下转型)

1、继承的存在;(继承是多态的基础,没有继承就没有多态)

2、子类重写父類的方法(多态下会调用子类重写后的方法)

3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)

将一个父类的引用指向一個子类对象成为向上转型,自动进行类型转换此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法此時通过父类引用变量无法调用子类特有的方法

将一个指向子类对象的引用赋给一个子类的引用,成为向下转型此时必须进行强制类型轉换。向下转型必须转换为父类引用指向的真实子类类型,否则将出现ClassCastException不是任意的强制转换

32.简述Java的垃圾回收机制

传统的C/C++语言,需要程序员负责回收已经分配内存

显式回收垃圾回收的缺点:

1)程序忘记及时回收,从而导致内存泄露降低系统性能。

2)程序错误回收程序核心类库的内存导致系统崩溃。

Java语言不需要程序员直接控制内存回收是由JRE在后台自动回收不再使用的内存,称为垃圾回收机制简称GC;

1)可以提高编程效率。

2)保护程序的完整性

3)其开销影响性能。Java虚拟机必须跟踪程序中有用的对象确定哪些是无用的。

垃圾回收机淛的 特点

1)垃圾回收机制回收JVM堆内存里的对象空间,不负责回收栈内存数据

2)对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力

3)垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行

4)可以将对象的引用变量设置为null,暗示垃圾回收机制可鉯回收该对象

现在的JVM有多种垃圾回收 实现算法,表现各异

垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法讓一个新的引用变量重新引用该对象,则会重新激活对象)

程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果但是系统是否进行垃圾回收依然不确定。

永远不要主动调用某个对象的finalize方法应该交给垃圾回收机制调用。

33.基本数据类型和包装类

1) 八个基本数据类型嘚包装类

2)为什么为基本类型引入包装类

2.1基本数据类型有方便之处简单、高效。

2.2但是Java中的基本数据类型却是不面向对象的(没有属性、方法)这在实际使用时存在很多的不便(比如集合的元素只能是Object)。

为了解决这个不足在设计类时为每个基本数据类型设计了一个对应嘚类进行包装,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)

3) 包装类和基本数据类型之间的转换

4) 自动装箱和自动拆箱

JDK1.5提供了自动装箱(autoboxing)和自动拆箱(autounboxing)功能, 从而实现了包装类和基本数据类型之间的自动转换

5) 包装类还可以实现基本类型变量和字符串之间的转换

int是java提供的8種原始数据类型之一,Java为每个原始类型提供了封装类Integer是java为int提供的封装类。

int是java提供的8种原始数据类型之一Java为每个原始类型提供了封装类,Integer是java为int提供的封装类

在Hibernate中,如果将OID定义为Integer类型那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型还需偠在hbm映射文件中设置其unsaved-value属性为0。

另外Integer提供了多个与整数相关的操作方法,例如将一个字符串转换成整数,Integer中还定义了表示整数的最大徝和最小值的常量

实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。 说白了java.sql.Date僦是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date

2)JAVA里提供的日期和时间类,java.sql.Date和java.sql.Time,只会从数据库里读取某部分值这有时会导致丢失数据。例如┅个包含 5:00:57 PM的字段读取日期时得到的是,而读取时间时得到的是5:00:57 PM. 你需要了解数据库里存储时间的精度。有些数据库比如MySQL,精度为毫秒,然而叧一些数据库包括Oracle,存储SQL DATE类型数据时,毫秒部分的数据是不保存的以下操作中容易出现不易被发现的BUG:获得一个JAVA里的日期对象。 从数据庫里读取日期 试图比较两个日期对象是否相等如果毫秒部分丢失,本来认为相等的两个日期对象用Equals方法可能返回false.sql.Timestamp类比java.util.Date类精确度要高。這个类包了一个getTime()方法但是它不会返回额外精度部分的数据,因此必须使用...

36.使用递归定义就是循环定义对吗算法输出某个目录下所有文件囷子目录列表

37.关于Java编译下面哪一个正确()(选择一项)

分析: Java是解释型语言,编译出来的是字节码; 因此A不正确C是C/C++语言编译动态链接库的文件为.DLL; 正确答案为B

38.下列说法正确的有()(选择一项)

分析:A:如果class中的construtor省略不写,系统会默认提供一个无参构造

B:方法名可以與类名同名只是不符合命名规范

39.Java中接口的修饰符可以为()(选择一项)

分析:接口中的访问权限修饰符只可以是public或default

接口中的所有的方法必须要实现类实现,所以不能使用final

接口中所有的方法默认都是abstract的所以接口可以使用abstract修饰,但通常abstract可以省略不写

40.给定以下代码程序将輸出 ()(选择一项)

B.通过编译,输出AB

分析:在继承关系下创建子类对象,先执行父类的构造方法再执行子类的构造方法。

41.下列关于關键字的使用说法错误的是()(选择一项)

分析:因为static得方法在装载class得时候首先完成比 构造方法早,此时非static得属性和方法还没有完成初始化所以不能调用

42.下列哪些语句关于内存回收的说法是正确的()(选择一项)

A.程序员必须创建一个线程来释放内存

B.内存回收程序负責释放无用内存

C.内存回收程序允许程序员直接释放内存

D.内存回收程序可以在指定的时间释放内存对象

分析: A. 程序员不需要创建线程来释放內存.

C. 也不允许程序员直接释放内存.

D. 不一定在什么时刻执行垃圾回收.

43.选出合理的标识符()(选择两项)

分析: 标识符的命令规范,可以包含字母、数字、下划线、$不能以数字开头,不能是Java关键字

44.下列说法正确的是()(选择多项)

45.定义一个类名为”MyClass.java”的类并且该类可被┅个工程中的所有类访问,那么该类的正确声明为()(选择两项)

46.面向对象的特征有哪些方面请用生活中的例子来描述。

答: 面向对象嘚三大特征:封装、继承、多态

举例:(比如设计一个游戏)我现在创建了一个对象,名叫战士

战士的属性是—性别,年龄职业,等级战斗力,血量

它的方法—战斗,逃跑吃饭,睡觉死。

后来我又建了一个对象,叫人

属性:性别,年龄职业,等级血量

方法:逃跑,吃饭睡觉,死

我让人,成为战士的父类战士可以直接继承人的属性和方法。

看上去战士的资料变少了实际上没有,我們仍然可以调用方法—战士.死

而且我们还可以重载战士.死的方法,简称重载死法

我还建了一个对象—法师,父类也是人

你看,用了繼承创建对象变得更方便了。

再后来我又建立了一个对象,叫怪物

属性:等级,战力血量。

建了个对象叫白兔怪,父类怪物可繼承怪物所有的属性和方法。

方法:卖萌吃胡萝卜。

47.说明内存泄漏和内存溢出的区别和联系结合项目经验描述Java程序中如何检测?如何解決

答:内存溢出 out of memory,是指程序在申请内存时没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数那就是内存溢出。

内存泄露 memory leak是指程序在申请内存后,无法释放已申请的内存空间一次内存泄露危害可以忽略,但内存泄露堆积后果很严重无論多少内存,迟早会被占光。

48.什么是Java的序列化如何实现Java的序列化?列举在哪些程序中见过Java序列化

答:Java中的序列化机制能够将一个实例对潒(只序列化对象的属性值,而不会去序列化什么所谓的方法)的状态信息写入到一个字节流中使其可以通过socket进行传输、或者持久化到存储数据库或文件系统中;然后在需要的时候通过字节流中的信息来重构一个相同的对象。一般而言要使得一个类可以序列化,只需简單实现java.io.Serializable接口即可

对象的序列化主要有两种用途:

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2) 在网络上传送对潒的字节序列

在很多应用中,需要对某些对象进行序列化让它们离开内存空间,入住物理硬盘以便长期保存。比如最常见的是Web服务器中的Session对象当有 10万用户并发访问,就有可能出现10万个Session对象内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中等要用了,再把保存在硬盘中的对象还原到内存中

当两个进程在进行远程通信时,彼此可以发送各种类型的数据无论是何种类型的数据,都会以二进淛序列的形式在网络上传送发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象

49.不通過构造函数也能创建对象吗?

答:Java创建对象的几种方式(重要):

1、 用new语句创建对象这是最常见的创建对象的方法。

(1)和(2)都会明确的显式嘚调用构造函数 ;(3)是在内存上对已有对象的影印所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数

50.匿名内部类鈳不可以继承或实现接口。为什么

答:匿名内部类是没有名字的内部类,不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类實现.

1、由于匿名内部类没有名字,所以它没有构造函数因为没有构造函数,所以它必须完全借用父类的构造函数来实例化换言之:匿洺内部类完全把创建对象的任务交给了父类去完成。

2、在匿名内部类里创建新的方法没有太大意义但它可以通过覆盖父类的方法达到神渏效果,如上例所示这是多态性的体现。

3、因为匿名内部类没有名字所以无法进行向下的强制类型转换,持有对一个匿名内部类对象引用的变量类型一定是它的直接或间接父类类型

51.在Java中,为什么基本类型不能做为HashMap的键值而只能是引用类型,把引用类型做为HashMap的健值需要注意哪些地方。

Object>很显然基本数据类型不是Object类型的,因此不能作为键值只能是引用类型。虽然我们在HashMap中可以这样添加数据:“map.put(1, “Java”);”但实际上是将其中的key值1进行了自动装箱操作,变为了Integer类型

52.简述Java中如何实现多态

实现多态有三个前提条件:

1、 继承的存在;(继承昰多态的基础,没有继承就没有多态)

2、子类重写父类的方法。(多态下会调用子类重写后的方法)

3、父类引用变量指向子类对象。(涉及子类到父类的类型转换)

最后使用父类的引用变量调用子类重写的方法即可实现多态。

AJava中的继承允许一个子类继承多个父类

B.父类哽具有通用性子类更具体

C.Java中的继承存在着传递性

D.当实例化子类时会递归定义就是循环定义对吗调用父类中的构造方法

分析:Java是单继承的,一个类只能继承一个父类

如果除数与被除数均为0.0的话,则运行结果为NaN(Not a Number的简写)计算错误。

不是两者没有任何关联;

56.接口和抽象類的区别

抽象类和接口均包含抽象方法,类必须实现所有的抽象方法否则是抽象类

抽象类和接口都不能实例化,他们位于继承树的顶端用来被其他类继承和实现

两者的区别主要体现在两方面:语法方面和设计理念方面

语法方面的区别是比较低层次的,非本质的主要表現在:

接口中只能定义全局静态常量,不能定义变量抽象类中可以定义常量和变量。

接口中所有的方法都是全局抽象方法抽象类中可鉯有0个、1个或多个,甚至全部都是抽象方法

抽象类中可以有构造方法,但不能用来实例化而在子类实例化是执行,完成属于抽象类的初始化操作接口中不能定义构造方法。

一个类只能有一个直接父类(可以是抽象类)但可以充实实现多个接口。一个类使用extends来继承抽潒类使用implements来实现接口。

抽象类体现了一种继承关系目的是复用代码,抽象类中定义了各个子类的相同代码可以认为父类是一个实现叻部分功能的“中间产品”,而子类是“最终产品”父类和子类之间必须存在“is-a”的关系,即父类和子类在概念本质上应该是相同的

接口并不要求实现类和接口在概念本质上一致的,仅仅是实现了接口定义的约定或者能力而已接口定义了“做什么”,而实现类负责完荿“怎么做”体现了功能(规范)和实现分离的原则。接口和实现之间可以认为是一种“has-a的关系”

57.同步代码块和同步方法有什么区别

同步方法就是在方法前加关键字synchronized然后被同步的方法一次只能有一个线程进入,其他线程等待而同步代码块则是在方法内部使用大括号使嘚一个代码块得到同步。同步代码块会有一个同步的“目标”使得同步块更加灵活一些(同步代码块可以通过“目标”决定需要锁定的對象)。

一般情况下如果此“目标”为this,同步方法和代码块没有太大的区别

同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法內部加锁很明显,同步方法锁的范围比较大而同步代码块范围要小点。一般同步的范围越大性能就越差。所以一般需要加锁进行同步的时候范围越小越好,这样性能更好

58.静态内部类和内部类有什么区别

静态内部类不需要有指向外部类的引用。但非静态内部类需要歭有对外部类的引用

静态内部类可以有静态成员(方法,属性)而非静态内部类则不能有静态成员(方法,属性)

非静态内部类能够访问外蔀类的静态和非静态成员。静态内部类不能访问外部类的非静态成员只能访问外部类的静态成员。

1) 静态内部类:不依赖于外部类的实例直接实例化内部类对象

2) 非静态内部类:通过外部类的对象实例生成内部类对象

59.反射的概念与作用

反射,一种计算机处理方式是程序可鉯访问、检测和修改它本身状态或行为的一种能力。

Java反射可以于运行时加载,探知和使用编译期间完全未知的类.

程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性;

加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透過这个镜子看到类的结构,所以被称之为:反射.

java反射使得我们可以在程序运行时动态加载一个类动态获取类的基本信息和定义的方法,构造函數,域等。

除了检阅类信息外还可以动态创建类的实例,执行类实例的方法获取类实例的域值。反射使java这种静态语言有了动态的特性

通过反射可以使程序代码访问装载到JVM 中的类的内部信息

1) 获取已装载类的属性信息

2) 获取已装载类的方法

3) 获取已装载类的构造方法信息

如struts中。請求的派发控制

当请求来到时。struts通过查询配置文件找到该请求对应的action。已经方法

然后通过反射实例化action。并调用响应method

如果不适用反射,那么你就只能写死到代码里了

所以说,一个灵活一个不灵活。

很少情况下是非用反射不可的大多数情况下反射是为了提高程序嘚灵活性。因此一般框架中使用较多因为框架要适用更多的情况。对灵活性要求较高

60.提供Java存取数据库能力的包是()

java.lang包则提供了Java编程Φ用到的基础类。

61.下列运算符合法的是()(多选)

&&是逻辑运算符中的短路与;

<>表示不等于但是Java中不能这么使用,应该是!=;

62.执行如下程序代码c的值打印出来是()

do-while循环的特点是先执行后判断,所以代码先执行--c操作得到c为-1,之后执行a=a-1的操作得到a为-1,然后判断a是否大于0判断条件不成立,退出循环输出c为-1。

63.下列哪一种叙述是正确的()

A.abstract修饰符可修饰字段方法和类

B.抽象方法的body部分必须用一对大括号{}包住

C.声明抽象方法,大括号可有可无

D.声明抽象方法不可写出大括号

abstract只能修饰方法和类不能修饰字段;

抽象方法不能有方法体,即没有{};

64.下列语句正确的是()

C.形式参数可被所有的字段修饰符修饰

D.形式参数为方法被调用时真正被传递的参数

local Variable为局部变量,形参和局部变量一样嘟只有在方法内才会发生作用也只能在方法中使用,不会在方法外可见;

对于形式参数只能用final修饰符其它任何修饰符都会引起编译器錯误;

真正被传递的参数是实参;

形式参数可是基本数据类型也可以是引用类型(对象)。

65.下列哪种说法是正确的()

A实例方法可直接调鼡超类的实例方法

B.实例方法可直接调用超类的类方法

C.实例方法可直接调用其他类的实例方法

D.实例方法可直接调用本类的类方法

实例方法不鈳直接调用超类的私有实例方法;

66.Java程序的种类有()(多选)

是Java中的类不是程序;

内嵌于Web文件中,由浏览器来观看的Applet;

 由于字数限制后续內容更加精彩,欢迎关注整理不易,可否动动你的小手给小编来点更新的动力希望对你们会有帮助!~

}

我要回帖

更多关于 递归定义就是循环定义对吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信