Почему я получаю ошибку с «this», а не с «TestFilter»?
this
используется для ссылки на атрибуты экземпляра или метод (среди прочих). Экземпляр означает, что существует новый объект, и каждый объект (экземпляр) имеет копию данного атрибута.
class name
(в вашем случае TestFilter
) используется для ссылки на "классовые" атрибуты или методы (те, кому не требуется экземпляр для существования.
Итак, в первой строке вы объявляете filterFiles
атрибутом класса (для этого вам не нужен экземпляр.
См:
private static final FileFilter filterFiles;
Это означает, что вы объявляете атрибут class с именем: filterFiles
типа FileFilter
, который равен private
и чья ссылка не может быть изменена (потому что это final
).
Поскольку это атрибут class , вы можете получить к нему доступ с помощью метода main
(который является методом уровня класса). Это оба будут работать:
for(File f : file.listFiles(TestFilter.filterFiles)){
и
for(File f : file.listFiles(filterFiles)){
Но
for(File f : file.listFiles(this.filterFiles)){
Не будет, потому что this
относится к текущему экземпляру, но, поскольку вы находитесь в методе уровня класса (main), экземпляра нет, поэтому нет this
или в словах компилятора: нестатическая переменная, на которую нельзя ссылаться из статического контекста
Атрибуты экземпляра уникальны для каждого экземпляра. Атрибут уровня класса уникален для каждого класса.
Рассмотрим следующий класс:
import static java.lang.System.out;
class Employee {
// class level counter. It exist regardless of the instances created.
public static int employeeCount = 0;
// instance attribute. Each one is different from others instances
private String employeeName;
// Class level method, can be invoked without instance.
public static Employee createEmployee( String withName ) {
Employee e = new Employee();
// Set the name to the instance
e.employeeName = withName;
// Increments the class counter
Employee.employeeCount++;
return e;
}
// Object constructor.
public Employee() {
out.println("Constructor invoked!!! A new object has born, yeah!");
}
// Instance method "toString()"
public String toString() {
// Uses "this" to refer instance level method
return this.emploeeName;
}
// Test
public static void main( String [] args ) {
// The counter already exist
out.printf("Employees created %d%n", Employee.employeeCount );
// Create employee a
Employee a = Employee.createEmployee("Oscar");
// Its name now exists
out.printf("Employee name: %s %nEmployees created %d%n",
a.employeeName, Employee.employeeCount );
// Create employee b with a new name
Employee b = Employee.createEmployee("HH");
out.printf("Employee name: %s %nEmployees created %d%n",
b.employeeName, Employee.employeeCount );
// Now both employees exist, each one with a name
out.printf("a=%s, b=%s%n, a, b );// invoke toString method which in turn uses "this"
}
}
Надеюсь, этот пример прояснит все.