在Java中实现了所有四个关键的面向对象编程(OOP)原则:封装、继承、多态和抽象。
private、protected、public)以及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 {}
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”——员工不知道这些冲突必须在子类中手动解决。