>  기사  >  Java  >  Java 수정자 abstract, static 및 final 간의 차이점에 대한 자세한 설명

Java 수정자 abstract, static 및 final 간의 차이점에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-01-24 15:42:101513검색

정적은 속성, 메서드 및 코드 블록을 수정할 수 있는 정적을 의미합니다.

1.static은 속성(클래스 변수)을 수정한 다음 클래스 이름을 사용하여 이 속성에 액세스할 수 있습니다.속성 이름은 이 속성이 이 클래스의 클래스 변수가 되고 이 클래스의 객체에서 공유된다는 것을 의미합니다. 수업. 이 속성은 모든 클래스에 공개됩니다. (공유 클래스 변수는 객체와 아무 관련이 없으며 클래스만 관련됩니다.)

클래스 로딩 과정에서 클래스 자체도 파일에 저장됩니다(바이트코드 파일은 클래스 정보를 저장합니다). Java는 I/O 스트림을 통해 클래스 파일(바이트코드 파일)을 읽습니다. 가상 머신), 이 프로세스는 클래스 로딩이 됩니다. JVM(Java Virtual Machine)은 클래스 경로(CLASSPATH)를 통해 바이트코드 파일을 찾습니다.

클래스 변수는 로드 시 자동으로 초기화됩니다. 초기화 규칙은 인스턴스 변수와 동일합니다.

참고: 클래스의 인스턴스 변수는 객체가 생성될 때 초기화됩니다. 정적에 의해 수정되는 속성, 즉 클래스 변수는 클래스가 로드될 때 생성되고 초기화됩니다. 즉, 클래스 변수는 한 번만 생성됩니다.

2.정적 수정 메서드(정적 메서드)는 이 메서드를 전체 클래스에 공개하고 클래스 이름.메서드 이름을 사용하여 액세스할 수 있습니다.

참고: 수정된 정적 메서드는 이 클래스의 비정적(정적) 멤버(메서드 및 속성 포함)에 직접 액세스할 수 없습니다. 이 클래스의 비정적(정적) 메서드는 이 클래스의 정적 멤버에 액세스할 수 있습니다. 메서드 및 속성 포함) 정적 메서드를 호출할 수 있습니다. 정적 메서드는 주의해서 사용해야 합니다. 이 키워드는 정적 메서드에 나타날 수 없습니다.

참고: 상위 클래스는 정적 메서드이므로 하위 클래스에서 비정적 메서드로 재정의할 수 없습니다. 적용 범위 규칙을 준수한다는 전제 하에 상위 클래스에서는 상위 클래스의 정적 메서드를 사용합니다. 클래스는 하위 클래스에서 정적일 수 있지만 다형성은 없습니다. (객체를 사용하여 정적 메서드를 호출하는 경우 실제로는 컴파일 타임 유형의 정적 메서드를 호출하는 것입니다.)

참고: 부모 클래스와 자식 클래스에서 정적 메서드는 정적 메서드로만 재정의될 수 있습니다. 부모 및 자식 클래스, 비정적 메서드는 비정적 메서드 재정의로만 재정의될 수 있습니다.

Java의 메인 메소드는 클래스가 로드될 때 객체를 생성할 수 없으므로 정적 메소드로 작성해야 합니다. 정적 메소드는 객체 없이 호출될 수 있기 때문에 클래스의 메인 메소드에 있습니다. 클래스가 로드되면 프로그램은 기본 메소드 항목을 통해 실행될 수 있습니다.

3.static은 초기 코드 블록을 수정하는데, 이 초기 코드 블록은 클래스가 로드될 때 한 번만 실행됩니다. 정적 초기화 블록을 사용하여 클래스를 초기화할 수 있습니다.

클래스 본문의 "{}"에 작성된 동적 초기화 코드 블록으로, 생성된 객체의 초기화 속성이 생성될 때 이 코드 블록이 실행됩니다. 이러한 유형의 코드 블록을 동적 초기화 코드 블록이라고 합니다.

