사람이 해결할 수 있는 문제의 복잡성은 사물을 추상화하는 능력에 달려 있다 어느 정도.
고급 수학과 물리학은 매우 추상적인 학문입니다. 그것은 지극히 추상적인 차원에서 연구되어 큰 진전을 이루면 우리의 일상생활에 큰 영향을 미칠 것입니다. 예를 들어 아인슈타인의 상대성 이론의 발견은 세상에 큰 영향을 미쳤습니다. 프로그래밍에서도 마찬가지입니다. 추상화 수준이 높을수록 이를 설명하는 데 사용할 수 있는 코드가 더 간결해집니다.
Alan Kay는 최초의 성공적인 객체 지향 언어이자 Java의 기반이 되는 언어 중 하나인 Smalltalk의 5가지 기본 특성을 요약한 적이 있습니다. :
모든 것이 객체입니다
프로그램은 객체의 집합이며, 객체는 서로 무엇을 해야 할지 알려줍니다. 메시지
모든 객체에는 다른 객체로 구성된 자체 저장소가 있습니다
모든 객체에는 해당 유형이 있습니다
특정 유형의 모든 객체는 동일한 메시지를 받을 수 있습니다
또는 객체를 더 간결하게 설명할 수 있습니다. 객체에는 상태, 동작 및 로고가 있습니다 . 각 개체에는 내부 데이터, 메서드 및 고유 주소가 있습니다.
모든 객체는 고유하지만 클래스의 일부 특성과 동작이 동일합니다. 예를 들어, 하늘에는 많은 참새가 있고, 각 참새는 독립된 개체이지만, 이 개체들은 모두 참새이고, 모두 참새의 특성을 가지고 있습니다.
각 개체는 서비스 제공자입니다. 이 개체의 메서드를 호출하고 개체의 변수를 사용하여 자체 작업을 수행할 수 있습니다. 객체를 서비스 제공자로 생각하면 부수적인 이점이 있습니다. 객체를 더욱 응집력 있게 만드는 데 도움이 됩니다. 높은 응집력은 소프트웨어 설계의 기본 품질 요구 사항 중 하나이며, 이는 소프트웨어 구조가 잘 구성되어 있음을 의미합니다. 이 수업에서는 이러한 메서드와 속성이 하나로 그룹화됩니다. 사용하기가 매우 편리합니다. 그러나 우리가 매일 물건을 디자인할 때 직면하는 문제 중 하나는 종종 하나의 물건에 너무 많은 기능을 집어넣는다는 것입니다.
좋은 객체 지향 디자인에서는 각 객체가 하나의 작업을 잘 수행하고 더 많은 작업을 수행하려고 하지 않습니다. 이러한 설계에는 낮은 결합이라는 또 다른 이점이 있습니다. 각 개체는 고유한 응집력이 높은 속성 메서드를 갖고 있기 때문에 모두 고유한 "일"을 수행하도록 태어났습니다. 서로 다른 유형의 여러 개체가 각각의 기능을 결합하여 이러한 낮은 결합을 달성합니다.
컴퓨터 네트워크 구조의 7계층 모델에서 각 계층은 서로 닫혀 있으며 최종적으로 완성됩니다. 대부분의 가상 컴퓨터 작업부터 기본 전자 회로 작업까지 전체 네트워크 구조. 계층 사이에서 상위 계층은 다음 계층 메서드의 인터페이스만 볼 수 있으며 다음 계층의 메서드를 호출하는 방법만 알 수 있으며 다음 계층의 특정 코드 구현에는 관심이 없습니다.
Java 코드에서는 클래스의 경계를 설정하는 데 세 가지 키워드가 사용됩니다. 이 세 가지 액세스 지정 단어는 다음 콘텐츠를 사용할 수 있는 사람을 결정합니다.
public: 현재 클래스 현재 패키지 하위 항목 기타 패키지
보호됨: 현재 클래스 현재 패키지 하위 항목
기본(수정되지 않음): 현재 클래스 현재 패키지
비공개: 현재 수업
코드 재사용 및 조합은 객체지향 프로그래밍 언어가 제공하는 가장 놀라운 이점 중 하나입니다.
재사용하는 가장 간단한 방법은 이 클래스의 객체를 직접 사용하는 것입니다. 또한 해당 클래스의 개체를 새 클래스에 넣을 수도 있습니다. 이 재사용 방법을 "멤버 개체 만들기"라고 합니다. 새 클래스는 새 클래스에서 원하는 기능을 달성하는 방식으로 모든 유형의 다른 개체로 구성될 수 있습니다. 기존 클래스를 사용하여 새 클래스를 합성하므로 이 개념을 구성이라고 합니다.
우리는 보통 결합을 관계, 즉 'has-a'라고 생각합니다.
자신의 클래스에서 상속 관계를 사용하는 것을 선호하는 많은 초보자에 비해 실제로 새 클래스를 구성할 때 구성이 더 유연하기 때문에 먼저 고려해야 합니다. 이 조합을 사용하면 디자인이 더욱 깔끔해집니다.
상속이 무엇인지 소개하지 않겠습니다. 프로젝트에서 부모 클래스를 추상화하는 방법을 고려할 때 이에 대해 생각해 볼 수 있다는 점은 언급할 가치가 있습니다. 여러 하위 클래스, 여러 하위 클래스를 사용하여 공통점이 무엇인지 알아보세요. 이는 상위 클래스를 추상화하는 데 매우 유용합니다.
상속으로 인해 기본 클래스 개체로 보낼 수 있는 모든 메시지는 하위 클래스 개체로도 보낼 수 있습니다. 이는 사실상 하위 클래스가 상위 클래스 와 동일한 유형을 가짐을 의미합니다. 상위 클래스를 상속하고 새 메서드를 만들지 않고 상위 클래스의 메서드만 재정의하는 경우 이를 순수 대체라고 부를 수 있습니다. 순수 대체의 경우 이 관계를 표현하기 위해 - "is-a"를 사용합니다. 상위 클래스를 상속할 뿐만 아니라 상위 클래스를 기반으로 새 메서드를 추가하는 경우에는 - "is-like-a"를 사용하여 이 관계를 표현합니다.
계층 구조를 다룰 때 객체를 특정 객체로 취급하지 않고 객체로 취급하는 경우가 많습니다. 그들의 부모 클래스. 예를 들어, 리스트를 전달해야 하는데, 이때 메소드의 매개변수에서 ArrayList인지 LinkedList인지 구분할 필요는 없습니다. 이 다형성은 프로그램을 크게 강화합니다.
그러나 여기에는 간단하지만 설명하기 어려운 문제가 있습니다. 예를 들어 위 메소드는 목록을 전달한 후 추가 함수를 호출합니다. 이 메소드는 전달된 목록에 대해 호출할 추가 함수를 어떻게 알 수 있습니까? ?
이 질문에 대한 대답은 객체 지향 프로그래밍에서 가장 중요한 팁이기도 합니다. 컴파일러는 전통적인 의미의 초기 바인딩 함수 호출을 생성하지 않고 후기 바인딩 방법을 사용합니다. 비객체 지향 컴파일러에 의해 생성된 함수 호출은 소위 조기 바인딩을 발생시킵니다. 이 바인딩 방법은 컴파일러가 특정 함수 이름을 사용하여 호출을 생성하고 런타임이 해당 함수를 해결한다는 것을 의미합니다. 실행할 코드의 절대 주소 이 문제를 해결하기 위해 OOP는 늦은 바인딩이라는 개념을 사용합니다. 객체에 메시지를 보낼 때 호출되는 코드는 런타임까지 확인할 수 없습니다. 컴파일러는 호출된 메서드가 존재하는지 확인하고 매개변수 반환 값을 확인하지만 실행될 정확한 코드를 알지 못합니다.
C++에서는 런타임에 바인딩 속성을 통해 메서드에 유연성이 부여되도록 가상 키워드를 통해 명시적으로 선언해야 합니다. 즉, 기본적으로 런타임에 바인딩되지 않습니다. Java에서는 동적 바인딩이 기본 동작입니다.
Java에서 모든 클래스는 궁극적으로 단일 기본 클래스에서 상속되며 이 기본 클래스는 Object입니다. 단일 루트 상속 구조는 많은 이점을 제공하는 것으로 나타났습니다. 단일 루트 상속을 사용하면 가비지 수집기 구현이 훨씬 쉬워집니다. 모든 객체에는 해당 유형 정보가 보장되므로 객체 유형을 결정할 수 없어 발생하는 교착 상태가 발생하지 않습니다.
객체의 생성과 생명주기를 이야기할 때 많은 언어가 떠오르지 않을 수 없습니다. 취급 방법이 다양합니다. C++에서는 효율성 제어가 가장 중요한 문제라고 생각하므로 C++에서는 프로그래머에게 선택할 수 있는 권한을 부여합니다. new를 직접 생성할 수도 있지만 new로 생성된 공간을 삭제해야 합니다. 그렇지 않으면 유명한 메모리 누수 문제에 빠지게 됩니다.
Java에서는 모든 객체가 힙 메모리 풀에 동적으로 생성됩니다. 이 접근 방식에서는 런타임까지 필요한 객체 수, 수명 주기, 특정 유형이 무엇인지 알 수 없습니다. 이러한 문제는 프로그램이 실행된 상태에서 해당 코드를 실행하는 순간에만 판단할 수 있습니다. 따라서 힙에 저장 공간을 할당하는 데 많은 시간이 걸리며, 이는 스택에 저장 공간을 만드는 시간보다 훨씬 길어질 수 있습니다. 스택에 저장 공간을 생성하고 해제하려면 일반적으로 단일 명령만 필요합니다. 힙 저장소를 만드는 데 걸리는 시간은 저장소 메커니즘의 설계에 따라 다릅니다.
Exception은 객체입니다. 그는 오류 지점에서 "던져졌습니다". 특정 유형의 오류를 처리하도록 특별히 설계된 해당 예외 처리기에 의해 "포착"됩니다. 예외 처리는 오류가 발생했을 때 프로그램의 일반적인 실행 경로와 병렬로 실행되는 또 다른 경로와 같습니다. 완전히 별개의 실행 경로이기 때문에 코드의 정상적인 실행을 방해하지 않습니다.
주목할 가치가 있습니다: 예외 처리는 객체 지향 기능이 아닙니다. 하지만 객체 지향 언어에서는 예외 처리가 객체로 표현되는 경우가 많습니다. 객체 지향 언어가 출현하기 전에도 예외 처리가 존재했습니다.
위 내용은 Java 객체에 대한 자세한 소개입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(m.sbmmt.com)를 참고해주세요!