Java面试题与解答(一)——基础部分

澳门新葡亰网站注册 1

本文由码农网 –
小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

之前收集整理了一篇《Java线程面试题》,反响还不错,也促使我有了写这篇文章的冲动。

以下是笔者认为比较经典的关于Java main方法的面试题,与其说是Java面试题,其实也是Java的一些最基础知识问题,分享给大家,如有错误,请指出。

学了好几年的Java,项目也做了一些,总感觉对于很多细小的知识点没有很好地掌握。面临校招,借此机会把遇到的一些常见的Java面试题做一个总结。希望能够巩固自己的Java知识,为面试做好准备。

澳门新葡亰网站注册 1

115个Java面试题和答案——终极列表:

经典的Java基础面试题集锦:

《Java程序员面试宝典》第11章 面向对象·11.1
面向对象的基本概念:

JAVA面试题100问第一部分:

1.不用main方法如何定义一个类?

不行,没有main方法我们不能运行Java类。

在Java 7之前,你可以通过使用静态初始化运行Java类。但是,从Java
7开始就行不通了。

1.面向对象编程的特征有哪几个方面?

2.main()方法需要的参数不是字符串数组?

不是的,main()方法的参数必须是字符串数组。

但是,在引进变参时,你可以将字符串类型的变参作为参数传递给main()方法。变参一定得是数组。

package com.instanceofjava;
public class MainMethod
{
public static void main(String args[])
{
}
}

[封装]

3.我们能不能改变main()方法的返回类型?

不能,main()方法的返回类型只能是空。任何其它类型都是不能接受的。

package com.instanceofjava;
public class A
{
public static int main(String[] args)
{
 return 1;    //run time error : No main method found
}
}

封装给对象提供了隐藏内部特性和行为的能力。外部无法直接访问这些封装了的数据,从而保证了这些数据的正确性。同时,对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。

4.main()方法为什么必须是静态的?

main()方法一定是静态的。

如果main()允许是非静态的,那么在调用main方法时,JVM就得实例化它的类。

在实例化时,还得调用类的构造函数。如果这个类的构造函数有参数,那么届时就会出现歧义。

例如,在下面的程序中,在实例化类“A”的时候,JVM传递什么参数?