클래스는 언제 로드되나요? 객체를 생성할 때 클래스에서 정적 메서드를 호출하거나 정적 속성에 액세스하면 클래스도 로드됩니다. 하위 클래스를 로드할 때 상위 클래스를 먼저 로드해야 합니다. 클래스 로드에는 지연 로드 원칙이 있으며 로드해야 할 때만 로드됩니다.

final 수정자는 변수, 메소드, 클래스를 수정할 수 있습니다

1.final 수정된 변수
fianl로 수정된 변수는 상수가 됩니다(상수는 일단 할당되면 변경할 수 없습니다). (초기화 중에 직접 값을 할당할 수도 있고 생성자에서 값을 할당할 수도 있습니다. 이 두 가지 방법 중 하나만 선택할 수 있으며 상수에 값을 할당해야 합니다.) fianl의 상수에는 기본값이 없습니다. 초기 값. For 초기화 중에 직접 값을 할당할 때 최종 수정자와 함께 사용되는 경우가 많습니다.

2. 최종 수정된 메소드. final로 수정된 메소드는 해당 서브클래스에 의해 오버라이드되지 않으며 메소드의 안정성도 오버라이드될 수 없습니다.
3. Final 수정 클래스. final로 수정된 클래스는 상속되지 않습니다. 최종 클래스의 메서드도 최종입니다.

참고: final은 생성자를 수정하는 데 사용할 수 없습니다. 상위 클래스에 상수 속성이 있는 경우 하위 클래스에서 상수 속성을 사용할 때 상위 클래스의 클래스 로딩이 수행되지 않습니다.

불변 모드에서는 개체가 생성되면 개체의 속성이 변경되지 않습니다. 속성을 수정하려면 final을 사용하고, 클래스를 수정하려면 final을 사용하고(강한 불변성 모드), 속성을 수정하려면 final을 사용합니다(약한 불변성 모드).

불변 모드의 전형적인 구현: java.lang.String 클래스, 불변 모드는 객체 공유를 실현할 수 있습니다(하나의 객체 인스턴스가 여러 객체 변수에 할당될 수 있음)

Pooled 풀에서 공유해야 하는 데이터(공간 절약, 데이터 공유)
String 클래스만 ""에 리터럴 값이 있는 객체를 생성할 수 있습니다. String 클래스에서는 리터럴 값으로 생성되면 Java 메소드 공간의 문자열 풀 공간에서 검색하여 해당 문자열 풀에 있는 문자열의 주소를 반환하며, 이 주소를 반환한다. 객체 변수에 지급됩니다. 그렇지 않은 경우 문자열 풀에 문자열 개체가 생성되고 해당 주소가 구매 개체 변수에 반환됩니다. 리터럴 값으로 다른 개체가 생성되면 위 프로세스가 반복됩니다.
new가 힙 공간에 String 클래스의 객체를 생성하면 위의 과정은 발생하지 않습니다.

String 클래스의 intern() 메소드는 힙 공간에 생성된 String 클래스 객체의 문자열을 문자열 풀과 비교합니다. 동일한 문자열이 있으면 문자열을 문자열 풀 주소로 반환합니다. .

불변 모드는 객체를 수정하고 연산을 추가할 때 상당히 번거롭고 중간에 가비지 객체가 많이 생성됩니다. 리소스를 생성하고 폐기하는 데 드는 오버헤드는 상당합니다.

String 클래스는 문자열을 연결할 때 생성되는 개체의 속성을 수정할 수 없기 때문에 문자열을 연결할 때 매우 비효율적입니다.

많은 문자열 연결의 경우 StringBuffer 클래스를 사용해야 합니다. 이 클래스의 개체를 사용하여 문자열 연결을 수행하면 중복되는 중간 개체가 생성되지 않으므로 효율성이 최적화됩니다.

