嵌套类(Nested Classes)
-
静态嵌套类(Static Nested Classes):
- 这种类被定义为外部类的静态成员。它可以访问外部类的静态成员,但不能访问外部类的实例成员。
- 语法:
public class OuterClass { private static int staticField = 10; static class StaticNestedClass { void display() { System.out.println("Static field: " + staticField); } } }
-
内部类(Non-static Nested Classes):
- 内部类是属于外部类的实例的一部分,它可以访问外部类的所有成员,包括私有成员。
- 语法:
public class OuterClass { private int instanceField = 10; class InnerClass { void display() { System.out.println("Instance field: " + instanceField); } } }
-
局部类(Local Classes):
- 局部类是定义在方法、构造函数或代码块内部的类。这些类只能在其定义的块中使用。
- 语法:
public class OuterClass { void someMethod() { class LocalClass { void display() { System.out.println("Inside local class"); } } LocalClass local = new LocalClass(); local.display(); } }
-
匿名类(Anonymous Classes):
- 匿名类是一种特殊的局部类,它没有名字,通常用于实现接口或继承类的实例化。
- 语法:
public class OuterClass { void createAnonymousClass() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Anonymous class running"); } }; new Thread(runnable).start(); } }
@Override
是一个 Java 注解,用于标记一个方法为重写(Override)父类中的方法。这个注解告诉编译器,当前方法应该覆盖(或重写)父类中的一个方法。如果方法签名与父类中声明的方法不匹配,编译器会生成错误提示。这有助于防止在重写方法时出现常见错误,如方法签名错误或方法名拼写错误。
使用示例
假设我们有一个父类 Animal
和一个子类 Dog
,Dog
重写了 Animal
中的 makeSound
方法:
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Dog barks");
}
}
在上面的代码中,Dog
类的 makeSound
方法使用了 @Override
注解。这表示 Dog
类中的 makeSound
方法是对 Animal
类中 makeSound
方法的重写。
@Override
注解的作用
-
编译时检查:
@Override
注解帮助编译器检查子类的方法是否正确重写了父类的方法。如果方法签名不匹配,编译器将提示错误,帮助开发者快速发现和修复错误。
-
代码可读性:
- 使用
@Override
注解可以让代码更具可读性。它明确表示某个方法是重写了父类的方法,其他开发者查看代码时会更容易理解。
- 使用
规则
- 方法签名必须匹配:被
@Override
注解的方法必须与父类中的方法具有相同的签名,包括方法名、返回类型和参数列表。 - 不能重载方法:
@Override
注解只能用于重写(即从父类继承的方法),而不能用于方法的重载(即方法名相同但参数不同)。
常见错误
-
方法签名不匹配:如果你在子类中使用
@Override
注解,但方法的签名与父类中的方法不匹配,编译器将报错。例如:class Animal { void makeSound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override void makeSound(String sound) { // 错误: 参数不同 System.out.println("Dog barks"); } }
上述代码中,
Dog
类中的makeSound
方法参数不同,因此@Override
注解会导致编译错误。