Я'd, как знать:
Статические методы не могут быть переопределены в точном смысле слова, но они могут скрыть родителя статические методы
На практике это означает, что компилятор будет решать, какой способ для выполнения на время компиляции, а не во время выполнения, как это делает с переопределенными методами экземпляра.
Для аккуратной пример посмотреть здесь.
И это является Java документация, разъясняющая разницу между переопределить методы экземпляра и прячется класса (статические) методы.
переопределение: переопределение в Java просто означает, что конкретный метод будет называться основанное на перспективе время тип объекта и не на этапе компиляции типа (что в случае с переопределен статические методы)
сокрытие: родительский класс методов, которые являются статическими и не являются частью класса (хотя они доступны), так что нет вопроса перекрывая его. Даже если вы добавить еще один статический метод в подклассе, идентичен один в родительском классе, этот подкласс статический метод > есть уникальная и отличается от статического метода в родительском классе.
Статические методы не могут быть переопределены, поскольку нет ничего, чтобы переопределить, так как они будут двумя разными методами. Например
static class Class1 {
public static int Method1(){
return 0;
}
}
static class Class2 extends Class1 {
public static int Method1(){
return 1;
}
}
public static class Main {
public static void main(String[] args){
//Must explicitly chose Method1 from Class1 or Class2
Class1.Method1();
Class2.Method1();
}
}
И да, статические методы могут быть перегружены так же, как любой другой метод.
Статические методы не могут быть переопределены, поскольку они не отправлены на экземпляр объекта во время выполнения. Компилятор решает, какой метод вызывается.
Именно поэтому вы получите предупреждение компилятора, когда вы пишете
MyClass myObject = new MyClass();
myObject.myStaticMethod();
// should be written as
MyClass.myStaticMethod()
// because it is not dispatched on myObject
myObject = new MySubClass();
myObject.myStaticMethod();
// still calls the static method in MyClass, NOT in MySubClass
Статические методы могут быть перегружены (это означает, что вы можете иметь то же самое имя метода для нескольких методов, если они имеют разные типы параметров).
Integer.parseInt("10");
Integer.parseInt("AA", 16);
Методов родительского класса, которые являются статическими и не являются частью класса (хотя они доступны), так что тут вопрос не отвергая его. Даже если вы добавить еще один статический метод в подклассе, идентичной той, что в его родительском классе, этот подкласс статический метод уникален и отличен от статического метода в родительском классе.
Статические методы не могут быть переопределены, поскольку они не являются частью объекта'ы государства. Скорее, они принадлежат к классу (я.е они являются методами класса). Это нормально для перегрузки статические (и окончательной) методов.
Если я звоню метод с помощью MysubClass наименование подкласса подкласс потом дисплей метод это означает, что статический метод может быть переопределен или нет
class MyClass {
static void myStaticMethod() {
System.out.println("Im in sta1");
}
}
class MySubClass extends MyClass {
static void myStaticMethod() {
System.out.println("Im in sta123");
}
}
public class My {
public static void main(String arg[]) {
MyClass myObject = new MyClass();
myObject.myStaticMethod();
// should be written as
MyClass.myStaticMethod();
// calling from subclass name
MySubClass.myStaticMethod();
myObject = new MySubClass();
myObject.myStaticMethod();
// still calls the static method in MyClass, NOT in MySubClass
}
}
Статические методы-это метод один, копия которого являются общими для всех объектов класса . Статический метод принадлежит классу, а не объектам .поскольку статические методы не зависят от объектов , компилятор Java не нужно ждать до создания объектов .поэтому, чтобы вызвать статический метод, мы использует синтаксис как класса.метод() ;
В случае перегрузки методов , методы должны быть в одном классе перегружать .даже если они объявлены как static есть возможность перегрузить их ,
Class Sample
{
static int calculate(int a,int b,int c)
{
int res = a+b+c;
return res;
}
static int calculate(int a,int b)
{
int res = a*b;
return res;
}
}
class Test
{
public static void main(String []args)
{
int res = Sample.calculate(10,20,30);
}
}
Но в случае переопределения метода , метод в супер классе и метод в подклассе, как и другой метод . супер класс будет иметь свою собственную копию и суб-класс будет иметь свою собственную копию, чтобы он не попал под переопределения метода .
Перегрузка также называют статическое связывание, так как только слова static используется это означает статический метод не может показать время выполнения полиморфизм.
Мы не можем переопределить статический метод но наличие различных реализаций одного и того же статический метод супер класса и его подклассов является допустимым. Его просто, что производный класс будет скрывать реализации базового класса.
Для статических методов, вызов метода зависит от типа ссылки, а не каком объекте идет речь, т. е. статический метод принадлежит классу, а не к его экземплярам , так что вызов метода определяется на этапе компиляции.
Тогда как в случае метода перегрузки статические методы могут быть перегружены МФФ они имеют ряд различий или типы параметров. Если два метода имеют одинаковые имена и тем же списком параметров, то они не могут быть определены различные только с помощью 'статический' сайта.
Нет,статические методы могут'т быть overriden, так как он является частью класса, а не объекта. Но можно перегрузить статический метод.
статические
методы класс
методы уровня.
Скрывается понятие используется для "статических" методов.
См.: http://www.coderanch.com/how-to/java/OverridingVsHiding
Из Почему'т Java позволяет переопределить статические методы?
переопределение зависит от наличия экземпляра класса. Смысл полиморфизма заключается в том, что вы можете создать подкласс класса и объекты реализации этих подклассов будет различное поведение по той же методы, определенные в суперклассе (и переопределяется в подклассах). Статический метод не связан с какой-либо экземпляр класса, понятие не применимо.
есть два соображения вождения Ява's дизайн, что повлияло на это. Один был проблемой с производительностью: было много критики разговоры о том, что это слишком медленно (сбор мусора и полиморфных вызовов частью) и Java'ы создателями были определены, чтобы избежать этого. Еще было решение, что целевая аудитория для Java был разработчиков C++. Делая статические методы работают так, как они есть благо знакомство для C++ программистов, а также были очень быстро, потому что там's нет необходимости ждать, пока во время выполнения, чтобы выяснить, какой метод для вызова.
class SuperType {
public static void classMethod(){
System.out.println("Super type class method");
}
public void instancemethod(){
System.out.println("Super Type instance method");
}
}
public class SubType extends SuperType{
public static void classMethod(){
System.out.println("Sub type class method");
}
public void instancemethod(){
System.out.println("Sub Type instance method");
}
public static void main(String args[]){
SubType s=new SubType();
SuperType su=s;
SuperType.classMethod();// Prints.....Super type class method
su.classMethod(); //Prints.....Super type class method
SubType.classMethod(); //Prints.....Sub type class method
}
}
В этом примере для статического метода, переопределяющего
Примечание: если мы вызываем статический метод со ссылкой на объект, то ссылочный тип(класс) статический метод будет называться, а не объект статический метод класса.
Статический метод принадлежит классу.
Это на самом деле довольно проста, чтобы понять – все, что обозначено статическое относится только к классу, к примеру статический метод не может быть унаследован в открытый класс, потому что они принадлежат к классу, в котором они были объявлены. Обратитесь статического сайта.
Лучший ответ я нашел на этот вопрос:
Нет, вы не можете переопределить статический метод. Статический решает против класса, а не экземпляра.
public class Parent {
public static String getCName() {
return "I am the parent";
}
}
public class Child extends Parent {
public static String getCName() {
return "I am the child";
}
}
Каждый класс имеет статический метод getCName(). Когда вы называете имя класса он ведет себя так, как вы ожидаете, и каждый возвращает ожидаемое значение.
@Test
public void testGetCNameOnClass() {
assertThat(Parent.getCName(), is("I am the parent"));
assertThat(Child.getCName(), is("I am the child"));
}
Никаких сюрпризов в этом тесте. Но это не переопределение.В этом объявлении то, что есть конфликт имен.
Если мы пытаемся достичь статического экземпляра класса (не рекомендуется), то это действительно показывает:
private Parent cp = new Child();
`enter code here`
assertThat(cp.getCName(), is("I am the parent"));
Хотя СР-это ребенок, статический разрешается посредством объявленного типа, родителя, а не фактическим типом объекта. Для не статика, это правильно решены, потому что нестатический метод можно переопределить метод родительского.
Сама цель, используя статический способ получить доступ к методу класса без создания экземпляра на нее.Он будет иметь никакого смысла, если мы переопределить этот метод, так как они будут получать доступ имя_класса.способ()
Можно перегрузить статический метод, но вы можете'т переопределить статический метод. На самом деле можно переписать статического метода в подклассах, но это не называется переопределение, потому что переопределение должно быть связано с полиморфизмом и динамическим связыванием. Статический метод принадлежит классу, поэтому не имеет ничего общего с этими понятиями. Переписывать статический метод-это больше похоже на слежку.
Я проектирую код статический метод переопределения.Я думаю, что это легко переопределить.Пожалуйста, очистите меня, как можете переопределить статические члены.Вот мой код-
class Class1 {
public static int Method1(){
System.out.println("true");
return 0;
}
}
class Class2 extends Class1 {
public static int Method1(){
System.out.println("false");
return 1;
}
}
public class Mai {
public static void main(String[] args){
Class2 c=new Class2();
//Must explicitly chose Method1 from Class1 or Class2
//Class1.Method1();
c.Method1();
}
}