程序员面试笔试通关宝典
上QQ阅读APP看书,第一时间看更新

2.4 名企真题解析

接下来,我们收集了一些大企业往年的面试及笔试题,读者可以根据以下题目来作参考,看自己是否已经掌握了基本的知识点。

2.4.1 值传递和引用传递

【选自WR笔试题】

试题题面:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是按值传递还是按引用传递?

题面解析:本题题目比较长,有些读者可能觉着回答很费劲。其实可以换一种方式来想该问题,即Java中是按值传递还是按引用传递?本题的重点是在最后按值传递还是按引用传递,接下来将详细讲解按值传递和按引用传递。

解析过程:

先来讲解一下什么是值传递和引用传递。

1)值传递

在方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中,对形式参数值的改变不影响实际参数的值。

按值传递就是将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。

2)引用传递

引用传递也称为传地址。方法调用时,实际参数的引用被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

按引用传递是将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数的值,调用代码中的原始值也随之改变。如果函数修改了该参数的地址,调用代码中的原始值不会改变。

在Java中只有值传递参数。

(1)当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象引用的一个副本。对象的内容可以在被调用的方法中改变,但对象的引用是不会发生改变的。

Java中没有指针,因此没有引用传递。但可以通过创建对象的方式来实现引用传递。

(2)在Java中只会传递对象的引用,按引用传递对象。

(3)在Java中按引用传递对象但并不意味着会按引用传递参数。参数可以是对象引用,而Java是按值传递对象引用的。

(4)Java中的变量可以为引用类型和基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的,两种类型都是按值传递。

2.4.2 什么是类的反射机制

【选自GG面试题】

题面解析:本题主要考查Java中的反射机制,我们需要知道什么是反射机制,反射机制的功能都有哪些,另外就是怎样运用反射机制来创建类的对象等。全面地了解该问题所涉及的知识,回答问题会更加容易。

解析过程:

反射机制是Java语言中的一个重要的特性,反射机制不仅允许程序在运行时进行自我检查,而且还允许对其内部的成员进行操作。由于反射机制在运行时能够实现对类的装载,因此能够提高程序的灵活性,但是如果使用反射机制的方法不当,可能也会严重影响系统的性能。

反射机制提供的功能如下:

(1)得到一个对象所属的类。

(2)获取一个类的所有成员变量和方法。

(3)在运行时创建对象。

(4)在运行时调用对象的方法。

反射机制最重要的一个作用就是可以在运行时动态地创建类的对象,其中Class类是反射机制中最重要的类。获取Class类的方法如下:

     获取Class对象的三种反射:
    (1)Class class1 = Class.forName("com.reflection.User");
    (2)Class class2 = User.class;
    (3)User user = new User();
         Class class3 = user.getClass();

获取对象实例的方法如下:

    (1)user1 = (User)class1.newInstance ();
         user1.setName("a");
         user1.setAge("15");
    (2)Constructor constructor = class2.getConstructor (String.class, Integer.class);
         user2 = (User)constructor.newInstance("b", 11);

2.4.3 Java创建对象的方式有哪几种

【选自BD面试题】

题面解析:本题也是在大型企业的面试中最常问的问题之一,主要考查创建对象的方式。

解析过程:

共有4种创建对象的方式。

1)通过new语句实例化一个对象

使用new关键字创建对象是最常见的一种方式,但是使用new创建对象会增加耦合度。在使用new时需要先查看new后面的类型,然后再决定分配多大的内存空间;接着可以通过调用构造函数,来对对象的各个域进行填充;根据构造方法的返回值进行对象的创建,最后把引用地址传递给外部。例如:

2)通过反射机制创建对象

使用反射机制的Class类的newInstance()方法。

3)通过clone()方法创建一个对象

在使用clone()方法时,不会调用构造函数,而是需要有一个分配了内存的源对象。在创建新对象时,首先应该分配一个和源对象一样大的内存空间。

4)通过反序列化的方式创建对象

序列化就是把对象通过流的方式存储到文件里面,那么反序列化也就是把字节内容读出来并还原成Java对象,这里还原的过程就是反序列化。在使用反序列化时也不会调用构造方法。