2011-02-12 5 views
23

을 사용하여 액세스 할 수 있습니다. Java에서는 정적 인스턴스 메소드가 작성되어 오브젝트 인스턴스없이 액세스 할 수 있습니다. 그것은 내게 어떤 의미가 있습니다. 하지만 최근에는 Java의 정적 메소드에 객체 인스턴스를 통해 액세스 할 수 있다는 이상한 점도 발견되었습니다. 이것은 나에게 꽤 이상하게 보입니다. 누구든지이 기능이 Java에서 제공되는 이유를 알고 있습니까? 정적 메서드가 인스턴스없이 액세스되는 것을 허용하는 중요성은 무엇입니까?Java의 정적 메소드는 오브젝트 인스턴스

+1

닫기 그러나, 객체에 정적 메서드를 호출하면 해결 방법을 우리에게 제공한다 [왜-밤은 - 전화 - 어 - 정적 - 방법 - 부산물 방법 - 중 - 인스턴스 - 오류 -에 - 자바 - 공동] (http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of -an-instance-an-the-java-co) – nawfal

답변

16

이점은 인스턴스 메서드를 가져 와서 기존 코드 (클래스가 아닌)를 수정하지 않고도 정적 메서드로 바꿀 수 있으며 이전 버전과의 호환성을 허용한다는 것입니다. 이 유틸리티는 정적으로 만들 수있는 유틸리티 메소드를 여러 번 보았을 때 유용했습니다. 단지 static 수정자를 추가하고 계속 진행할 수 있습니다.

+1

나는이 관점에서 생각하지 않았다. 그렇습니다, 당신이 말했듯이 극단적 인 호환성 옵션을 제공합니다. Java가 지정된 방식을 이해하기 위해 모험심과 스릴이 있습니다. 다시 한번 감사드립니다 :) –

+0

@Nate W. 그래서 이전 버전과의 호환성은 ... u가 참조를 사용하는 메소드를 호출하면 호출 된 메소드는 정적이거나 비 정적 일 수 있습니까? 개체 참조를 사용하고 정적 메서드를 호출하기 위해 클래스 이름을 사용하는 경우 메서드가 ** synchronized ** 키워드를 갖는 경우 '개체'또는 'class.object'를 잠글 것인가? –

5

의미 상 동일합니다. 컴파일러는 클래스를 통해 정적 메서드에 액세스한다는 의미를 알기에 충분히 똑똑합니다. IDE는 나쁜 매너라고 경고합니다 :

this question for more details을보세요. 그들이 말했듯이 오해의 소지가 있기 때문에 IDE가 경고를 줄 것입니다.

2

사양에 따라 허용되지만 권장하지 않습니다. Eclipse와 같은 IDE는 경고가있는 객체 인스턴스의 정적 메소드에 대한 액세스를 표시합니다.

0

좋지 않은데도 그럴 이유가 없습니다.

o.f(); 

그래서 우리는 o의 범위에 f라는 방법을 찾아야합니다. 하나는 f 실제로

-2

또 다른 멋진 (다소 불구하고 해킹 - y는)이주는 것을 특징으로 더 큰 범위에 대한 정의 (o의 클래스) 경우에도, 또한 o의 범위에 정적 f 물론입니다 주장 할 수 당신은 본질적으로 객체의 형태로 클래스 참조를 전달할 수있는 능력입니다.

Animal a = new Dog(); 
System.out.println(a.name()); 

은 ... 당신은 얻을 것이다 :

dog 

이것이 수단

public abstract class Animal { 
    public String name() { return "animal"; } 
} 

public class Dog extends Animal { 
    public String name() { return "dog"; } 
} 

당신이 다음을 실행하면 : 그래서 당신은 다음과 같은 가지고, 예를 들어, 말 실제로는 인스턴스화 된 객체를 통해 정적 메서드를 호출하면 Java에 일급 함수의 형태가 제공됩니다. 추상 기본 클래스를 사용하여 "type"함수를 정의한 다음 하위 클래스의 정적 메서드를 재정 의하여 적절한 형식의 함수를 인스턴스화합니다. 그런 다음 해당 객체를 해당 정적 메소드의 컨테이너 일 뿐인 것처럼 사용합니다.

더 구체적으로 말하자면 문자열 배열에서 특정 문자열 인코딩을 수행하는 함수를 원한다고 가정하고 단일 문자열에 대해 인코딩을 수행하는 함수를 인수로 사용하기를 원합니다. 우리는 인코딩이 원하는 것을 기반으로 인수가 달라지기를 원합니다. 일등급 기능이 없으면 직접 할 수 없습니다.

public abstract class EncodingType { 
    public String encode(String s) { return s; } 
} 

public class Base64Encoding extends EncodingType { 
    public String encode(String s) { base64Encode(s); } // Assume "base64Encode" is defined 
} 

public class Rot13Encoding extends EncodingType { 
    public String encode(String s) { rot13Encode(s); } // Assume "rot13Encode" is defined 
} 

public class Encoder { 
    public String[] encodeArray(String[] s, EncodingType enc) { 
     for (int i = 0; i < s.length; i++) { 
      s[i] = enc.encode(s[i]); 
     } 
     return s; 
    } 
} 

당신은 이런 식으로 부를 것이다 : :

Encoder e = new Encoder(); 
String[] strs = { ... }; 
strs = e.encodeArray(strs, new Rot13Encoding()); 
+0

'static'? 아니? static이없는 정적 메소드? –

관련 문제