정적 방식이 하나의 방법으로 간주되는 이유는 무엇입니까?
나는 코스의 코드에 대한 설명을 쓰고 있는데, 실수로 그 단어를 사용하고 있다.method
그리고.function
서로 교환할 수 있습니다.나는 다시 돌아가서 문구를 고치기로 결심했지만, 이해에 구멍이 났다.
제가 알기로는 서브루틴은function
그것이 클래스의 인스턴스에 작용하지 않는 경우(그 효과는 명시적인 입력/출력으로 제한됨), 그리고,method
클래스의 인스턴스에서 동작하는 경우(불순한 인스턴스에서 부작용을 일으킬 수 있음).
그 주제에 대해 좋은 논의가 있다.승인된 답변의 정의에 따라 스태틱은method
인스턴스는 암묵적으로 전달되지 않으며 인스턴스의 멤버에 액세스할 수 없기 때문에 실제로는 함수여야 합니다.
하지만 이건 정신이야, 정적이면 안 되지?methods
정말 기능일까요?
정의상 이들은 클래스의 특정 인스턴스에 대해 행동하는 것이 아니라 관계 때문에 클래스에 "연결"되어 있을 뿐입니다.스태틱 서브루틴을 「메서드」라고 하는 보기 좋은 사이트를 몇개 본 적이 있습니다(Oracle, Fredosaurus, ProgrammingSimplified).그래서 모두 용어를 간과하고 있거나, 뭔가 놓치고 있는 것 같습니다(제 추측으로는 후자).
올바른 표현을 사용하고 있는지 확인하고 싶습니다.
누가 좀 정리해줄래?
이 8.4.3.2의 견적은 다음과 같습니다.
선언된 메서드
static
클래스 메서드라고 불립니다.선언되지 않은 메서드
static
는 인스턴스 메서드 [...]라고 불립니다.
- 클래스 메서드: 클래스에 관련지어져 있습니다.
- 인스턴스 메서드: 인스턴스와 관련되어 있습니다.
Java는 단지 "객체 지향적 사고"를 원합니다.또한 정적 방법은 상태를 포함할 수 있는 주변 범위에 액세스할 수 있습니다.어떤 면에서는 수업 자체가 물건과 같다.
간단한 답은 Java가 모든 것을 "방법"이라고 부르기로 결정했을 때 이론 컴퓨터 과학에서 함수와 방법의 구분에 신경 쓰지 않았다는 것입니다.
정적 방법은 정확히 함수는 아닙니다. 차이는 미묘하지만 중요합니다.
주어진 입력 파라미터만을 사용하는 정적 방법은 본질적으로 함수입니다.
그러나 정적 메서드는 정적 변수와 다른 정적 함수(또한 정적 변수 사용)에 액세스할 수 있기 때문에 정적 메서드는 정의상 상태 비저장 함수와는 근본적으로 다른 상태를 가질 수 있습니다. (부록: 프로그래머는 종종 "함수"를 정의로 사용하는 것은 그렇게 엄격하지 않지만 컴퓨터 과학에서는 엄격한 함수입니다.액세스 전용 입력 파라미터).따라서 정적 필드에 액세스하는 이 경우를 정의하는 것은 정적 메서드가 항상 함수라고 할 수 없습니다.
"static method"의 사용을 정당화하는 또 다른 차이점은 글로벌 함수 및 글로벌 변수를 C에서 정의할 수 있다는 것입니다.정적 메서드를 포함하는 클래스에 액세스할 수 없는 경우 메서드에도 액세스할 수 없습니다.따라서 "정적 방식"은 글로벌 기능과 달리 설계상 범위가 제한됩니다.
Java에서 사용자 정의 클래스는 실제로 java.lang의 하위 클래스의 인스턴스입니다.학급.
이러한 의미에서 정적 메서드는 개념 클래스의 인스턴스에 부가됩니다.즉, java.lang의 서브 클래스의 인스턴스에 부가됩니다.학급.
이를 염두에 두고 "class method"(Java의 정적 메서드의 대체 이름)라는 용어가 이해하기 시작합니다.클래스 메서드라는 용어는 다음과 같은 여러 곳에서 찾을 수 있습니다.목표 C, Smalltalk 및 JLS - 몇 가지 예를 들어 보겠습니다.
컴퓨터 과학에서 함수는 분명히 정적 방법에 매핑됩니다.단, 클래스의 "method"는 "member"(필드 멤버, 메서드 멤버)와 같이 일반적입니다.다음과 같은 말이 있다
데이터 멤버와 메서드멤버에는 .x 와 .x() 의 2개의 독립된 이름공간이 있습니다.
그 이유는 루트비히 비트겐슈타인 철학자의 말처럼 언어는 다른 맥락의 도구이기 때문입니다.위의 인용문에 "Method"는 "Member"를 분류하기 위한 좋은 별칭입니다.
네 생각이 옳고 말이 돼.Java 커뮤니티에서 확립된 용어가 아닙니다.이 용어가 왜 존속하는지 이해하는 데 도움이 될 수 있는 몇 가지 내부 정보를 설명하겠습니다.
Java는 클래스 기반 객체 지향 언어입니다.메서드는 항상 클래스 또는 인스턴스의 멤버입니다(이것은 다른 프로그래밍 언어에도 유효한 일반적인 문장입니다).우리는 클래스와 인스턴스가 모두 객체라고 생각한다.
인스턴스 방식(동적)
클래스에서 이 메서드를 직접 호출할 수 없습니다.인스턴스를생성해야합니다.각 인스턴스는 이 메서드를 참조합니다.메서드 정의를 완전히 동일한 메서드 시그니처로 덮어쓸 수 있습니다(서브 분류 시). 즉, 참조 포인트는 다른 메서드(서명은 같지만 메서드 본문이 다를 수 있습니다).방식은 동적입니다.
클래스 방식(정적)
이 메서드는 클래스에서 직접 호출만 할 수 있습니다. 즉, 해당 클래스의 인스턴스를 만들 필요가 없습니다.전체 프로그램에서 이 방법의 글로벌 정의는 하나뿐입니다.전체 프로그램에 유효한 정의는 하나뿐이므로 메서드가 정적인 것으로 선언된 경우 동일한 메서드 시그니처를 덮어쓸 수 없습니다.메서드는 클래스 오브젝트 자체의 멤버이며 인스턴스는 모두 해당 메서드에 대한 동일한 고유(및 수정) 참조를 가집니다.
다음으로 Scala를 니모닉으로 사용하는 용어를 나타냅니다.
스칼라에는object
은 암묵적으로 정의된 클래스1의 싱글톤 인스턴스입니다
정의대로라면, 이러한 서브루틴을, 에 속하는 서브루틴이라고 부를 수 있는 서브루틴은object
메서드(클래스의 단일 인스턴스에서 동작하기 때문에).
또한 오브젝트는 클래스 A를 정의하고 오브젝트 A의 모든 메서드를 클래스 A의 스태틱메서드로 만듭니다(Java와의 인터페이스용).[ 2 ]
따라서 Java 클래스A의 스태틱메서드는 Scala 싱글톤인스턴스와 같은 멤버에 액세스 하고 있다고 할 수 있습니다.이러한 멤버는 정의대로 클래스A의 (스태틱) 메서드라고 불릴 수 있습니다.
물론 주요 차이점은 메서드는 메서드 파라미터뿐만 아니라 정적 필드를 사용할 수 있다는 것입니다.하지만 하나 더 있어요, 다형성!Class A.do The Same Static Method() 및 Class B.do The Same Static Mehod() 평가 결과는 클래스에 따라 달라집니다.이 경우 기능이 비활성화됩니다.
각 클래스에는 서브클래스의 인스턴스인 오브젝트가 있습니다.Class
class. static 메서드는 클래스의 서브클래스의 인스턴스인 이들 오브젝트의 인스턴스 메서드입니다.스태틱 필드의 형태로 스테이트에 액세스 할 수 있기 때문에, 단순한(스테이트리스) 기능에만 한정되는 것은 아닙니다.그것들은 방법들이다.
언급URL : https://stackoverflow.com/questions/30402169/why-is-a-static-method-considered-a-method
'programing' 카테고리의 다른 글
python pander에서 data Frame을 두 개 이상의 열로 정렬하는 방법은 무엇입니까? (0) | 2022.09.21 |
---|---|
regex.test V.S string.match를 실행하여 문자열이 정규 표현과 일치하는지 확인합니다. (0) | 2022.09.21 |
SQL 예약어를 테이블 이름으로 사용하는 방법 (0) | 2022.09.21 |
PHP에서 숫자를 월 이름으로 변환 (0) | 2022.09.21 |
node.js를 사용하여 원하는 ID를 생성하는 방법 (0) | 2022.09.21 |