우선 세 가지 주요 기능의 정의에 대해 간단히 설명하겠습니다.
캡슐화: 객체의 속성과 구현 세부 정보를 숨기고 인터페이스만 외부에 노출하며, 프로그램 액세스 수준의 속성 읽기 및 수정을 제어합니다. 추상화된 데이터와 동작(또는 함수)을 결합하여 유기적인 전체를 형성하는 것, 즉 데이터를 작동하는 소스 코드와 데이터를 유기적으로 결합하여 "클래스"를 형성하는 것입니다. 여기서 데이터와 함수는 모두 클래스의 구성원입니다. 캡슐화의 목적은 보안을 강화하고 프로그래밍을 단순화하는 것입니다. 사용자는 특정 구현 세부 사항을 이해할 필요가 없으며 외부 인터페이스와 특정 액세스 권한을 통해 클래스 멤버를 사용하기만 하면 됩니다. 캡슐화에 대한 기본 요구 사항은 다음과 같습니다. 모든 속성을 사유화하고 각 속성에 대해 getter 및 setter 메서드를 제공합니다. 매개 변수가 있는 생성자가 있는 경우 매개 변수 없이 생성자를 작성해야 합니다. 개발 중에는 작성된 클래스를 테스트해야 하는 경우가 많기 때문에 toString 메서드를 재정의하는 경우도 있지만 반드시 그럴 필요는 없습니다.
상속: 코드 재사용은 상속을 통해 이루어집니다. Java의 모든 클래스는 java.lang.Object 클래스를 직접 또는 간접적으로 상속하여 얻습니다. 상속받은 클래스를 서브클래스, 상속받은 클래스를 부모 클래스라고 합니다. 하위 클래스는 상위 클래스의 비공개 액세스 권한이 있는 멤버 변수와 메서드를 상속할 수 없습니다. 하위 클래스는 상위 클래스의 메서드를 재정의하고 상위 클래스와 동일한 이름으로 멤버 변수의 이름을 지정할 수 있습니다. 그러나 Java는 클래스가 여러 슈퍼클래스에서 파생되는 기능인 다중 상속을 지원하지 않습니다. 프로그램의 결합을 줄이기 위해 개발 중에 상속 관계를 최대한 줄이십시오.
다형성: 다형성은 디자인 타임 다형성과 런타임 다형성으로 구분됩니다. 예를 들어 오버로딩은 디자인 타임 다형성이라고도 하며 재정의되거나 상속된 메서드의 경우 JAVA 런타임 시스템이 결정합니다. 메서드가 호출되는 인스턴스 유형에 따라 호출할 메서드를 결정하는 것을 런타임 다형성이라고 합니다. 전체적으로 객체지향 디자인의 전형적인 특징은 상속, 캡슐화, 다형성입니다. 이러한 특징은 객체지향이 인기를 끄는 핵심이기도 합니다.
캡슐화
Java의 클래스 속성에 대한 액세스 권한의 기본값은 비공개가 아닙니다. 이 속성의 메소드를 숨기려면 비공개 수정자를 추가하여 비공개로 제한할 수 있습니다. 수업 내에서.
클래스의 비공개 속성의 경우 비공개 속성의 작동 및 보안을 보장하기 위해 비공개 속성에 액세스할 수 있는 한 쌍의 메소드(getXXX, setXXX())를 제공해야 합니다.
방법을 캡슐화하여 공개해야 할 것을 공개하고 숨겨야 할 것을 숨깁니다.
Java의 상속
상속이란 공통된 특성을 가진 여러 유형의 항목을 하나의 클래스로 추상화하는 것입니다.
Java의 상속은 반드시 확장 키워드를 사용해야 하며, Java는 단일 상속을 허용합니다. 즉, 클래스는 하나의 상위 클래스만 가질 수 있습니다.
생성자 메서드는 상속될 수 없습니다.
Java 메소드의 재정의
하위 클래스에 상위 클래스에서 액세스할 수 있는 동일한 이름과 동일한 매개변수 목록을 가진 메소드가 있는 경우 상위 클래스에서 상속된 메소드를 덮어씁니다.
super() 키워드
super(), 즉 하위 클래스의 생성자가 상위 클래스의 생성자를 호출할 때 super()는 생성자에서만 사용할 수 있음을 의미합니다. . 첫 번째 문장.
Java의 다형성
두 가지 다형성 메커니즘이 있습니다: 컴파일 타임 다형성과 런타임 다형성
메서드 오버로딩: 오버로딩은 여러 가지가 있음을 의미합니다. 동일한 클래스에 동일한 이름을 가진 메소드가 있지만 이러한 메소드에는 서로 다른 매개변수가 있습니다. , 컴파일 타임에 어떤 메서드를 호출할지 결정할 수 있습니다. 이는 일종의 컴파일 타임 다형성입니다.
2. 메서드 적용 범위: 하위 클래스는 상위 클래스의 메서드를 재정의할 수 있으므로 동일한 메서드가 상위 클래스와 하위 클래스에서 서로 다른 표현식을 갖게 됩니다. Java 언어에서 기본 클래스의 참조 변수는 기본 클래스의 인스턴스 개체뿐만 아니라 하위 클래스의 인스턴스 개체도 가리킬 수 있습니다. 마찬가지로 인터페이스의 참조 변수도 인스턴스 개체를 가리킬 수 있습니다. 구현 클래스 중 하나입니다.
public class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } } public class B extends A{ public String show(B obj){ return ("B and B"); } public String show(A obj){ return ("B and A"); } } public class C extends B{ } public class D extends B{ } public class Test { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println("1--" + a1.show(b)); System.out.println("2--" + a1.show(c)); System.out.println("3--" + a1.show(d)); System.out.println("4--" + a2.show(b)); System.out.println("5--" + a2.show(c)); System.out.println("6--" + a2.show(d)); System.out.println("7--" + b.show(b)); System.out.println("8--" + b.show(c)); System.out.println("9--" + b.show(d)); } } 1--A and A 2--A and A 3--A and D 4--B and A 5--B and A 6--A and D 7--B and B 8--B and B 9--A and D
슈퍼클래스 객체 참조 변수가 서브클래스 객체를 참조하는 경우 참조 변수의 유형이 아닌 참조된 객체의 유형에 따라 호출되는 멤버 메소드가 결정되지만 호출되는 메소드는 슈퍼클래스에 있어야 합니다. 즉, 하위 클래스에 의해 재정의된 메서드입니다.
이 문장의 의미를 설명하기 위해 예를 사용해 보겠습니다. a2.show(b)
여기서 a2는 It을 참조하는 A 유형의 참조 변수입니다. 은 B 객체이므로 위 문장에 따르면 B가 누구 메서드를 호출할지 결정한다는 의미이므로 a2.show(b)는 B에서 show(B obj)를 호출해야 하며 결과는 "B and B"가 되어야 합니다. 그런데 왜 이전 실행 결과와 다른 걸까요? 여기서는 "여기에서 호출되는 메서드는 슈퍼 클래스에 정의되어야 합니다"라는 문장을 무시합니다. 그렇다면 show(B obj)가 클래스 A에 존재합니까? 존재하지 않습니다! 그럼 이 문장은 여기에는 적용되지 않는 건가요? 그럼 이 문장은 잘못된 걸까요? 아니요! 사실 이 문장은 이 문장을 암시하기도 합니다. 상속 체인에서 호출 메서드의 우선 순위에 따라 여전히 확인이 필요합니다. 이것이 바로 클래스 A에서 show(A obj)를 찾는 이유입니다. 동시에 B가 이 메서드를 다시 작성했기 때문에 클래스 B의 메서드를 호출합니다. 그렇지 않으면 클래스 A의 메서드를 호출합니다.
이상은 편집자가 소개한 Java 캡슐화, 상속 및 다형성의 세 가지 주요 특성에 대한 이해입니다. 궁금한 사항이 있으면 메시지를 남겨주세요. 편집자는 모든 사람에게 즉시 답변을 드릴 것입니다. 또한 PHP 중국어 웹사이트를 지원해 주신 모든 분들께 감사드립니다!
Java 캡슐화, 상속, 다형성의 세 가지 주요 특성을 이해하는 것과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!