为什么下面的代码可以在不实现抽象方法的情况下调用它?

Why is the following code able to call an abstract method without implementing it?

该程序旨在创建一个 GUI 组件,显示总数量 space、可用数量 space 和可用总数量 space 的百分比:

package com.java24hours;

import java.io.IOException;
import java.nio.file.*;
import javax.swing.*;

public class FreeSpacePanel extends JPanel {
    JLabel spaceLabel = new JLabel("Disk space: ");
    JLabel space = new JLabel();

    public FreeSpacePanel() {
        super();
        add(spaceLabel);
        add(space);
        try {
            setValue();
        } catch (IOException ioe) {
            space.setText("Error");
        }
    }

    private final void setValue() throws IOException {
        // get the current file storage pool
        Path current = Paths.get("");
        FileStore store = Files.getFileStore(current);
        // find the free storage space
        long totalSpace = store.getTotalSpace();
        long freeSpace = store.getUsableSpace();
        // get this as a percentage (with two digits)
        double percent = (double)freeSpace / (double)totalSpace * 100;
        percent = (int)(percent * 100) / (double)100;
        // set the label's text
        space.setText(freeSpace + " free out of " + totalSpace + " ("
            + percent + "%)");
    }
}

您可以看到创建了一个名为 'store' 的 FileStore 对象,然后在下面的行中直接调用了 FileStore 方法 getTotalSpace()getUseableSpace() 而没有实现。但是,FileStore class 将这些方法声明为抽象的,这怎么可能?

Files.getFileStore returns FileStore 的某些 non-abstract 子 class 的实例,实现了所需的方法。

要查看 class 是什么,请执行以下操作:

System.out.println(store.getClass());

在我的 Linux 系统上,我看到该对象是 class sun.nio.fs.LinuxFileStore.

的一个实例