package com.instanceofjava;
public class A
{
public MainMethod(int i)
{
//Constructor taking one argument
}
 public void main(String[] args)
{
//main method as non-static
}

下面列出了使用封装的一些好处:

5.我们能不能声明main()方法为非静态?

不能,main()方法必须声明为静态的,这样JVM才可以调用main()方法而无需实例化它的类。

如果从main()方法去掉“static”这个声明,虽然编译依然可以成功,但在运行时会导致程序失败。

package com.instanceofjava;
public class A
{
public void main(String[] args)
{
System.out.println("indhu");         //Run time error
}
}

-通过隐藏对象的属性来保护对象内部的状态。

6.我们能否重载main()方法?

可以,我们可以重载main()方法。一个Java类可以有任意数量的main()方法。

为了运行java类,类的main()方法应该有例如“public static void
main(String[]
args)”的声明。如果你对此声明做任何修改,编译也是可以成功的。但是,运行不了Java程序。你会得到运行时错误,因为找不到main方法。

package com.instanceofjava;
public class A
{
public static void main(String[] args)
{
System.out.println("Indhu");
 }
void main(int args)
{
System.out.println("Sindhu");
}
long main(int i, long d)
{
System.out.println("Saidesh");
return d;
}
}

7.我们能否声明main()方法为private或protected,或者不用访问修饰符?

不能,main()方法必须public。你不能定义main()方法为private和protected,也不能不用访问修饰符。

这是为了能让JVM访问main()方法。如果你不定义main()方法为public,虽然编译也会成功,但你会得到运行时错误,因为找不到main方法。

package com.instanceofjava;
public class A
{
private static void main(String[] args)
{
//Run time error
}
}

-提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。

8.我们能否在Java中覆盖main方法?

不能,你不能在Java中覆盖main方法。这是因为main方法是静态方法,而在Java中静态方法在编译时会结合在一起,所以你在Java中不能覆盖静态方法。

-禁止对象之间的不良交互提高模块化。

9.我们能否在Java中终结main方法?

你可以在Java中终结main方法。JVM对此没问题。

[多态]

10.我们能否在Java中同步main方法?

是的,main方法可以在Java中同步,synchronized修饰符允许用于main方法的声明中,这样就可以在Java中同步main方法了。

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。

[继承]

继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。

[抽象]

抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。

2.对象与实例有什么区别?

解析:在Java的内存分配中,对象和实例是不同的,前者分配在内存堆里,后者分配在堆栈里,至于为什么要这样分,参考一下其他的资料。对象是不变的东西,它是对客观事物的抽象,实例是对操作对象的引用,你不能直接操作对象。

答案:对象和实例从宏观的角度看,区别是:对象是同类事物的一种抽象表现形式,而实例是对象的具体化,一个对象可以实例化很多实例,对象就是一个模型,实例是照着这个模型生产的最终产品。实际上就是这样,一个对象可以实例化N个实例。就像根据一个模型可以制造多个实际的产品一样。

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java的”一次编写,处处运行”是如何实现的?

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2.JDK和JRE的区别是什么?

Java运行时环境(Java Runtime
Environment)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(Java
Develop
Kit)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。

3.”static”关键字是什么意思?Java中是否可以覆盖一个private或者是static的方法?

“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。

澳门新葡亰网站注册,4.是否可以在static环境中访问非static变量?

static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

5.Java支持的数据类型有哪些?什么是自动拆装箱?

Java语言支持的8中基本数据类型对应的长度、对应的包装类、:

int— 4字节—Integer

char—2字节—Character

float—4字节—Float

double—8字节—Double

byte—1字节—Byte

short—2字节—Short

long—8字节—Long

boolean—1字节–Boolean

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。反之就是自动拆箱。

6.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

7.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。

Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。

8.Java支持多继承么?

不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。

9.接口和抽象类的区别是什么?

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

类可以实现很多个接口,但是只能继承一个抽象类

类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象类可以在不提供接口方法实现的情况下实现接口。

Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。

Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

也可以参考JDK8中抽象类和接口的区别

10.什么是值传递和引用传递?

对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。

对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。

11.什么是局域变量?什么是实例变量?什么是类变量?

在方法内、构造函数内或者代码块内定义的变量是局域变量。局域变量在函数内声明和初始化,当函数执行结束时局域变量会被销毁。实例变量是在类中但在任何函数之外的变量。实例变量只有当类实例化后才能被引用。在类中并且在任何函数之外,使用static关键词声明的变量是类变量。

12.什么是类的单例模式?

单例类控制对象的生成,一次只能存在一个对象但兼具灵活性,当条件改变时允许创建多个变量。

13.什么是构造函数?

当一个新的对象被创建的时候会自动调用构造函数。每个类都有构造函数。如果不显性声明构造函数,JAVA编译器会调用默认构造函数。

14.列举为类创建对象的过程。

首先声明一个对象,然后实例化,再对其初始化。

15.JAVA中字节数据类型的默认值是多少?

0

16.JAVA中float和double的默认值是多少?

float型和double型的默认值与C/C++相同,float是0.0f,double是0.0d。

17.byte类型在什么时候使用?

byte类型用来在较大的数组中节省储存空间。使用byte类型替代int型可以节省三倍的空间。

18.什么是访问控制修饰符?

JAVA提供访问控制修饰符来修饰类、变量、方法和构造函数的访问控制属性。当不写出访问控制修饰符时,成员具有默认的访问权限或者包访问控制权限。

19.什么是受保护访问控制修饰符?

变量、方法和构造函数如果在父类中被声明为受保护,那么它们只能在其它包的子类中或者在该父类的包中被访问。

20.什么是同步修饰符?

JAVA在访问控制修饰符之外还提供同步修饰符,同步修饰符用来限制方法,使方法一次只能被一个线程调用。

21.在JAVA运算符优先级中,哪个运算符的优先级最高?

圆括号()和下标运算符[]具有最高的优先级。

22.在switch语句中能使用的数据类型包括哪些?

switch中使用的变量只能是字节型、短整型、整型或字符型。

23.parseInt()函数在什么时候使用到?

parseInt()函数用于解析字符串返回整数。

24.为什么说String类是不可变的?

String对象一旦被创建就不可改变,因此可以在多个线程中被安全地引用,这对于多线程的编程来说十分重要。

25.为什么说StringBuffer类是可变的?

String类是不可变的,因此一个String对象一旦被创建就不可改变。如果需要对字符串进行频繁的修改,那么就应该使用StringBuffer。

26.StringBuffer和StringBuilder类的区别在哪?

尽可能使用StringBuilder,因为它运行时比StringBuffer快。但如果需要强调线程安全,那就应该使用StringBuffer。

27.如果main方法被声明为private会怎样?

能正常编译,但运行的时候会提示”main方法不是public的”。