每天三道面试题2019-09-13

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/HardToFindName/article/details/100810020

1、为什么函数不能根据返回类型来区分重载?

因为调用时不能够指定类型信息,编译器不知道你要调用哪个函数,如:

float max(float x, float y);
int max(int x, int y);

调用max(1, 2);时无法确定调用的是哪一个,但从这一点来说,仅返回值不同的重载是不应该允许的。
若编译器可根据上下文(语境)来判断出含义,比如:

int f();
void f();

当在int x = f();中,完全没有问题。然而,我们也有可能只是调用一个方法,同时忽略他的返回值,我们通常把这称为“为它的副作用去调用一个方法”,因为我们不关心他的返回值,而是调用方法的其他效果。所以假如我们像这样调用一个方法:f();java怎么去判断f()具体调用的方式呢?而且别人如何识别并理解代码呢?由于存在这一类的问题,所以不能。
补充:
函数的返回值只是作为函数运行之后的一个“状态”,他是保持方法的调用者与被调用者进行通信的关键。并不能作为这个方法的标识。

2、char型变量中能不能存储一个中文汉字,为什么?

可以。因为java中使用的编码是Unicode(在不指定编码时,直接使用字符在字符集中的编号,这是能够达到统一的唯一方法),一个char类型占2个字节(即16比特),一个中文字符在Unicode编码下占2个字节(在utf-8编码下占3个字节),所以放一个中文是没有问题的。
补充:
使用unicode意味着字符在jvm内部和外部有不同的表现形式,jvm内部使用的是unicode,当这个字符被从jvm内部转移到外部时,比如存入文件系统,需要进行编码转换,如果不进行转换则可能会因为编码不同一产生乱码。所以java中有字节流和字符流,以及在字节流和字符流之间转换的转换流,如InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器,承担了编码转换的任务。
关于Unicode和utf-8下中文字符的存储前者为什么是两个字节,后者为什么是三个字节,参考:https://www.cnblogs.com/deepblue775737449/p/7604738.html

3、抽像的(abstract)方法是否同时可以是静态的(static),是否可同时是本地方法(native),是否可被synchronized修饰。

都不能。抽象方法需要子类重写,而静态方法是无法被重写的,二者产生矛盾;本地方法是由本地代码(如c代码)实现的,而抽象方法是没有实现的,也产生了矛盾;synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是矛盾的。

猜你喜欢

转载自blog.csdn.net/HardToFindName/article/details/100810020
今日推荐