关于Java中的private final、static修饰的方法

private final修饰的方法

示例代码:

class Car extends Vehicle {
    public static void main(String[] args) {
        new Car().run(); // 创建Car实例并调用run()方法
    }
    private final void run() {
        System.out.println("Car"); // 打印"Car"
    }
}

class Vehicle {
    private final void run() {
        System.out.println("Vehicle"); // 打印"Vehicle"
    }
}

代码分析:

  • private 方法的作用域:private修饰的方法只能在定义它们的类内部访问,不能被子类继承或覆盖。Vehicle 类中的 run() 方法是 private,因此它对 Car 类不可见,Car 类无法继承或覆盖这个方法,Car 类定义的是自己的 run() 方法,与父类无关
  • final 关键字的影响:final 方法不能被子类覆盖,子类若尝试覆盖,则无法通过编译。但由于 run() 方法在 Vehicle 和 Car 中都是 private,父类的 final 关键字在这里是多余的(因为 private 方法本身就隐含了不可覆盖性,或者说Car类的run()方法并没有对Vehicle类的run()方法进行覆盖),可以顺利通过编译。

  • 方法调用的具体过程:创建一个 Car 对象,并调用 Car 类自身的 run() 方法,因为 main 方法位于 Car 类内部,可以访问 Car 的 private 方法。因此,System.out.println("Car"); 被执行,输出字符串 "Car"。

  • 注意:Vehicle 类中的 run() 方法从未被调用,因为它对 Car 类不可见。

static修饰的方法

示例代码:

class Animal {
    public static void eat() {
        System.out.println("Animal is eating");
    }
    public void run() {
        System.out.println("Animal is running");
    }
}
class Dog extends Animal {
    public static void eat() {
        System.out.println("Dog is eating");
    }
    public void run() {
        System.out.println("Dog is running");
    }
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal dog = new Dog();
        animal.run();
        dog.run();
        animal.eat();
        dog.eat();
    }
}

代码分析:

  • 输出为:
    Animal is running
    Dog is running
    Animal is eating
    Animal is eating
  • 原因:eat()是静态方法,属于类,而不是对象。静态方法在编译时绑定,调用基于编译类型,而不是运行类型。静态方法不支持多态,子类可以定义同名静态方法,但这只是“隐藏”父类方法,而不是覆盖(override)。因此dog.eat()调用的是Animal.eat(),而不是Dog.eat()。

你可能感兴趣的:(java,开发语言)