《JAVA程序员面试笔试宝典 第2版》何昊,郭晶晶,薛鹏等编著|(epub+azw3+mobi+pdf)电子书下载
图书名称:《JAVA程序员面试笔试宝典 第2版》
- 【作 者】何昊,郭晶晶,薛鹏等编著
- 【页 数】 302
- 【出版社】 北京:机械工业出版社 , 2021.10
- 【ISBN号】978-7-111-69038-2
- 【分 类】JAVA语言-程序设计
- 【参考文献】 何昊,郭晶晶,薛鹏等编著. JAVA程序员面试笔试宝典 第2版. 北京:机械工业出版社, 2021.10.
图书封面:
图书目录:
《JAVA程序员面试笔试宝典 第2版》内容提要:
本书是一本讲解JAVA程序员面试笔试的实用工具书。在写法上,除了讲解如何解答JAVA程序员面试笔试问题以外,还引入了相关知识点辅以说明,让读者能够更加容易理解和掌握。
《JAVA程序员面试笔试宝典 第2版》内容试读
第1部分
Java核心知识
这一部分重点介绍Java面试笔试的过程中常见的一些核心知识点。这部分不仅会简要介绍面试笔试过程中碰到的高频知识点的使用方式,而且针对部分核心知识,还会简要介绍其内部的实现原理,从而让求职者在应对面试的时候做到游刃有余
第1章Java基础知识
本章重点介绍Java的一些基础知识,包括Java语言的基本特性、面向对象的特性、Java中常用的关键字、基本类型、字符串、数组以及异常处理等。
1.1
Java程序初始化的顺序
在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
Java程序的初始化一般遵循以下三个原则(以下三个原则优先级依次递减):1)静态对象(变量)优先于非静态对象初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。2)父类优先于子类进行初始化。3)按照成员变量定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任意方法(包括构造方法)被调用之前先进行初始化。
Java程序的初始化工作可以在许多不同的代码块中来完成(例如:静态代码块、构造函数等),它们执行的顺序为:父类静态变量一父类静态代码块一→子类静态变量一子类静态代码→父类非静态变量→父类非静态代码块→父类构造方法→子类非静态变量→子类非静态代码块→子类构造方法。下面给出一个不同模块初始化时执行顺序的例子。
class Base
static
System.out.println("Base static block");
System.out.println("Base block");
public Base0
System.out.println("Base constructor");
public class Derived extends Base
static
{
System.out.println("Derived static block");
System.out.println("Derived block");
public Derivedo
System.out.println("Derived constructor"):
-02
第1章Java基础知识OOOO
public static void main(String args)
new DerivedO;
}
}
程序运行结果为:
Base static block
Derived static block
Base block
Base constructor
Derived block
Derived constructor
这里需要注意的是,(静态)非静态成员域在定义时初始化和(静态)非静态块中初始化的优先级是平级的,也就是说按照从上到下初始化,最后一次初始化为最终的值(不包括非静态的成员域在构造器中初始化)。所以在(静态)非静态块中初始化的域甚至能在该域声明的上方,因为分配存储空间在初始化之前就完成了。如下例所示:
public class testStatic{
static (a=2;}static int a=1;static int b=3:static b-4;
public static void main(String]args)
System.out.println(a);
System.out.println(b)
}
程序运行结果为:
构造方法
构造方法是一种特殊的方法,用来在对象实例化时初始化对象的成员变量。在Java语言中,构造方法具有以下特点:
1)构造方法必须与类的名字相同,并且不能有返回值(返回值也不能为void)。
2)每个类可以有多个构造方法。当开发人员没有提供构造方法的时候,编译器在把源代码编译成字节码的过程中会提供一个默认的没有参数的构造方法,但该构造方法不会执行任何代码。如果开发人员提供了构造方法,那么编译器就不会再创建默认的构造方法了。
3)构造方法可以有0个、1个或1个以上的参数。
4)构造方法总是伴随着nw操作一起调用,不能由程序的编写者直接调用,必须要由系统调用。构造方法在对象实例化的时候会被自动调用,对于一个对象而言,只会被调用一次,而普通的方法是在程序执行到它的时候被调用的,可以被该对象调用多次。
5)构造方法的主要作用是完成对象的初始化工作。
6)构造方法不能被继承,因此就不能被重写(Override),但是构造方法能够被重载(Overload),可以使用不同的参数个数或参数类型来定义多个构造方法。
7)子类可以通过super关键字来显式地调用父类的构造方法,当父类没有提供无参数的构造方法时,子类的构造方法中必须显示地调用父类的构造方法,如果父类中提供了无参数的构造方法,此时子
30
0Java程序员面试笔试宝典第2版
类的构造方法就可以不显式地调用父类的构造方法,在这种情况下编译器会默认调用父类的无参数的构造方法。当有父类时,在实例化对象时会首先执行父类的构造方法,然后才执行子类的构造方法。
8)当父类和子类都没有定义构造方法的时候,编译器会为父类生成一个默认的无参数的构造方法,给子类也生成一个默认的无参数的构造方法。此外,默认构造器的修饰符只跟当前类的修饰符有关(例如:如果一个类被定义为public,那么它的构造方法也是public)。
引申:普通方法是否可以与构造方法有相同的方法名?答案:可以。如下例所示:
public class Test
public Test(
System.out.println("construct");
public void Test()
System.out.println("call Test");
public static void main(String]args)
Test a=new Testo:/调用构造函数
a.TestO;/调用Test方法
}
程序运行结果为:
constructcall Test
.3
Java中clone方法的作用
由于指针的存在不仅会给开发人员带来不便,同时也是造成程序不稳定的根源之一,为了消除
C/C+语言的这些缺点,Java语言取消了指针的概念,但这只是在Java语言中没有明确提供指针的概念与用法,而实质上每个w语句返回的都是一个指针的引用,只不过在大部分情况下开发人员不需要关心如何去操作这个指针而已。
由于Jva取消了指针的概念,所以开发人员在编程中往往忽略了对象和引用的区别。如下例所示:
class Obj{
public void setStr(String str){
this.str=str;
private String str="default value";public String toStringO(
return str;
public class TestRef
private Obj aObj=new Obj;private int alnt=0;public Obj getAObjO
return aObj;
public int getAInto
return alnt;
04
第1章Java基础知识OOOO
}
public void changeObj(Obj inObj)
inObj.setStr("changed value");
public void changelnt(int inlnt)
inInt =1;
public static void main(String[]args)
TestRef oRef=new TestRefO;
System.Out.printn(m水华率*率幸*幸率老*率**来来华写引用类型幸*幸幸幸*率**来*本*率率率")方
System.out.println("调用changeObj(0前:"+oRef.getAObjO)ioRef.changeObj(oRef.getAObjO);
System.out.printin("调用changeObj0后:"+oRef.getAObjO)
System.Out,println("******基本数据类型幸*率***率***率*")方
System.out.println("调用changeIntO前:"+oRef.getAIntO);oRef.changeInt(oRef.getAInto);
System.out.println("调用changeIntO后:"+oRef.getAIntO);
上述代码的输出结果为:
率幸率率率率率率率率*华*率率来率率率习引用类型率率率水水率来华华来泰率率率率率来率水调用changeObj0前:default value调用changeObj(0后:changed value
华幸*率幸率率率率来率率率率率率率率率基本数据类型华华华率*率装率率率率率率非水来华率调用changelntO前:0调用changelnt0后:0
上面两个看似类似的方法却有着不同的运行结果,主要原因是Java在处理基本数据类型(例如int、char、double等)的时候,都是采用按值传递(传递的是输入参数的拷贝)的方式,除此之外的其他类型都是按引用传递(传递的是对象的一个引用)的方式执行。对象除了在函数调用的时候是引用传递,在使用“=”赋值的时候也采用引用传递,示例代码如下:
class Obj{
private int alnt=0:public int getAIntO
return alnt;
}
public void setAInt(int int1){
aInt=intl;
public void changelnto
this.aInt=1;
public class TestRef
public static void main(String[]args)
Obj a-new ObjO;
Obj b=a;
b.changelntO);
System.out.println("a:"+a.getAIntO);
System.out.println("b:"+b.getAInt();
50
oJava程序员面试笔试宝典第2版
上述代码的运行结果为:
在实际的编程中,经常会遇到从某个已有的对象A创建出另外一个与A具有相同状态的对象
B,并且对B的修改不会影响到A的状态,例如Prototype(原型)模式中,就需要复制(clone)一个对象实例。在Java语言中,仅通过简单的赋值操作显然无法达到这个目的,而Java提供了一个简单且有效的clone方法来满足这个需求。
Java中所有的类默认都继承自Object类,而Object类中提供了一个clone方法。这个方法的作用是返回一个Object对象的拷贝,这个拷贝函数返回的是一个新的对象而不是一个引用。那么怎样使用这个方法呢?以下是使用clone方法的步骤:
l)实现clone的类首先需要继承Cloneable接口。Cloneable接口实质上是一个标识接口,没有任何接口方法。
2)在类中重写Object类中的clone方法。
3)在clone方法中调用super..clone0。无论clone类的继承结构是什么,super.clone()都会直接或间接调用java.lang.Object类的clone(0方法。
4)把浅拷贝的引用指向原型对象新的克隆体。对上面的例子引入clone方法如下:
class Obj implements Cloneable{
private int alnt=0:public int getAIntO
return alnt;
public void setAInt(int int1)
alnt intl;
public void changelnto
this.aInt=1;
public Object cloneO
Object o=null;try
o=(Obj)super.clone0;
}catch (CloneNotSupportedException e){
e.printStackTraceO;
return o;
public class TestRef
public static void main(String]args)
Obj a=new ObjO;
Obj b=(Obj)a.clone0;
b.changeInt0:
System.out.println("a:"+a.getAIntO);
System.out.printin("b:"+b.getAInto);
程序运行结果为:
06
···试读结束···