source

Java에서 정적 메서드를 덮어쓰고 오버로드할 수 있습니까?

bestscript 2022. 10. 22. 09:31

Java에서 정적 메서드를 덮어쓰고 오버로드할 수 있습니까?

알고 싶습니다.

  1. Java에서 정적 메서드를 재정의할 수 없는 이유는 무엇입니까?
  2. Java에서 정적 메서드가 오버로드될 수 있습니까?

정적 메서드는 정확한 의미에서 재정의할 수 없지만 상위 정적 메서드를 숨길 수 있습니다.

실제로 컴파일러는 오버라이드된 인스턴스 메서드에서처럼 실행이 아닌 컴파일 시 실행할 메서드를 결정합니다.

깔끔한 예를 들자면 여기를 보세요.

인스턴스 메서드를 덮어쓰는 과 클래스(스태틱) 메서드를 숨기는 것의 차이를 설명하는 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);

정적 부모 클래스 메서드는 하위 클래스에 속하지 않으므로(접근 가능하지만), 재정의할 필요가 없습니다.서브클래스에 다른 스태틱메서드를 추가해도 이 서브클래스의 스태틱메서드는 부모클래스의 스태틱메서드와는 다르며 고유합니다.

정적 메서드는 개체 상태에 속하지 않으므로 재정의할 수 없습니다.오히려 클래스에 속합니다(즉, 클래스 메서드입니다).정적(및 최종) 메서드를 오버로드해도 괜찮습니다.

오버로드는 스태틱바인딩이라고도 합니다.따라서 static이라는 단어를 사용하는 즉시 스태틱 메서드는 런타임 다형성을 나타낼 수 없습니다.

스태틱 메서드는 덮어쓸없지만 슈퍼클래스와 그 서브클래스에 동일한 스태틱메서드의 다른 구현은 유효합니다.파생 클래스는 기본 클래스의 구현을 숨깁니다.

스태틱 메서드의 경우 메서드콜은 참조 유형에 따라 달라지며 참조되는 객체의 종류에 따라 달라집니다.즉, 스태틱메서드는 클래스에만 속하며 인스턴스는 속하지 않으므로 메서드콜은 컴파일 시 자체에서 결정됩니다.

반면 메서드 오버로드의 경우 파라미터의 수 또는 유형이 다르면 스태틱메서드오버로드될 수 있습니다.두 메서드의 이름과 파라미터 목록이 같을 경우 'static' 키워드만 사용하여 다른 메서드를 정의할 수 없습니다.

서브클래스 이름 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 컴파일러는 객체가 생성될 때까지 기다릴 필요가 없기 때문에 정적 메서드를 호출하기 위해 ClassName과 같은 구문을 사용합니다.메서드();

메서드 오버로드의 경우 메서드는 오버로드와 같은 클래스에 있어야 합니다.스태틱으로 선언되어도 다음과 같이 오버로드될 수 있습니다.

   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);
   }
}

그러나 메서드 오버라이드의 경우 슈퍼클래스의 메서드와 서브클래스의 메서드가 다른 메서드로 동작합니다.슈퍼클래스는 자체 복사본을 가지며 서브클래스는 자체 복사본을 가지므로 메서드 재정의 대상이 되지 않습니다.

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 
    }
}

이 예에서는 스태틱메서드를 덮어씁니다.

주의: 객체 참조를 사용하여 정적 메서드를 호출하면 객체 클래스의 정적 메서드가 아니라 참조 유형(클래스) 정적 메서드가 호출됩니다.

스태틱 메서드는 클래스에만 속합니다.

static는 「」입니다.class레벨 메서드

은 숨김의 입니다.static★★★★★★★★★★★★★★★★★★.

참조: http://www.coderanch.com/how-to/java/OverridingVsHiding

static 메서드를 사용하는 목적은 클래스의 인스턴스를 만들지 않고 클래스의 메서드에 액세스하는 것입니다.이 메서드는 클래스명으로 액세스되기 때문에 덮어쓰면 의미가 없습니다.메서드()

