牛客网做题6.04
(1)
重载就是一句话:同名不同参,返回值无关。
覆盖/重写:同名同参
(2)
类变量在不设置初始值时,会进行默认值赋值,而局部方法中声明的变量则必须进行初始化,他不会进行默认值赋值
注意final变量才是都需要进行初始化的
(3)
Java语言中,如果"xyz"没有被创建过,String s =new String(“xyz”);创建了几个string object?答案是两个
原因如下:
String类新建对象的时候,会首先在字符串常量池中检查该对象是否存在,如果不存在则新建。所以字符串常量池中没有相同的字符串存在
常量池创建对象完成(如果不存在),则在堆中再创建对象。如下图:
(4)下列程序的运行结果
public
void
getCustomerInfo() {
try
{
// do something that may cause an Exception
}
catch
(java.io.FileNotFoundException ex) {
System.out.print(
"FileNotFoundException!"
);
}
catch
(java.io.IOException ex) {
System.out.print(
"IOException!"
);
}
catch
(java.lang.Exception ex) {
System.out.print(
"Exception!"
);
}
}
解析:
题目说抛出一个异常,但是没说具体是什么异常,那么就要分情况了:
1.如果抛出一个FileNotFoundException(或其子类),那么最终结果就打印FileNotFoundException
2.如果抛出一个IOException,或者IOException的子类(不包含FileNotFoundException及其子类),那么最终结果就打印IOException
3.如果抛出一个Exception(不包含IOException及其子类),那么最终结果就打印Exception.
以上,所以3个皆有可能.但是,不管是哪一种情况,只会输出其中之一。
(5)
考察的是Map接口实现类的创建对象以及对象类型包含的方法。
A选项Map属于接口类型,不可以new的方式创建对象。所以A错误。
B选项SortedMap属于接口类型,不可以new的方式创建对象。所以B错误。
C选项HashMap基于哈希表实现Map接口的类,并允许null的值和null键。
D选项TreeMap通过红黑树实现Map接口的类,key不可以为null,会报NullPointerException异常,value可以为null。
Map家族的继承实现关系如***意一点就是顶层的Map接口与Collection接口是依赖关系:
关于Key和Value能否为null的问题:
(6)在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。这句话是错的,错的,错的
解析:
java多态有两种情况:重载和覆写
在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法;
在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法
(7)
指出下列程序运行的结果:
public
class
Example{
String str=
new
String(
"tarena"
);
char
[]ch={
'a'
,
'b'
,
'c'
};
public
static
void
main(String args[]){
Example ex=
new
Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+
" and "
);
System.out.print(ex.ch);
}
public
void
change(String str,
char
ch[]){
//引用类型变量,传递的是地址,属于引用传递。
str=
"test ok"
;
ch[
0
]=
'g'
;
}
}
解析:
string和char数组都是引用类型,引用类型是传地址的,会影响原变量的值,但是string是特殊引用类型,为什么呢?因为string类型的值是不可变的,为了考虑一些内存,安全等综合原因,把它设置成不可变的; 不可变是怎么实现的?Java在内存中专门为string开辟了一个字符串常量池,用来锁定数据不被篡改,所以题目中函数中的str变量和原来的str已经不是一个东西了,它是一个局部引用,指向一个testok的字符串,随着函数结束,它也就什么都没了,但是char数组是会改变原值的
(8)假定str0,...,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为 15
static
String str0=
"0123456789"
;
static
String str1=
"0123456789"
;
String str2=str1.substring(
5
);
String str3=
new
String(str2);
String str4=
new
String(str3.toCharArray());
str0=
null
;
解析:这是一个关于java的垃圾回收机制的题目。垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。
年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。
年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收
永久代:存储的是final常量,static变量,常量池。
str3,str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回
所以最后就是一个15字符的
(9)以下代码结果是什么?
public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer(“A”);
StringBuffer b=new StringBuffer(“B”);
operate(a,b);
System.out.println(a+”.”+b);
}
static void operate(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
}
下面通过图来解析本题目;
这里简单地说,a,b,x,y就是四个指针。y本来指向的是b所指向的对象,但是一个“=”,y就指向了x所指向的目标即是a指向的对象,因此原来b所指向的目标并没有发生任何改变。与y不同的是,x进行的是对象操作,此时此对象在内存中是真正的本质上的改变。
(10)
stream结尾都是字节流,reader和writer结尾都是字符流 两者的区别就是读写的时候一个是按字节读写,一个是按字符。 实际使用通常差不多。 在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。 只是读写文件,和文件内容无关的,一般选择字节流。