主要说说最近在笔试中频繁遇到的题目,涉及到:逻辑题、实例变量与静态变量的区别、Java类的加载问题
1.“盲人摸牌”,有52张牌,其中10张正面朝上,排除盲人能摸出正反面这种情况,问:盲人要把牌分成两部分,怎么保证每一部分正面朝上的牌数相等?
2.“烧香定时”,有两根分布不均的香,已知每根香正常烧完的时间是一个小时,问:怎么利用香来确定一段15分钟的时间?
3.“大智保命”,某小岛居住一群与世隔绝多年的人,某天,一探险家误入该岛,被岛上人抓住(不纠结语言不通的问题),岛上人说:外人进来都要被杀死,我们允许你有遗言,这将决定你的死亡方式。如果你说的是真话,你将会被烧死,如果你说的是假话,你将会被五马分尸。问:冒险家怎么说才能保命?
实例变量与静态变量的区别:
实例变量:是类对象的属性,只有在创建类对象时,才会有实例变量
静态变量:也称类变量,是类所有,在类第一次被加载时就会存在
比较典型例子的是:实例变量无法通过类名直接调用,需要创建类对象,通过对象进行调用,但是静态变量却可以直接通过类名进行调用。
关于类加载问题
主要是写出程序的输出,涉及有父类和子类的普通代码块、静态代码块及构造函数,下面是自己测试写的例子
<pre>public class Parent {
{
System.out.println("父类普通代码块");
}
static{
System.out.println("父类静态代码块");
}
public Parent() {
System.out.println("父类构造函数");
}
}</pre>
<pre>public class Children extends Parent{
{
System.out.println("子类普通代码块");
}
static {
System.out.println("子类静态代码块");
}
public Children() {
System.out.println("子类构造函数");
}
}</pre>
<pre>public class LoadOrderTest {
public static void main(String[] args) {
Parent parent = new Children();
parent = new Children();
}
}</pre>
程序运行结果如下
!!静态代码块在整个过程中只会加载一次
</br>
逻辑题答案:
1.“盲人摸牌”,首先分成42和10两部分,然后把10的那一部分牌全部翻过来。
解析:共有10张正面朝上的牌,假设42中有x张正面,则10中有(10-x)张正面,10那部分全部翻了之后(正面变成反面,反面变成正面),10中正面的牌为(10-(10-x))张,即x张。所以此时两部分正面朝上的牌数相同
2.“烧香定时”,姑且把香编号为A、B。同一时刻,把A两头点燃,B一头点燃。由于一根香烧完是一个小时,那么此种情况下A烧完需要半个小时。A烧完时,点燃B的另一头。那么点燃B另一头的这一刻到B烧完这段时间即为15分钟。
3.“大智保命”,冒险家说:我将会被五马分尸
解析:因为如果这句话为真,便与真话会被烧死相矛盾,若为假,便与假话会被五马分尸矛盾