Наследование методов класса - PullRequest
3 голосов
/ 15 июня 2010

Мне сказали, что статические методы в java не имеют наследования, но когда я пытаюсь выполнить следующий тест

package test1;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        TB.ttt();
        TB.ttt2();
    }

}

package test1;

public class TA {
static public Boolean ttt()
{
    System.out.println("TestInheritenceA");
    return true;
}
static public String test ="ClassA";
}

package test1;

public class TB extends TA{
static public void ttt2(){
    System.out.println(test);
    }
}

напечатано:

TestInheritenceA ClassA

поэтому статические методы (и поля) Java имеют наследование (если вы пытаетесь вызвать метод класса, он идет по цепочке наследования в поисках методов класса). Это когда-либо было не так? И есть ли какие-либо языки наследования ОО, которые так запутаны для методов класса?


Так что, очевидно, статические методы наследуются, но не могут быть переопределены, так ли c # разделяет эту проблему? Есть ли другие языки?

Ответы [ 3 ]

5 голосов
/ 15 июня 2010

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

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

3 голосов
/ 15 июня 2010

Это всегда было так, но вы не можете переопределить методы класса:

class A {
  public static void a() { system.out.println("A"); }
}

class B {
  public static void a() { system.out.println("B"); }
}

A a = new A();
a.a(); // "A"

B b = new B();
b.a() // "B"

a = b;
a.a(); // "A"
0 голосов
/ 15 июня 2010

В этом смысл статики.Это значит для каждого класса.Статические поля и методы распределяются между экземплярами.Если вы изменяете статическое значение, оно отражается между экземплярами.

...