编程Java开发者

请讲述Java中使用的面向对象编程(OOP)的主要原则以及它们在实践中的实现方式?

用 Hintsage AI 助手通过面试

回答。

在Java中实现了所有四个关键的面向对象编程(OOP)原则:封装继承多态抽象

  • 封装允许隐藏类的内部实现,并仅通过方法提供对数据的访问。Java使用访问修饰符(privateprotectedpublic)以及getter/setter来实现封装。
public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
  • 继承允许通过关键字extends在现有类的基础上创建新类。这促进了代码的重用。
public class Animal {} public class Dog extends Animal {}
  • 多态体现在一个接口可以服务于多种类型。在Java中,通过方法重写和接口来实现这一点。
Animal animal = new Dog(); animal.makeSound(); // 将调用Dog中的实现
  • 抽象通过声明抽象类和接口来实现,简化复杂系统。
public interface Drawable { void draw(); }

有陷阱的问题。

如果Java中的类同时继承一个接口和一个抽象类,并且它们具有相同签名的方法,会发生什么?继承的类将展示什么行为?

回答: 如果抽象类和接口都定义了相同签名的方法,那么只需在派生类中实现该方法一次。但是如果抽象类实现了该方法,则Java将使用其实现。接口的默认方法仅在需要时被重写。

interface A { default void foo() { System.out.println("A"); }} abstract class B { void foo() { System.out.println("B"); }} class C extends B implements A {} // new C().foo() 将输出"B"

由于对该主题细微差别的不了解而导致的真实错误示例。


故事

在一个银行的项目中,开发人员使所有字段都为public并直接访问它们。这导致对象状态的不可控改变和错误的难以追踪。最终不得不重写所有代码,改为使用private字段和访问方法。


故事

一位新员工试图重写基类的private方法,认为这支持多态。然而,实际上在子类中创建了一个新方法,基类中的调用会调用原始版本,导致意外的行为。


故事

从多个来源使用带有默认方法的接口导致错误“class X inherits unrelated defaults for Y() from types A and B”——员工不知道这些冲突必须在子类中手动解决。