Java 基础面试300题 (1-50)
Java 基础知识300题,含答案。内容广泛,涵盖数据类型,运算符,字符串,日期时间处理、类和对象,内部类 ,错误处理,lambda表达式,多线程等等。解答深入浅出,并附有大量代码片段,易于理解。适合初学者厘清、深化并巩固java基础知识。
001. 什么是方法重载和方法重写?
当一个类中有两个或多个具有相同名称但参数个数或者类型不同的方法时,就会发生方法重载。如下代码所示:
public class Calculator {
public int add (int a, int b) {
return a+b;
}
public double add (double a, double b) {
return a+b;
}
public int add (int a) {
return a+a;
}
}
当子类中存在与超类方法具有相同名称和参数数量的方法时,就会发生方法重写。以下代码演示了这一点:
public class Animal {
public void saySomething () {
System.out.println(“I am an animal”);
}
}
public class Dog extends Animal {
public void saySomething () {
System.out.println(“I am a dog”);
}
}
002. 面向对象编程(OOP)有什么优点?
面向对象编程具有下面优点:
-
可重用性:继承、组合和多态性等OOP原则有助于重复使用现有代码
-
可扩展性:使用继承等OOP原则编写的代码使代码可扩展
-
安全:OOP原则,如封装,有助于将数据和在数据上操作的代码保持在一起,并使代码安全
-
简单性:Java类代表现实世界的对象。这使得代码非常容易理解
-
可维护性:使用OOP原则编写的代码更容易维护
003.编写一段代码,演示封装。
封装是指将数据和在数据上运行的代码作为一个单元保存在一起。简单地创建一个带有私有字段和公共getter/setter方法的类就是封装的一个例子。以下代码片段演示了这一点:
public class Laptop {
private String memory;
public String getMemory () {
return memory;
}
public String setMemory (String newMemory){
memory = newMemory;
}
}
在上述代码片段中,我们定义了一个名为Laptop
类,它有一个名为memory
的私有字段,以及用于访问/修改其值的公共getter/setter
方法。 memory
字段不能直接在类外访问,只能通过其getter/setter
方法访问,由此形成封装。
004. 继承关系有几种的类型?
继承关系指定了如何重用代码。 有两种类型的继承关系:
IS-A:IS-A关系是通过继承实现的。即通过创建一个子类。 例如,假设Camera
是一个子类,继承自类Electronics
。 在这种情况下,我们可以说,Camera
IS-A Electronics
电子产品
HAS-A:HAS-A关系可以通过组合创建,即通过创建与另一个类对应的字段。 假设在Camera
类中,有一个名为Battery
的对象。在这种情况下,我们可以说Camera
HAS-A Battery
的对象
005. 声明实例变量的最佳实践是什么?
实例变量应始终声明为私有, 并具有公共的getter/setter
方法。 这样首先可以保护实例变量,同时在程序员的控制下进行修改。 符合封装原则。
如果将实例变量声明为 public
则违反了封装原则,带来一些潜在的安全问题。 因为public
实例变量可以在类外进行修改,因此无法控制恶意的修改,或者无心之失导致的错误修改。 如果需要从子类访问实例变量,则可以声明变量为protected
。
006. 什么是单例类,如何实现?
如果一个类在任何给定时间只允许创建一个实例
, 该类被称为Singleton
类,其实例也称为单例。 Singleton
类可以通过私有构造函数和public getter
方法实现。如下代码示例:
public class MySingleton {
private static MySingleton mySingletonInstance;
private MySingleton () {
}
public static MySingleton getInstance () {
if (mySingletonInstance == null) {
mySingletonInstance = new MySingleton (); //
create the object only if it is null
}
return mySingletonInstance;
}
public void doSomething () {
System.out.println(“I am here....”);
}
//使用单例
public static void main(String a[]) {
MySingleton mySingleton = MySingleton.getInstance();
mySingleton.doSomething();
}
}
在上面代码片段中,我们定义了一个私有构造函数和一个公共的静态getInstance()
方法。该方法检查是否存在实例。如果实例不存在,它会使用私有构造函数创建一个实例。如果存在,则返回该实例。由于MySingleton
类的构造函数是私有的,因此任何需要使用该类实例的外部类都只能够通过getInstance()
方法获取它, 而该方法确保MySingleton
类只有一个实例。
007. 下面代码编译能够通过吗?,它是使用方法重载还是重写?
class Electronics {
public void displayPrice (Float price) {
} //Line 1
}
class Camera extends Electronics {
public void displayPrice (String p