1、MySQL语句中的having与where的区别是什么?
- having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
- having后面可以使用分组函数(统计函数),where后面不可以使用分组函数
- where是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组,而having是对分组后数据的约束
2、try/catch/finally中是否可以有return?如果可以,请说明执行流程。
(1)都可以添加return,但是finally中最好不要写,该方法的结果有可能不能正确返回。
(2)try和catch中都包含return的话,try中没有发生异常,指向try中的return;否则,执行catch中的return
3、try-catch块中存在return语句,是否还执行finally块,如果执行,说明执行顺序。
执行,try中没有发生异常,先执行finally中的语句,然后再执行try中的return,如果发生异常,先执行finally中语句,然后再执行catch中的return。
无论是否异常,都会先执行finally中语句,然后return,所以不建议在finally中加入return,避免返回不正确结果。
4、阅读下面代码,输出结果是什么?
public class Demo5 {
public static void main(String[] args) {
getCount();
}
public static int getCount() {
int i = 10;
try {
return i++; //第一步
} catch (Exception e) {
return i++;
} finally {
i++; //第二步
System.out.println("释放资源:" + i);
}
}
}
/*
* 返回的值是10,打印结果是【释放资源:12】
* return i++; 会先执行i++,然后执行return,但是中间会先执行finally
* 第一步执行完毕,结果是 return 10; 在执行输出前先执行finally
* 执行第二步,此时i为11,然后i++,结果为12,打印输出
* 最后执行return.
*/
}
5、其他面试题汇总
-
char型变量中能不能存储一个中文汉字?为什么?
可以,因为Java字符采用Unicode编码,每个字符占两个字节,汉字占两个字符,char类型变量占2个字节 -
一个".java"源文件中是否可以包括多个类?有什么限制?
a.一个Java文件中可以写多个类,如果写多个类,则编译后会生成多个.class文件
b.一个Java文件中最多只能有一个被public修饰的类,这个类的类名必须和Java源文件名保持一致
c.一个Java文件中如果只有一个类,并且这个类不用public修饰的话,类名和文件名可以不一样,但习惯上,我们都会写上public -
垃圾回收器的作用?垃圾回收器可以马上回收内存吗?
在JVM的空闲时,检查并释放那些可以被释放的存储空间 -
接口和抽象类有什么区别?
语法:
1>抽象类使用abstract,接口使用interface
2>抽象类中可以包含抽象方法,也可以包含非抽象方法,接口中只能包含抽象方法和静态常量,jdk1.8之后接口可以包含静态方法和默认方法。
3>抽象类和接口都不能实例化。
4>抽象类可以包含构造方法,接口中没有构造方法。功能:
1>抽象类一般用来表示同类事物,接口可以表示不同类事物。
2>抽象类可以实现代码的重用,也可以约束子类的功能。接口就是约束实现类的功能,降低代码之间的耦合性。使用场景:
1>程序或模块内部使用抽象类
2>程序架构或模块之间使用接口8.二维数数组在内存中的存储方式是怎样的?
本质也是一维数组,不过每个元素存储的是另一个数组的地址 -
异常有哪些处理方式,分别需要注意什么问题?
Throw抛出,hrow 是语句抛出一个异常;throws 是方法抛出一个异常,hrows 可以单独使用,但 throw 不能,throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获
Try catch:捕获异常,try里是可能出现的异常代码,catch对异常进行处理的代码段
多重try-catch:排列catch 语句的顺序:先子类后父类,发生异常时按顺序逐个匹配,只执行第一个与异常类型匹配的catch语句
try-catch-finally:如果没有异常,则执行try中代码块,在renturn前执行finally里的代码,如果有异常,执行catch中代码,执行return语句前执行finally中代码,finally块是否发生异常都执行,finally块不执行的唯一情况,退出java虚拟机,System.exit(); 0正常退出,非0非正常退出 -
方法的传参过程是如何工作的
调用方法的时候,用实参给形参进行赋值,这个过程被称为传参
形参就是一个变量,实参就是一个常量或者携带着值的变量,传参就是把实参赋值给形参
传参时需要注意的事项:实参的数量和类型必须和形参的数量和类型保持一致
1 基本类型传递的实际数据
2 引用类型传递的是地址
基本类型传递修改后对调用方没有任何影响。引用类型传递修改后对调用方有影响。String和包装类除外 -
什么是函数的重载?举例说明
参数个数不同,参数数据类型不同,参数顺序不同
函数名相同和而参数列表不同的两个或者多个函数为函数重载 -
方法重载与方法重写的区别
(1)方法重载的函数名相同,而参数列表不同
(2)方法重新则是函数名、参数列表和返回值都完全一致,访问权限不能比父类严格
(3)方法重载是在一个类内
(4)方法重写则出现在继承或者实现接口的情况
(5)方法重载的使用是为了实现函数的多功能
(6)子类中从父类继承来的方法无法满足自己的需求时,可以在子类中对父类方法进行完善,这个完善过程叫做方法重写(override),方法的重写相当于在子类中覆盖父类中的方法 -
构造方法与普通方法之间的区别
(1)构造方法用于初始化对象的成员变量,普通方法用于实现具体的功能
(2)构造方法没有返回值,且方法名必须和类名一致;普通方法必须有返回值,如果没有则使用void修饰,方法名任意,最好是动宾结构
(3)构造方法在创建对象的过程中就会执行,而且每个对象只执行一次,对于普通方法而言,只有在需要使用的时候才被执行,并且一个对象可以调用多次
(4)构造方法是在创建对象的过程中自动调用的,普通方法只能手动进行调用
(5)系统会默认为我们提供一个无参的构造方法,普通方法只能手动添加 -
this关键字的作用以及使用
This关键字指向本类对象;this.成员变量,表示本类成员变量;
this()表示本类构造方法,
(1) this(参数)只能用在构造方法中,必须是第一条语句
(2) this(参数)只能调用一次必须是方法的第一条语句 -
switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
能用在byte、String(jdk1.7后),不能使用long
byte、short、int、char、enum(枚举);java7之后可以是String -
什么时候用for循环,什么时候用while循环
- 对于同一问题, 三种循环可相互替代。
- 循环次数确定的情况优先选用for循环,循环次数不确定的情况,通常选用while和do-while循环。
- 要防止无限循环––死循环
-
break、continue、return的区别
Break; 应用在switch和循环中,作用跳出语句块
Continue结束本次循环,继续下一次循环
Return用在方法中作用返回结果,结束方法 -
IO流都有哪些分类?依据是什么?
按照方向分:输入流和输出流
按照读取的字节个数:字节流和字符流
按照功能分:节点流 (负责读写数据)、处理流 (封装)