Концепция наследования - PullRequest
       22

Концепция наследования

0 голосов
/ 17 декабря 2009

В концепции наследования у меня есть статический метод в суперклассе, и я наследую этот класс одному подклассу. В этом случае статический метод наследуется подклассом или нет?

Ответы [ 7 ]

8 голосов
/ 17 декабря 2009

Помните, что статические методы не являются методами экземпляра - они относятся к классу, а не к экземпляру. Поскольку можно считать, что производный класс имеет базовый тип, доступ к статическому методу можно получить через производный тип.

Дано:

class A {
    public static void foo(){}
}

class B extends A {
}

Тогда:

B.foo(); // this is valid
2 голосов
/ 17 декабря 2009

Он наследуется в том смысле, что к нему можно обращаться как к статическому методу любого подкласса

Почему ты сам не попробовал?

  1. Создать class A с staticMethod()
  2. Создать class B extends A
  3. Попробуйте вызвать статический метод с помощью B.staticMethod()
2 голосов
/ 17 декабря 2009

Подождите, я исправлен - статические методы унаследованы. Вроде, как бы, что-то вроде. Тем не менее, они не действуют как настоящее наследство ОО. Например, с этими классами:

public class Parent {
   public static void printIt() {
       System.out.println("I'm Parent!");
   }
}

public class Child extends Parent {
    public static void printIt() {
        System.out.println("I'm Child!");
    }
    public static void main(String[] args) {
        Parent child1 = new Child(); 
        Child child2 = new Child();
        child1.printIt();
        child2.printIt();
    }
}

Если вы позвоните child1.printIt(), он будет использовать Parent.printIt(), потому что child1 приведен к классу Parent. Однако, если вы позвоните child2.printIt(), он будет использовать Child.printIt(), потому что он брошен на ребенка. Так что это не совсем истинное наследование, потому что переопределение не прилипнет, если вы приведете к супертипу. Таким образом, это не настоящий полиморфизм.

1 голос
/ 17 декабря 2009

Если метод является общедоступным статическим или защищенным статическим в суперклассе, он будет доступен в подклассе. Так что в этом смысле это наследуется. Код ниже будет скомпилирован и работает нормально.

public class A {
   public static String foo() {
     return "hello world";
   }
}

public class B extends A {
   public void bar() {
      System.out.println(foo());
   }
}

Однако это неправильное использование термина «унаследованный», так как он не привязан к конкретному случаю - отсюда и ответ Калеба. Обычный дизайн ОО не рассматривает статические методы как унаследованные, и это становится очень запутанным, особенно когда вы начинаете говорить о переопределении их.

0 голосов
/ 22 декабря 2009

Еще одна (продвинутая) концепция, о которой вам, вероятно, следует позаботиться, это концепция "позднего статического связывания" - переопределения статических функций в дочерних классах. Вот вопрос по этому вопросу из мира PHP, но он применим по всем направлениям: Когда вам нужно использовать позднюю статическую привязку?

0 голосов
/ 17 декабря 2009

Да, вы можете наследовать статические методы. Но если у вашего статического метода есть модификатор приватного доступа, вы не можете его унаследовать

0 голосов
/ 17 декабря 2009

Родительский статический метод будет доступен в подклассе, но не может быть переопределен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...