面试题一:java中到底有没有goto这个关键字?
答案是:goto是java语言中的保留字,目前还没有在java中使用。
注意这里老师的解释是:保留字,而不是关键字。保留字(Reserved Words)一般是等同于关键字(Keywords)的。保留字是语言中已经定义过的字,编程人员不能使用保留字来命名变量、函数、方法等。关键字是在语言中有特定的含义,是语法中的一部分。在一些语言中保留字并没有应用的当前的语法,但是为了程序的可扩展性、也为了当前程序代码能向后兼容,所以保留了这些字,共以后程序有可能使用。
goto是c语言中的一个词,goto通常与条件判断语句配合使用,从而实现条件转移、构建循环、跳出循环等功能。但在结构化的程序设计中一般不主张使用goto,以免造成程序流程的混乱,使理解和调试程序产生困难。
面试题二:java中如何跳出当前的多重嵌套循环?
对于这个题,我首先想到的就是break,当时却忘记了要指明跳出的位置,也就是跳出多重嵌套的那个标记的位置
例如:
A:for(int i=0; i<10; i++){ //外循环定义标号A.
for(int j=0; j<10; j++){
System.out.println("i="+i+",j="+j);
if(j==6){
break A; //break A,就是跳到外循环处(也就是整个外循环都结束了).
}
}
}
然后使用当满足条件是跳出语句 break A; 试想如果我们不给break这个跳出的位置,那么break只能跳出当前的那层循环,而不是跳出这个的嵌套的循环。
然后老师又讲了另一种方法,
例如:
其实这种思路很简单:就是给最外层的循环添加一个跳出循环的条件,我们首先声明一个布尔型的变量found,然后进行循环,当需要跳出时给这个变量重新附一个值就可以了,然后最外层的条件不成立,就跳出了循环,上面的found先是给的false,在for循环中的终止用了一个
!found,其实这里也可以不能这么倒思维。直接先给true 然后 跳出时给false,但是这种的给法是为了程序的可读性更高。
其实有了上面的goto学习 我有种想法就是当需要跳出是使用goto A,但是我在测试时显示了错误,
意思是:一种不能被解析为一个变量。什么原因换不是很清楚,好吧 !我的想法未能成功。
面试题三:构造器Constructor是否可被override?
好吧,我承认,看到这个问题我都不知道是说什么的,看了讲解才知道是说继承的。
老师讲解:这个问题,看起来非常简单,但是很多初学者学完继承后,都认为子类可以继承父类的一切,事实上,构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
希望大家一定注意,不是父类所有的东西都要继承.
看完这个我又回去找了曾经自己看过的面向对象的三大特征:继承、多态、封装。
继承:以前记得自己看过的继承曾有一段是说:不是所有父类的东西都要继承。找了书,原来是我以前看c#是的继承,好吧,都是面向对象语言,并且java和c#的关系大家都懂得,那我就当两者一样来理解吧!c#中说:实例构造函数、析构函数和静态构造函数是不会被继承的,其他的所有父类成员都会被子类继承,无论他们的声明方式是什么,但是,根据它们被声明的访问性,在继承类中不一定能够访问到这些成员,这点在我看的java书里得到了验证:一个父类中用 private声明的变量:color ;子类是不能直接使用的,必须通过父类中给定的getColor()方法 才能使用。
面试题四:“==”和equals方法究竟有什么区别?
对于这点我以前根本没有注意过,知道上周实习时,有一个使用 leixin 获取到一个radio的选择时,我要做判断,我就是用了
if(leixin==“admin”)
{....}
程序老是报错,起初以为是没有获取到,结果用out.println(leixin);
显示是获取到了 就很郁闷,最后老师给我改成了equals,然后就success 了。今天能看到解释了:
答案:对于比较基本数据类型来说,==比较的就是数值的大小,例如:
int m = 2;
int n = 3;
boolean b = m==n;
System.out.println(b);//结果为false,因为2和3不等吗.
但是对于引用类型数据来说,==和equals就有些不同了,在大多数类中的equals方法调用的依然是==,但比较的是两个引用变量的地址是否相同.
例如:
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1==arr2);//结果是false,因为比较的是地址值.
System.out.println(arr1.equals(arr2));//结果还是false,因为比较的还是地址值.其实调用的方法还是"=="
但是在字符串String中就不一样了,因为String中的equals方法被重写了,它比较的是两个字符串对象中的内容是否相同.
例如:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1==s2);//结果是false,因为比较的是地址值.
System.out.println(s1.equals(s2));//结果是true,因为比较的是对象中内容是否相同.
所以就记住:当时string的类型时就用equals。
面试题五:对于两个整数变量,在不使用第三个变量的条件下交换两个变量的值?
这个问题肯定很多人都看到过,比较简单的一种就是:
a=a+b;
b=a-b;
a=a-b;
其实这里我们要注意的是在每条程序执行时a和b中的值的变化:例如:a=3,b=4; 当程序执行完 a=a+b; a的值就是7,b的值此时没有改变依然是4;然后执行完b=a-b; 此时b的值就成了最开始的那个“a”(3),注意;此时 a=7,b=3,那么重新给a 赋值:a=a-b=7-3=4;嗯,思路就这样理顺了。
这里贴出老师的另一个方法:
1,我们知道一个数异或另一个数2次,结果还是这个数。举例:2^3^3=2.这个大家明白吧,应该没问题.同样,3^2^3=2,其实我只是把顺序换了下位置,这个都不难理解.
2, 题目中不是说两个整数变量吗?那么我们就设两个整数变量.比如: int x = 2; int y = 3;现在我们就把这两个数用异或的方法进行数值换位.
3,由于我们人的思想习惯是xy的顺序,那么我们就先来换位x,于是有:
x = x^y;//此时x=2^3.这时再算出y,于是有
y = x^y;//相当于2^3^3=2,这时的y=2,我们完成了一个换位.于是开始换x.
此时x^y=2^3^2=3,那么我们就把这个值赋给x,那么就是
x = x^y;//相当于2^3^2=3.这时x=3;
如果仔细思考,其实两者的思想是一样的:都是先用其中的一个变量来记录关于两个值的东西,然后使用这个记录的东西和另一个没有改变的变量来使用恰当的方法使另一种变量先变成第一个变量,然后在用那个东西和改变的那个变量方法来使产生原来的那个值赋给第一个变量 ,只是这其中的那个方法不一样而已。
A dwarf on a giant's shoulder sees the farther of the two.
站在巨人肩上的矮子看得比巨人远。
--A dwarf on a giant's shoulders