1. 下面的代码共产生了几个对象?
String s1 = new String("abc");
String s2 = "abc";
String s3 = new String("abc");
答案:
如果字符串池中已经存在"abc",那么就会产生2个对象,就是new出来的s1和s3;如果字符串池中没有"abc",那就会产生3个对象,new出来的对象s1和s3还有新创建的"abc"。
知识储备:
JVM中有一个全局共享的字符串池,里面承载的就是像String s = "abc"这样的对象。比如String s = "bcd";这个过程程序会先检查字符串池中有没有"bcd"这个对象,如果有直接将"bcd"对象的引用指向变量s。如果没有则先回创建"bcd"对象,然后存入字符串池中,然后再将它的引用指向变量s。
衍生问题:
- String s = "ab" + "cd" ; 创建几个对象?s存放在哪里?
- String s = "ab" + new String("cd") ;创建几个对象,s存放在哪里?
- String temp = "ab";
String s1 = temp + "cd";
String s2 = "abcd";
s1==s2 ? false
问题1 我觉的需要考虑字符串常量池中是否已经存在"ab" 和 "cd",如果已经存在,这个问题答案就是创建一个对象,创建的就是"abcd"这个对象,然后再去判断字符串常量池中是否有"abcd",如果有就不会再将"abcd"加入字符串常量池,如果没有就会将"abcd"加入到常量池。
2. Activity和Fragment的startActivityForResult()方法有什么区别?
在Fragment中可以直接调用startActivityForResult()或者getActivity(). startActivityForResult(),前者是Fragment自己的方法后者是Activity的方法。
startActivityForResult() :
在Fragment和Activity中的onActivityResult()方法中都能收到回调,只是在Activity中的onActivityResult()中的requestCode和启动是传入的requestCode对应不上。
getActivity(). startActivityForResult():
这种方式只能在Activity的onActivityResult()中收到回调。
3. 说说overload和override的区别,overload能否改变返回值的类型?
overload重载是在同一个类中,出现多个重名的方法,形参列表不同即可(参数个数或类型不同),与返回值类型无关。
override重写是子类对父类的方法重写编写语句块,发生在子类。形参、返回值类型、方法名都必须一样。
4. b的结果是什么?
int x = 20,y = 30;
boolean b;
b =x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50 &&y<-60;
结果是false,这个题的考点是&&的优先级高于||
b = true || true && false;
从上面可知,如果同级那结果为false,但是运行结果是true,说明&&的优先级更高。
网友评论