牛客网做题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结尾都是字符流 两者的区别就是读写的时候一个是按字节读写,一个是按字符。 实际使用通常差不多。 在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。 只是读写文件,和文件内容无关的,一般选择字节流。

猜你喜欢

转载自blog.csdn.net/weixin_41673515/article/details/90813123