Java 프로그래밍 마인드 6 - 클래스 재사용 (Reusing Classes)

6146 단어
새 클래스를 만들어서 코드를 반복적으로 사용하지만, 다시 만들 필요가 없고, 다른 사람이 만들어서 디버깅한 기존 클래스를 직접 사용할 수 있다.
  • 첫 번째 가장 간단: 새로운 클래스에서 기존 클래스의 대상을 간단하게 만든다.우리는 이런 방법을 '조합' 이라고 부른다. 왜냐하면 새로운 종류는 기존 클래스의 대상이 합병되어 형성되기 때문이다.
  • 두 번째 방법은'계승'(Inheritance)이라고 하는데 관련된 대부분의 작업은 컴파일러가 완성한 것이다.

  • 1. 조합된 문법


    조합을 진행하기 위해서, 우리는 단지 새로운 종류에 대상 핸들을 간단하게 설치하기만 하면 된다.
    System.out.println("source = " + source) ;
    

    String 객체에 WaterSource를 추가하려고 합니다("source =").우리는 한 문자열을 다른 문자열에 추가할 수 있기 때문에, "나는 토스트링 () 을 호출해서 소스를 문자열로 변환할 것이다."라고 말할 것이다.이렇게 처리한 후에, 그것은 두 개의 문자열을 컴파일하여, 결과의 문자열을 시스템으로 전달할 수 있다.out.println().자신이 만든 클래스와 함께 이 행동을 허용할 때마다 toString () 방법을 쓰기만 하면 됩니다.
    클래스 내에서 필드로 사용하는 기본 데이터는 0으로 초기화됩니다.대상 핸들은null로 초기화됩니다.핸들을 초기화하려면 다음과 같이 하십시오.
  • (1) 대상이 정의될 때.이것은 구축기가 호출되기 전에 반드시 초기화될 수 있다는 것을 의미한다.
  • (2) 그 종류의 구축기에서
  • (3) 그 대상을 실제로 사용하도록 요구하기 전에 바짝 붙는다.이렇게 하면 불필요한 비용을 줄일 수 있다. 만약 대상이 창설할 필요가 없다면.

  • 2. 계승 문법


    클래스 주체의 시작 괄호 앞에 키워드 extends를 놓고 뒤에 '기초 클래스' 의 이름을 따라야 합니다.이런 방식을 취하면 기초 클래스의 모든 데이터 구성원과 방법을 자동으로 얻을 수 있다.
    부모 클래스 (기본 클래스) 와 하위 클래스는 모두 스크루 () 가 있지만, 하위 클래스의 스크루 () 에서는 스크루 () 에 대한 호출만 간단하게 보낼 수 없습니다.그렇게 하면 귀속 호출을 초래하여 우리는 이 상황을 보고 싶지 않다.이 문제를 해결하기 위해 Java는 현재 클래스가 상속된 하이퍼클래스(Superclass)를 참조하는 슈퍼 키워드를 제공합니다.그래서 표현식 슈퍼.scrub () 는 방법 scrub () 의 기본 버전을 호출합니다.

    2.1 초기화 기본 클래스


    하위 클래스의 대상을 만들 때 기본 클래스의 '하위 대상' 을 포함합니다.이 하위 대상은 우리가 기초 클래스 자체에 따라 그 대상을 만든 것과 같다.하위 클래스 빌더에서 Java는 기본 클래스 빌더에 대한 호출을 자동으로 삽입합니다.

    2.1.1 자체 변수를 포함하는 구축기


    클래스에 기본 변수가 없거나, 변수를 포함하는 기본 클래스 구축기를 호출하려면, 기본 클래스에 대한 호출 코드를 명확하게 작성해야 한다.이것은 슈퍼 키워드와 적당한 변수 목록으로 이루어진 것이다.
    하위 클래스 구축기에서 기본 클래스 구축기에 대한 호출은 반드시 해야 할 첫 번째 일이다.

    2.1.2 베이스 구축기의 이상 포획


    컴파일러는 하위 클래스 구축기의 주체에서 우선 기본 클래스 구축기에 대한 호출을 설정하도록 강요할 것이다.이것은 그 전에 어떤 것도 나타날 수 없다는 것을 의미한다.이 동시에 하위 클래스 구축기가 하나의 기초 클래스에서 온 어떠한 위법 사건도 포획하는 것을 방지할 수 있다.분명히 이것은 때때로 우리를 불편하게 할 수도 있다.

    3. 조합과 계승의 결합


    비록 컴파일러가 기본 클래스를 초기화하도록 강요하고, 구축기 맨 처음에 이 작업을 하도록 요구하지만, 구성원 대상을 정확하게 초기화했는지 감시하지는 않습니다.그러니 각별히 유의해야 한다.

    3.1 올바른 정리 보장


    이러한 제거 코드를finally 종문에 넣어서 발생할 수 있는 모든 이상 사건을 방지해야 합니다.

    3.2 이름의 숨김(검증)


    자바 베이스 클래스에 여러 번 재부팅된 방법명이 있다면, 파생 클래스에서 그 방법명에 대한 재정의는 베이스 클래스의 버전을 숨기지 않습니다.따라서 방법이 이 단계에서든 하나의 기초 클래스에서 정의되든 재부팅은 모두 효력이 발생한다.기본 클래스와 완전히 일치하는 서명과 되돌아오는 형식으로 같은 이름을 덮어쓰는 방법은 드물다. 그렇지 않으면 헷갈릴 수 있다.

    4. 그룹을 선택할지 계승할지


    한 차량의 대상으로 한 대의 자동차를 합성할 수 없다. 자동차는 차량을 포함하지 않는다.반대로 그것은 차량의 한 종류에 속한다.'속'관계는 계승으로 표현하고'포함'관계는 합성으로 표현한다.

    5.protected


    보호된 것은 그 자체가 개인적이지만, 이 종류에서 물려받은 모든 물건이나 같은 가방 안의 다른 모든 물건에 접근할 수 있다는 뜻이다.

    6. 누적 개발


    계승의 장점 중 하나는 '누적 개발' 을 지원하고 새로운 코드를 도입할 수 있으며 기존 코드에 오류를 일으키지 않는다는 것이다.이렇게 하면 새로운 오류를 새 코드로 분리할 수 있다.
    계승은 특수한 관계에 대한 표현으로'이 새로운 종류는 그 구류의 한 유형에 속한다'는 것을 의미한다.우리의 프로그램은 일부 가는 나무 마디에 얽매여서는 안 되고, 각종 유형의 대상을 창설하고 조작하는 데 착안하여, 그것들로 '문제 공간'에서 나온 모델을 표현해야 한다.

    7. 상향 전환(Upcasting)


    계승: 자류는 부류의 한 유형에 속한다.상향 변환: 하위 클래스 핸들을 부모 클래스 핸들로 변환합니다.

    7.1 상향 전환이란 무엇입니까?


    이 이름을 유상속도라고 부르는 화법은 뿌리가 맨 위에 위치하고 점차 아래로 확장되는 것이다.상소조형(상향 전환)은 틀림없이 안전할 것이다. 왜냐하면 우리는 더욱 특수한 유형에서 더욱 일반적인 유형으로 바뀌었기 때문이다.

    7.1.1 조합과 계승을 재론


    상속을 사용할 때는 특히 신중해야 한다.상속이 모든 방법에서 가장 효과적이라는 것을 똑똑히 아는 전제에서만 그것을 고려할 수 있다.
    자신이 도대체 조합을 선택해야 하는지 계승해야 하는지를 판단하기 위해 가장 간단한 방법은 새로운 유형에서 조형을 거슬러 올라가 기초류로 돌아가야 하는지를 고려하는 것이다.거슬러 올라가야 한다면 계승이 필요하다.

    8.final 키워드


    final은 "이 물건은 바꿀 수 없다"고 성명했다.변화를 금지하려는 것은 디자인이나 효율을 고려한 두 가지 요인일 수 있다.

    8.1 final 데이터


    상수는 주로 다음 두 가지 측면에 응용된다.
  • (1) 컴파일러 상수는 자바에서 영원히 바뀌지 않습니다. 이러한 형식의 상수는 기본 데이터 형식(Primitives)에 속하고final 키워드로 표현해야 합니다.이러한 상수를 정의할 때 반드시 값을 제시해야 한다.그러나 대상 핸들에 대해final은 핸들을 상수로 바꿉니다.성명을 진행할 때, 반드시 핸들을 구체적인 대상에 초기화해야 한다.그리고 문장 손잡이를 영원히 다른 대상을 가리키는 것으로 바꿀 수 없다.그러나 대상 자체는 수정할 수 있다.이 제한도 수조에 적용되며, 그것도 대상에 속한다.
  • (2) 운행 기간에 초기화된 값으로 우리는 그것이 변화하는 것을 원하지 않는다. 어떤 물건의 속성이final이기 때문에 그 값이 컴파일링 시기에 알 수 있다고 인정하지 않는다.final 값을 static과 비static 사이의 차이로 설정합니다.값이 실행 기간에 초기화되는 전제에서만 이런 차이가 드러날 수 있다.컴파일링 기간의 값이 컴파일러에 의해 동일하다고 여겨지기 때문이다.

  • 8.1.1 Blank finals


    final로 성명되었지만 초기 값을 얻지 못했습니다.어떤 상황에서든 공백final은 실제 사용하기 전에 정확하게 초기화되어야 한다.필드를 정의할 때 표현식을 사용하든지, 구축기마다 값을 부여하든지,final에 값을 부여해 달라고 강요하고 있습니다.이렇게 하면final 필드가 사용하기 전에 정확한 초기화를 얻을 수 있습니다.

    8.1.2 final 자동 변수


    하나의 방법의 내부에서, 우리는 자변수 핸들이 가리키는 물건이나 그 값 (기본 유형) 을 바꿀 수 없다는 것을 의미한다.

    8.2 final 방법


    final 방법을 사용해야 하는 것은 두 가지 이유에 대한 고려에서 비롯된 것일 수 있다.
  • 첫 번째는 모든 계승류가 원래의 의미를 바꾸는 것을 방지하기 위해 자물쇠를 잠그는 것이다.프로그램을 설계할 때 하나의 방법의 행위가 계승 기간에 변하지 않고 덮어쓰거나 고칠 수 없기를 원한다면 이런 방법을 취할 수 있다.
  • final 방법을 채택한 두 번째 이유는 프로그램 실행의 효율이다.하나의 방법을final로 설정하면 컴파일러는 그 방법에 대한 모든 호출을 '끼워넣기' 호출에 넣을 수 있습니다.컴파일러가final 방법 호출을 발견하면 (그 자체의 판단에 따라) 실행 방법 호출 메커니즘을 위한 일반적인 코드 삽입 방법을 무시합니다.반대로, 그것은 방법 주체 내의 실제 코드의 사본으로 방법을 바꾸어 호출할 것이다.이렇게 하면 방법이 호출될 때의 시스템 비용을 피할 수 있다.

  • 일반적으로 방법의 코드량이 매우 적거나, 방법이 덮어씌워지지 않도록 명확하게 금지하고 싶을 때만, 방법을final로 설정하는 것을 고려해야 한다.
    클래스 내의 모든 private 방법은 자동으로 final이 됩니다.

    8.3 final 클래스


    이런 종류로부터 계승하는 것을 허락하지 않는다.클래스를final로 정의하면 계승만 금지됩니다. 더 이상 제한이 없습니다.그러나 상속을 금지했기 때문에, 하나의final류의 모든 방법은final로 묵인됩니다.

    8.4 final 고려 사항


    우리는 한 종류가 앞으로 어떤 형식으로 재생되거나 중복 이용될지 예측하기 어렵다.일반적인 용도의 종류는 특히 이렇다.하나의 방법을final로 정의하면 다른 프로그래머의 프로젝트에서 자신의 클래스를 계승하는 경로를 막을 수 있습니다.

    9. 초기화 및 클래스 마운트


    모든 대상의 코드는 독립된 파일에 존재한다.코드가 정말 필요하지 않으면 그 파일은 불러오지 않습니다.

    9.1 상속 초기화


    마운트 과정에서 마운트 프로그램은 기본 클래스 (즉 extends 키워드가 표현할 의미) 가 있음을 주의하여 불러옵니다.그 기초류의 대상을 생성할 준비가 되어 있든 없든 이 과정은 발생할 것이다.
    베이스 클래스에 다른 베이스 클래스가 있으면 다른 베이스 클래스도 로드됩니다.다음은 루트 베이스 클래스에서static를 초기화하고 다음 파생 클래스에서 실행합니다.이 순서를 확보하는 것은 매우 관건적이다. 왜냐하면 하위 클래스의 초기화는 기초 클래스 구성원에 대한 정확한 초기화에 의존해야 하기 때문이다.
    이 때 필요한 클래스가 모두 불러오기 때문에 대상을 만들 수 있습니다.우선, 이 대상의 모든 기본 데이터 형식은 기본값으로 설정하고, 대상 핸들은null로 설정합니다.다음에 기본 클래스 구축기를 호출할 것입니다.이런 상황에서 호출은 자동으로 진행된다.하지만 슈퍼로 구축기 호출을 지정할 수도 있습니다.기초 클래스의 구축은 파생 클래스 구축기와 완전히 같은 처리 과정을 채택한다.기초 클래스 구축기가 완성되면 실례 변수는 원래의 순서에 따라 초기화됩니다.마지막으로 구축기의 남은 주체 부분을 실행합니다.

    좋은 웹페이지 즐겨찾기