为什么下面的代码可以在不实现抽象方法的情况下调用它?
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
.
的一个实例
该程序旨在创建一个 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
.