-------------------------------------------------------------
本面试题由传智专修学院2017级java4班所有同学合作完成
-------------------------------------------------------------
1. 讲一讲运算符:i++;++i;+=?(张雨豪)
答:
i++是Java中自增运算符,通常用于在循环中自增,在代码中执行顺序是先执行后运算,在代码中先获取i值执行后再进行自增操作,++自身值+1
++i是Java中自增运算符,通常用于在循环中自增,在代码中执行顺序是先运算后执行,在代码中先进行自增操作再进行取值,++自身值+1
+=是java中的逻辑运算符用于运算自生值相加,一般用于数值计算中,+=是自身值相加“+=”后的值做的是值相加操作。
int i=10;
int a=5+i++;
此时a等于15
如果是++i。
int a=++ i+5;
此时i先加一,再加5,结果是16.
举例+=:
i+=2;等于i=i+2;
总结: i++和++i只有在参与运算的时候才有区别,如果不参与运算都表示自增。
2. 如果在finally之前return会被执行吗(曹泽伦)
答:会执行的
finally常用来处理java程序一些后续的工作.
首先必须使用在所有catch的最后位置,其次它是必须执行的,无条件执行,甚至即使前面的try-catch语句中已经存在异常了,它仍然会执行.
不管try语句块正常结束还是异常结束,finally语句块是保证要执行的.如果try语句块正常结束,那么在try语句块中的语句都执行完之后,再执行finally语句块.
在return前,就是执行到return的时候等待finally执行,执行完成之后在执行return,如果finally中有return,那么不再执行try里面的return。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return语句执行之后,返回之前执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前就已经确定了;
4、finally中如果包含return,那么程序将在这里返回,而不是try或catch中的return返回,返回值就不是try或catch中保存的返回值了。
3. 堆栈常量池以及静态域的理解?(彭俊辉)
(1). 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(存在于内存)
基本类型的变量数据和对象的引用变量
变量在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间
优点:存取速度比堆要快,仅次于寄存器,栈数据可以共享
缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性
(2)堆:存放用new产生的数据(存在于内存)
new创建的对象和数组,堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理
Java指针:栈中的变量指向堆内存中的变量,这就是Java中的指针
堆是由垃圾回收来负责的,
优点:可以动态地分配内存大小,
生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的
缺点:由于要在运行时动态 分配内存,存取速度较慢
(3)静态域:存放在对象中用static定义的静态成员(存在于内存)
(4) 常量池:存放常量(存在于内存)
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据
各种基本数据类型
final修饰的的变量
类和接口的全限定名;
字段的名称和描述符;
方法和名称和描述符。
在程序执行的时候,常量池会储存在Method Area(方法区)而不是堆中。
堆和常量池总结:对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。
栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。
堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性,
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象里面,由垃圾回收器负责回收
4. java的反射机制机器运用(彭俊辉)
JAVA反射机制:
是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射机制的应用:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
5. String类能被继承吗?为什么?(黎珊珊)
答:不可以被继承
.因为String类有final修饰符来修饰的.在Java当中,只要是被final修饰的类,就不能被继承。
final是Java中的一个关键字,可以用来修饰变量、方法和类。用关键字final修饰的域会成为最终域。用关键字final修饰的变量一旦赋值,就不能改变也称为修饰的标识为常量.如果一个类被关键字final所修饰,它将不能被继承。
6. 数据类型有哪些?分别是什么(张大伟)
java数据类型分为:基本数据类型与引用数据类型
基本数据类型分为:
整型:byte,short,int,long
浮点型:float,double
字符型:char
布尔型:boolean
引用数据类型有: class类,interface接口,数组等
7. http和https的区别(常兆祥)
什么是http:
HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从www服务器传输超文本到本地浏览器的传输协议。
什么是https:
HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。
(1)对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;
(2)对网站服务器进行真实身份认证。
http和https的区别:
1、HTTPS是加密传输协议,HTTP是名文传输协议;
2、HTTPS需要用到SSL证书,而HTTP不用;
3、HTTPS比HTTP更加安全,对搜索引擎更友好;
4、 HTTPS标准端口443,HTTP标准端口80;
5、 HTTPS基于传输层,HTTP基于应用层;
6、 HTTPS在浏览器显示绿色安全锁,HTTP没有显示;
总结:
总的来说HTTPS比HTTP更加安全,能够有效的保护网站用户的隐私信息安全。
8. 问题:什么是主键?什么是外键?各自的作用?
主键:
能够唯一表示数据表中的每个记录的字段或者字段的组合就称为主键。一个表只能识别一行记录
特点:
1)一个表只能有一个主键
2)主键的值不可重复,也不能为null
3)主键的值不能被重用
作用:能确定一条记录的唯一标识
外键:
表的外键值取自另一个表的主键值,是将两个表关联起来的一种约束,主键所在的表是主表,以主表的主键值为外键的表是从表
(一对多,引用主外键,“一”相当于主键,“多”就是引用主键的外键)
作用:用于保持数据一致性,完整性。控制存储在外键表中的数据
9. Java中基本数据类型有哪些?(周龙裕)
有四类八种基本数据类型,分别是:
1.整数型:
byte(字节型): 占1字节,最大存储数据量是255,存放的数据范围是-128~127之间.
默认值为0,一般用于表示最小数据单位. 如文件中数据.包装类是Byte;
short(短整型): 很少用.占2个字节,有符号的以二进制补码表示的整数.最大数据存储量是65536,数据范围是-32768~32767之间,默认值为0.包装类是Short;
int: 最常用.占4个字节,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1,一般整型变量默认为 int 类型,默认值为0,包装类是Integer
long (长整型): 次常用.占8个字节,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1, 这种类型主要使用在需要比较大整数的系统上,默认值为0L.包装类是Long;
2.浮点型 (浮点数不能用来表示精确的值,如货币)
float(单精度): 占4个字节,数据范围在3.4e-45~1.4e38,在储存大型浮点数组的时候可节省内存空间,默认值为0.0F,包装类是Float;
double(双精度): 占8个字节,浮点数的默认类型为double类型,数据范围在4.9e-324~1.8e308,默认值为0.0d,后缀一般不写, 包装类是Double;
逻辑型:
boolean(布尔型): 表示一位的信息,只有两个取值:true 和 false, 默认值是false.
包装类是Boolean;
字符型:
char(整数型): 占2个字节,用单引号括起来的1个字符(可以是一个中文字符),使用 Unicode 码代表字符.不能为 0个字符,char数据类型可以储存任何字符.
默认值为\u0000, 是一个空白字符,但是和空格,null都是不同的,包装类是Character
10. Java中创建对象的几种方式(李源)
答:五种
1. 使用new关键字创建
2.使用Class类的newInstance方法
3.使用Constructor类的newInstance方法
4.使用clone方法
5.使用反序列化创建;
前三种调用了构造函数,后两种没有调用构造函数。
备注clone :
Java中所有的类都默认继承自Object类,而Object类中提供了一个clone()方法,这个方法的作用是返回一个Object对象的复制,这个复制方法返回的是一个新的对象而不是一个引用。
11. 修饰符的访问权限(李源)
答: java中4中修饰符分别为public、protect、default、private
private
访问限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。(只允许在本类中访问)
default
“默认访问模式“,即不加任何访问修饰,只允许在同包中进行访问。(子类和外包均不可访问)
protected
“保护形”,被其修饰的类、属性及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。(不可访问外包)
public
供所有的类访问。(本包,外包,子类,本类均可访问)
12. Java中的集合(李源)
答:
1.Set: 无序,元素不可重复(但是元素在 set 中的位置是有该元素的 HashCode 决定的,其位置其实是固定的)
2.List: 有序,列表存储,元素可重复
3.Map:无序,元素可重复
13. 介绍一下封装(李源)
答:因为从我们学习JAVA开始,就基本上接触了封装,因为JAVA中的所有程序都是写在类中的,类也能当做一种封装。
在面向对象中封装是指隐藏对象的属性和实现的细节,仅对外提供公共访问方式。在类定义中用private关键字来实现封装。封装有什么好处?
一是用private把类的细节与外界隔离起来,从而实现数据项和方法的隐藏,而要访问这些数据项和方法唯一的途径就是通过类本身,类才有资格调用它所拥有的资源(方法,数据项属性等等)。所以第一个好处就是数据的安全性提高了。
二是通过隐藏隔离,只允许外部对类做有限的访问,开发者可以自由的改变类的内部实现,而无需修改使用该类的那些程序。只要那些在类外部就能被调用的方法保持其外部特征不变,内部代码就可以自由改变,各取所需,利于分工。
三就是提高了代码的重用性,封装成工具类以后能够减少很多繁琐的步骤。
14. 多线程run和start的区别(李源)
答:启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由 JVM 调度并执行,这并不意味着线程就会立即运行。
run()方法是线程启动后要进行回调(callback)的方法。
15. 什么是死锁(李源)
答:两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程 都陷入了无限的等待中。
16. 抽象类能实例化吗?(李源)
答:抽象类提供了部分实现,抽象类是不能实例化的,抽象类的存在主要是可以把公共的代码移植到抽象类中
17. 写代码一般会哪些报异常(李源)
编写代码过程中,经常报的错误如下:
(1)java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象
(2)java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常
(3)java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符
(4)java.lang.IndexOutOfBoundsException 数组角标越界异常;
(5)java.lang.IllegalArgumentException 方法传递参数错误
(6)java.lang.ClassCastException 数据类型转换异常
(7)java.lang.NoClassDefFoundException 未找到类定义错误
(8)SQLException 操作数据库异常
(9)java.lang.InstantiationException 实例化异常
(10)java.lang.NoSuchMethodException 方法不存在异常
18. 字节流和字符流的区别(李源)
1.字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时,先去查指定的编码表,将查到的字符返回。
2.字节流可以处理所有类型数据,如:图片,MP3,AVI 视频文件,而字符流只能处理字符数据。
只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
19. 单例模式(李源)
一、单例模式定义:
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,
以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,
以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
二、单例模式特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性
20. 自定义异常(李源)
在代码中使用自定义的异常类,可以对异常进行统一的封装处理。使得整个项目的异常处理更规范、更统一、更优雅。同时,使得日志的记录上更加清晰,便于后续查日志定位问题。
需要自定义一个类,继承自系统的异常类。具体需要什么样类型的异常类,就继承自相应的系统类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
创建构造方法,传递自定义异常信息。
在需要抛出异常的地方使用throw new 自定义异常(异常信息),将异常抛出。或在方法名后使用 throws 自定义异常 来声明
2019.1.7