Java面试问题-面向对象
Q1。什么是多态?
多态被简要描述为“一个接口,许多实现”。多态性是能够在不同上下文中为某事物赋予不同含义或用法的一种特征-具体来说,就是允许诸如变量,函数或对象之类的实体具有多种形式。多态有两种类型:
- 编译时多态
- 运行时多态
编译时多态是方法重载,而运行时多态是使用继承和接口完成的。
Q2。什么是运行时多态或动态方法分派?
在Java中,运行时多态性或动态方法分派是一个在运行时而不是在编译时解决对覆盖方法的调用的过程。在此过程中,将通过超类的引用变量调用重写的方法。让我们看下面的示例,以更好地理解它。
class Car {
void run() {
System.out.println( & ldquo; car is running & rdquo;);
}
}
class Audi extends Car {
void run() {
System.out.prinltn( & ldquo; Audi is running safely with 100 km & rdquo;);
}
public static void main(String args[]) {
Car b = new Audi(); //upcasting
b.run();
}
}
Q3。Java中的抽象是什么?
抽象是指处理思想而不是事件的质量。它主要处理隐藏细节并向用户显示基本内容。因此,您可以说Java中的抽象是向用户隐藏实现细节并仅向用户显示功能的过程。可以通过两种方式实现抽象:
- 抽象类(可以实现0-100%的抽象)
- 接口(可以实现100%的抽象)
Q4。Java接口是什么意思?
Java中的接口是类的蓝图,或者可以说它是抽象方法和静态常量的集合。在接口中,每个方法都是公共的和抽象的,但不包含任何构造函数。因此,接口基本上是一组带有空主体的相关方法。例:
public interface Animal {
public void eat();
public void sleep();
public void run();
}
Q5。抽象类和接口有什么区别?
Q6。Java中的继承是什么?
Java中的继承是一个类的属性可以被另一类继承的概念。它有助于重用代码并在不同类之间建立关系。在两种类型的类之间执行继承:
- 超级类(超级类或基础类)
- 子类(子类或派生类)
继承属性的类称为“子类”,而继承属性的类称为“父类”。
Q7。Java中继承有哪些不同类型?
Java支持四种继承类型:
- 单继承:在单继承中,一个类继承另一个属性,即将只有一个父类和一个子类。
- 多级继承:当一个类派生自一个类,而该类又派生自另一个类,即一个类有多个父类但处于不同级别时,这种继承类型称为多级继承。
- 分层继承:当一个类具有多个子类(子类),或者换句话说,一个以上的子类具有相同的父类时,则这种继承称为分层。
- 混合继承:混合继承是两种或多种继承的组合。
Q8。什么是方法重载和方法重载?
方法重载:
- 在“方法重载”中,相同类的方法共享相同的名称,但是每个方法必须具有不同数量的参数或具有不同类型和顺序的参数。
- 方法重载是为该方法的行为“增加”或“扩展”更多。
- 它是编译时的多态性。
- 这些方法必须具有不同的签名。
- 它在方法重载中可能需要继承,也可能不需要。
让我们看下面的示例,以更好地理解它。
class Adder {
Static int add(int a, int b) {
return a + b;
}
Static double add(double a, double b) {
return a + b;
}
public static void main(String args[]) {
System.out.println(Adder.add(11, 11));
System.out.println(Adder.add(12.3, 12.6));
}
}
方法覆盖:
- 在“方法重写”中,子类具有与父类相同的名称,名称和类型,参数和返回类型的方法。
- 方法覆盖是“改变”方法的现有行为。
- 它是运行时多态性。
- 这些方法必须具有相同的签名。
- 它始终需要在“方法覆盖”中进行继承。
让我们看下面的示例,以更好地理解它。
class Car {
void run() {
System.out.println("car is running");
}
}
class Audi extends Car {
void run() {
System.out.prinltn("Audi is running safely with 100km");
}
public static void main(String args[]) {
Car b = new Audi();
b.run();
}
}
Q9。您可以覆盖Java中的私有或静态方法吗?
您不能在Java中覆盖私有或静态方法。如果您在子类中创建具有相同返回类型和相同方法参数的类似方法,则它将隐藏超类方法;否则,它将隐藏超类方法。这称为方法隐藏。同样,您不能覆盖子类中的私有方法,因为在那里无法访问它。您可以做的是在子类中创建另一个具有相同名称的私有方法。让我们看下面的示例,以更好地理解它。
class Base {
private static void display() {
System.out.println("Static or class method from Base");
}
public void print() {
System.out.println("Non-static or instance method from Base");
}
class Derived extends Base {
private static void display() {
System.out.println("Static or class method from Derived");
}
public void print() {
System.out.println("Non-static or instance method from Derived");
}
public class test {
public static void main(String args[]) {
Base obj = new Derived();
obj1.display();
obj1.print();
}
}
}
}
Q10。什么是多重继承?Java支持吗?
如果子类从多个类继承属性,则称为多重继承。Java不允许扩展多个类。
多重继承的问题在于,如果多个父类具有相同的方法名称,则在运行时,编译器将很难从子类中决定执行哪个方法。
因此,Java不支持多重继承。该问题通常称为“钻石问题”。
Q11。 Java中的封装是什么?
封装是一种将数据(变量)和代码(方法)绑定为一个单元的机制。在这里,数据对外界是隐藏的,只能通过当前的类方法进行访问。这有助于保护数据免受任何不必要的修改。我们可以通过以下方式实现Java封装:
将一个类的变量声明为私有。
提供公共的setter和getter方法来修改和查看变量的值。
Q12。什么是关联?
关联是所有对象都有其自己的生命周期且没有所有者的关系。让我们以老师和学生为例。多个学生可以与一个老师联系,一个学生可以与多个老师联系,但是对象之间没有所有权,并且两者都有自己的生命周期。这些关系可以是一对一,一对多,多对一和多对多。
Q13。集合是什么意思?
集合是关联的一种特殊形式,其中所有对象都有其自己的生命周期,但是有所有权,子对象不能属于另一个父对象。让我们以部门和老师为例。一个老师不能属于多个部门,但是如果删除该部门的老师对象,则不会销毁。
Q14。Java中的成分是什么?
组合还是聚集的一种特殊形式,我们可以称其为“死亡”关系。这是强类型的聚合。子对象没有生命周期,如果删除父对象,则所有子对象也将被删除。让我们再次以房屋与房间之间的关系为例。房子可以包含多个房间,没有独立的房间生活空间,任何房间都不能属于两个不同的房子,如果我们删除房子,房间将自动删除。
Q15。什么是接口?
接口可以定义为没有数据成员和成员函数的接口。简单来说,空接口称为标记接口。Java中Marker接口的最常见示例是Serializable,Cloneable等。可以按以下方式声明marker接口。
public interface Serializable{
//do something;
}
Q16 。 Java中的对象克隆是什么?
Java中的对象克隆是创建对象的精确副本的过程。从根本上讲,这意味着可以创建状态与原始对象相似的对象。为此,Java提供了方法clone () 来利用此功能。此方法创建当前对象类的新实例,然后使用与相应字段完全相同的内容初始化其所有字段。要对象clone(),必须实现标记接口java.lang.Cloneable以避免任何运行时异常。您必须注意的一件事是Object clone()是一种受保护的方法,因此您需要重写它。
Q17。Java中的构造函数是什么?
复制构造函数是一个成员函数,用于使用同一类的另一个对象初始化一个对象。尽管在Java中不需要复制构造函数,因为所有对象都是通过引用传递的。而且,Java甚至不支持自动按值传递。
Q18。什么是Java中的构造函数重载?
在Java中,构造函数重载是一种将任意数量的构造函数添加到每个具有不同参数列表的类的技术。编译器使用列表中的参数数量及其类型来区分重载的构造函数。
class Demo {
int i;
public Demo(int a) {
i = k;
}
public Demo(int a, int b) {
//body
}
}