아니요, 정적 메서드는 재정의할 수 없습니다.스태틱은 인스턴스가 아닌 클래스에 대해 해결됩니다.

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")); 
} 

이 유닛 테스트에서 놀라운 점은 없습니다.하지만 이것은 무시하지 않는다.이름 충돌이 있는 것을 선언합니다.

클래스의 인스턴스에서 static에 도달하려고 하면(좋은 프랙티스가 아님), 실제로는 다음과 같이 표시됩니다.

private Parent cp = new Child(); 
`enter code here`
assertThat(cp.getCName(), is("I am the parent")); 

cp가 하위 유형인 경우에도 개체의 실제 유형이 아닌 선언된 유형인 상위 유형을 통해 정적인 문제가 해결됩니다.비스타틱의 경우 비스타틱 방식은 부모 메서드를 덮어쓸 수 있기 때문에 이 문제는 올바르게 해결됩니다.

정적 메서드는 오버로드할 수 있지만 정적 메서드는 재정의할 수 없습니다.실제로 서브클래스로 스태틱메서드를 다시 쓸 수 있지만 오버라이드는 다형성 및 다이내믹바인딩과 관련지어야 하므로 오버라이드라고 할 수 없습니다.스태틱 메서드는 클래스에 속하므로 이러한 개념과는 관계가 없습니다.스태틱 메서드의 개서는 섀도우잉에 가깝습니다.

나는 정적 메서드 오버라이드 코드를 설계한다.쉽게 오버라이드 되는 것 같아요.정적 멤버를 재정의할 수 없는 이유를 알려주세요.여기 내 코드가 있어

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();
    }
}

실제로는 이해하기 쉽습니다.스태틱으로 마크된 모든 것은 클래스에만 속합니다.예를 들어 static 메서드는 선언된 클래스에 속하기 때문에 서브 클래스에서 상속할 수 없습니다.static 키워드를 참조해 주세요.

이 질문에 대한 최선의 대답은 다음과 같습니다.

http://www.geeksforgeeks.org/can-we-overload-or-override-static-methods-in-java/

static 메서드는 인스턴스가 아닌 클래스의 일부이므로 static 메서드를 덮어쓸 수 없습니다.

From Java에서 정적 메서드의 덮어쓰기를 허용하지 않는 이유는 무엇입니까?

재정의는 클래스의 인스턴스가 있는지 여부에 따라 달라집니다.다형성의 요점은 클래스를 서브클래스로 분류할 수 있다는 것입니다.이러한 서브클래스를 구현하는 오브젝트는 슈퍼클래스에서 정의된(및 서브클래스에서 덮어쓰기됨) 동일한 메서드에 대해 다른 동작을 합니다.스태틱 메서드는 클래스의 어떤 인스턴스에도 관련되어 있지 않기 때문에 이 개념은 적용되지 않습니다.

Java의 설계에 영향을 준 두 가지 고려사항이 있습니다.하나는 퍼포먼스에 대한 우려였다.Smalltalk가 너무 느리다는 비판(쓰레기 컬렉션과 다형성 콜도 그 일부)이 많았으며, Java의 크리에이터는 그것을 피하기로 결심했다.또 다른 하나는 Java의 대상 사용자가 C++ 개발자라는 결정이었습니다.스태틱 메서드를 사용하는 것은 C++ 프로그래머에게 친숙하다는 장점이 있으며, 어떤 메서드를 호출해야 할지 결정하기 위해 런타임까지 기다릴 필요가 없기 때문에 매우 빨랐습니다.

Java에서는 스태틱메서드를 덮어쓸 수 없습니다.JVM은 Java의 동적 바인딩을 사용하여 런타임에 개체를 기반으로 올바른 오버라이드 메서드를 해결하기 때문입니다.

단, Java의 스태틱메서드는 오브젝트가 아닌 클래스와 관련지어 컴파일 시에 해결되어 결합됩니다.

언급URL : https://stackoverflow.com/questions/2475259/can-i-override-and-overload-static-methods-in-java