Java嵌套类

嵌套类(Nested Classes)

  1. 静态嵌套类(Static Nested Classes)

    • 这种类被定义为外部类的静态成员。它可以访问外部类的静态成员,但不能访问外部类的实例成员。
    • 语法:
      public class OuterClass {
          private static int staticField = 10;
      
          static class StaticNestedClass {
              void display() {
                  System.out.println("Static field: " + staticField);
              }
          }
      }
      
  2. 内部类(Non-static Nested Classes)

    • 内部类是属于外部类的实例的一部分,它可以访问外部类的所有成员,包括私有成员。
    • 语法:
      public class OuterClass {
          private int instanceField = 10;
      
          class InnerClass {
              void display() {
                  System.out.println("Instance field: " + instanceField);
              }
          }
      }
      
  3. 局部类(Local Classes)

    • 局部类是定义在方法、构造函数或代码块内部的类。这些类只能在其定义的块中使用。
    • 语法:
      public class OuterClass {
          void someMethod() {
              class LocalClass {
                  void display() {
                      System.out.println("Inside local class");
                  }
              }
              LocalClass local = new LocalClass();
              local.display();
          }
      }
      
  4. 匿名类(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 和一个子类 DogDog 重写了 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 注解的作用

  1. 编译时检查

    • @Override 注解帮助编译器检查子类的方法是否正确重写了父类的方法。如果方法签名不匹配,编译器将提示错误,帮助开发者快速发现和修复错误。
  2. 代码可读性

    • 使用 @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 注解会导致编译错误。

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值