JAVA:
1.问题:
public boolean returnTest() { try { return true; } catch (Exception e) { } finally { return false; } }
以下代码返回值是什么?
true
false
解答:
参考这里 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.5
我的理解:
1、首先执行到try里的return,但是有finally语句还要执行,于是先执行return后面的语句,例如(x++),把要返回的值保存到局部变量。
2、执行finally语句的内容,其中有return语句,这时就会忽略try中的return,直接返回。
测试代码:
public static int returnTestInt() { int a = 0; try { return a++; } catch (Exception e) { } finally { return ++a; } }
上面的代码,在我的机器上返回结果是2.
于是本题就很简单了,选择false。
C++:
1.问题:
已知const char * node="ABC";下列语句合法的是___.
node[2] = 'k';
*node[2]='k';
*node = "xyz";
node="xyz";
解答:
答案:D
const char * node="ABC"
这是一个指向字符常量的指针,也就是 *node 的值不能被改变
A, node[2] = 'k';更改coust类型的值,编译不通过
B,*node[2]这种写法本身就是错误的
C,*node = "xyz"; 前面说了,*node的值不能改变
D,node是指针类型,node指向的内容不能改变,但是node指针本身可以改变
node="xyz";这里是让node指向“xyz”的首地址
2.问题:
虚函数,指针指向子类地址就调用子类地址,指向父类地址就调用父类函数:
引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。
class Cman { public: virtual void Eat(){……}; void Move(); private: }; class CChild : public CMan { public: virtual void Eat(){……}; private: }; CMan m_man; CChild m_child; //这才是使用的精髓,如果不定义基类的指针去使用,没有太大的意义 CMan *p ; p = &m_man ; p->Eat(); //始终调用CMan的Eat成员函数,不会调用 CChild 的 p = &m_child; p->Eat(); //如果子类实现(覆盖)了该方法,则始终调用CChild的Eat函数 //不会调用CMan 的 Eat 方法;如果子类没有实现该函数,则调用CMan的Eat函数 p->Move(); //子类中没有该成员函数,所以调用的是基类中的