Abstract(추상) 수식자는 클래스와 메서드를 수정할 수 있습니다.
1.Abstract 수식자는 이 클래스를 추상 클래스로 만듭니다. 이 클래스는 개체 인스턴스를 생성할 수 없지만 개체 변수로 사용할 수 있습니다. 선언된 유형, 즉 컴파일 타임 유형, 추상 클래스는 클래스의 반제품과 같으며 하위 클래스는 그 안에 있는 추상 메서드를 상속하고 재정의해야 합니다.

2. 추상 수정 메서드는 이 메서드를 추상 메서드로 만듭니다. 즉, 선언(정의)만 있고 구현 부분은 ";"으로 대체됩니다. 구현을 상속하려면 서브클래스가 필요합니다(재정의).

참고: 추상 메소드가 있는 클래스는 추상 클래스여야 합니다. 그러나 추상 메서드가 반드시 모두 추상 메서드인 것은 아니며, 구체적 메서드일 수도 있습니다.
클래스 수정 시 클래스명 앞에 추상 수식어를 둬야 합니다.

추상 수정 메서드를 사용하려면 하위 클래스에서 이 메서드를 재정의(구현)해야 합니다. 호출할 때 서브클래스에서 다루는(구현된) 메서드를 다형성 방식으로 호출할 수 있습니다. 즉, 서브클래스 자체가 추상 클래스가 아닌 한 추상 메서드는 해당 서브클래스에서 구현되어야 합니다.

참고: 상위 클래스는 추상 메서드가 있는 추상 클래스입니다. 그런 다음 하위 클래스는 상위 클래스를 상속하고 상위 클래스의 모든 추상 메서드를 구현(재정의)합니다. 그런 다음에만 하위 클래스가 객체의 인스턴스를 생성할 수 있습니다. 그렇지 않으면 하위 클래스도 추상 클래스여야 합니다. 추상 클래스에는 하위 클래스 객체를 생성할 때 하위 클래스가 호출해야 하는 상위 클래스(추상 클래스)의 생성자인 생성자가 있을 수 있습니다.

최종과 추상, 프라이빗과 추상, 정적과 추상, 이들은 함께 묶을 수 없는 수식어입니다. 왜냐하면 추상에 의해 수정된 메서드는 다형성 호출이 되기 위해서는 하위 클래스에서 구현(재정의)되어야 하기 때문입니다. 위의 수정자는 메서드를 수정할 때 하위 클래스에서 재정의할 수 없습니다. Private은 하위 클래스에 상속할 수 없으므로 재정의할 수 없지만 컴파일 타임 형식 메서드의 경우 호출됩니다. 부모 클래스의 메서드가 호출되고 부모 클래스의 메서드는 추상 메서드이므로 호출할 수 없으므로 이들에 대한 수정자를 함께 사용할 수 없습니다.

추상 메소드는 특정 표준을 나타내고, 표준을 정의하고, 함수를 정의하고, 하위 클래스에서 함수를 구현합니다(하위 클래스는 상위 클래스를 상속하며 상위 클래스에서 상속된 추상 메소드의 구현을 제공해야 함) ).
이 메소드는 한동안 구현될 수 없거나, 서브클래스로 구현되도록 의도되었으며 특정 표준을 정의합니다. 이 메소드는 추상으로 정의될 수 있습니다. (abstract)

템플릿 메소드 패턴
abstract를 사용하여 표준의 공식화와 표준의 구현을 분리합니다. 표준의 공식화는 템플릿이고 구현은 템플릿 표준에 따라 구현됩니다. , 템플릿을 상속하고 템플릿 메소드에서 해당 기능을 구현합니다. 템플릿에서 수정이 허용되지 않는 메소드는 fianl로 수정할 수 있습니다. 이 메소드는 추상 메소드를 만들 수 없습니다. 안전과 캡슐화를 보장하려면 템플릿의 비공개 부분을 protected로 수정해야 합니다.

Java 수식자 abstract, static, final의 차이점에 대한 자세한 설명은 PHP 중국어 웹사이트의 관련 기사를 참고하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.