201871010116- 제나라 영국 레드 "객체 지향 프로그래밍 (자바)"연구는 11 주 결론

텍스트 형식의 보웬의 시작 (2 점)

계획

함유량

"객체 지향 프로그래밍 (자바)"

https://www.cnblogs.com/nwnu-daizh/

어디에서 작업이 요구 사항

https://www.cnblogs.com/nwnu-daizh/p/11815810.html

작업 학습 목표

  1. 일반 개념을 이해;
  2. 정의를 마스터 및 일반 클래스의 사용;
  3. 선언 및 일반 방법의 사용을 마스터;
  4. 정의 및 일반 인터페이스의 구현을 잡고;
  5. 제네릭 프로그래밍 알아보기, 자신의 목적을 이해합니다.

에세이 보웬의 본문 내용은 다음과 같습니다 :

부 : 이론적 지식 제네릭 프로그래밍의 장 VIII의 요약 (25 점)

(1) 일반 프로그래밍 개념

JDK 5.0의 일반적인 유형 (1) 증가는 자바 언어는 안전 개선의 중요한 유형이다.

(2) 일반 : 또한, 파라미터 화 된 형태 (파라미터 화 된 형태)라는, 즉, 오브젝트의 종류를 나타내는 클래스, 인터페이스 및 방법의 정의는 상기 입력 파라미터에 의해 처리된다. (예를 들어, ArrayList 클래스) 

(3) 제네릭 프로그래밍 (일반 프로그래밍) : 쓰기 코드가 객체의 많은 다른 유형에 의해 재사용 될 수있다.

방법의 일반적인 클래스 선언의 2, 예

(1) 일반 클래스 (일반 클래스) 즉 클래스 변수의 하나 개 이상의 유형, 생성 파라미터 클래스로서 사용되는 형태를 가지고있다.

(2) 다음과 같은 형식으로 정의 된 일반적인 클래스로서 : 클래스 제네릭 <K, V> K 및 V 가변 파라미터 클래스 타입이다.

(3) 쌍 클래스 각괄호 밀폐형 T (<>)의 변수를 도입하고, 클래스 이름을 따른다.

(4) 일반 클래스는 변수 복수 종류를 가질 수있다. 예를 들면 : 공용 클래스 쌍 <T, U> {...}

클래스 정의 (5) 형식의 변수는 리턴 타입 필드, 로컬 변수의 타입을 지정한다.

(6) 제약과 제네릭 클래스의 제한 :

가) 기본 형식 매개 변수 유형을 인스턴스화하는 데 사용할 수 없습니다

b)는 런타임 타입 쿼리는 원래의 유형에 적용

C) 포기하지 제네릭 클래스의 인스턴스를 캡처 할 수 없습니다

d) 배열의 파라미터 화 된 형태는 합법적 아니다

E) 형태 변수 인스턴스화 할 수 없습니다

F) 제네릭 클래스 형 변수의 정적 컨텍스트가 잘못되었습니다

g) 분쟁 후 삭제주의

정의 3, 일반 방법

(1) 일반 방법 : 일반 클래스 이외에, 한 방법으로는 단지 하나의 일반적인 방법을 정의 할 수 있으며, 일반 타입 인자 또는 리턴 값을 지정하기위한 방법은 호출이 남아 있는지를 판정한다.

(2) 일반 클래스는 일반적인 범주에서 선언 될 수있는 일반적인 방법에 선언 될 수있다.

{클래스 ArrayTool 공공 
     공공 정적 <E> 무효 INSERT (E [] E, I INT) 
     { 
          // 코드를 직접하시기 바랍니다 추가 
    } 
 공공 정적 <E> E valueAt (E [] E, I INT) 
     { 
          // 추가를 자신의 코드 
      } 
}

4 일반 인터페이스의 정의

공용 인터페이스 IPool <T> 
 { 
      T의 get (); 
      INT의 추가 (T를 t); 
 }  

Type 변수를 (1)을 정의

어퍼는) 정의 일반적인 변수를 바인딩

공용 클래스 NumberGeneric <T는 번호를 확장>

b) 상기 하부 정의 형 변수 바인딩

목록 <? superCashCard> = 새로운 카드의 ArrayList <T> ();

상속 규칙 5, 제네릭 형식

(1) 자바 배열은 공변 (공변)이지만,이 원리는 일반적인 유형에 적용되지 않습니다

비 공분산 (2) 자바 제네릭 클래스.

(3) 제네릭 클래스를 확장 또는 다른 제네릭 클래스를 구현할 수 있습니다.

6 종류 나 와일드 카드 사용 방법

(1) "?"기호를 의미하는 매개 변수의 유형은 어떤 유형이 될 수 나타내며 T 인수는 다르다. T는 알 수없는 유형을 나타내고, "?"모든 유형을 나타냅니다. 이 와일드 카드는 일반적으로 다음과 같은 세 가지 용도가 :

A) 혼자? 모든 유형을 의미하는 데 사용

b)? 상한 표현 형식을 확장한다. 

표현 c)? 슈퍼 타입은 하한.

(2) 타입 정의 와일드 

A) 페어 <? 확장 직원>

b) 쌍 <? 슈퍼 관리자>

C) 무기한 와일드 카드 : <?> 쌍. 쌍 쌍 서로 다른와 <?> : 당신은 어떤 개체 개체를 원래 방법의 setObject 쌍의 클래스를 호출 할 수 있습니다.

파트 II : 실험 부분

실험 1 :  제 8 장 샘플 프로그램, 시험 절차 및 코드 주석을 소개합니다.

시험 절차 1 :

교과서 실행, 디버깅, 편집 311312 페이지 코드, 프로그램의 결합 된 결과 프로그램을 이해를;

일반 클래스 정의와에서 사용하는 코드에 주석을 추가;

정의를 잡고 일반적인 클래스로 사용합니다.

다음과 같이 코드입니다 :

PairTets1 :

pair1 패키지; 

/ ** 
 * @version 1.01 2012-01-26 
 * @author 케이는 HORSTMANN 
 * / 
공용 클래스 PairTest1 
{ 
   공공 정적 무효 메인 (문자열 []에 args) 
   { 
      문자열 [] = {단어 "마리아", "HAD" "A", "작은", "램"} 
      쌍 <문자열> mm = ArrayAlg.minmax (단어) 
      에서 System.out.println ( "분 ="+ mm.getFirst ()) 
      에서 System.out.println ( "MAX ="+ mm.getSecond ()); 
   } 
} 

클래스 ArrayAlg 
{ 
	/ ** 
	     * 캐릭터 어레이의 최소 및 최대 값을 가져. . 
	     문자열 파라미터 : 어레이는 A 
	     * @return 널 A는 널 (null) 또는이 들어 비우면, 최소 및 최대를 갖는  
     * /
   공공 정적 페어 <
   { 
      경우 (A == 널 || a.length == 0)는 null; 
      문자열 분 A = [0]; 
      문자열은 최대 = [0]; 
      위한 (INT 난 = 1; I <a.length; I ++) 
      { 
         경우 (min.compareTo (a [I])> 0) 분 = A [I]; 
         경우 (max.compareTo (a [I]) <0) 최대 = A [I]; 
      } 
      리턴 켤레 <> (최소, 최대); 
   } 
}

쌍:

pair1 패키지; 

/ ** 
 * @version 1.00 2004년 5월 10일 
 케이 HORSTMANN @author * 
 * / 
공용 클래스 쌍 <T> // 정의하는 제네릭 클래스가 소개합니다 형 T의 변수 
{ 
   개인 먼저 T; 
   SECOND T 개인은; 
 // 가변 형식을 사용하는 형태에있어서의 복귀 형 가변 지정된 
   공공 쌍 () {; SECOND = NULL; 첫째 = NULL} 
   공공 쌍 (T 먼저 SECOND T)를 = {먼저 this.first; this.second을 = SECOND} 

   공용 T getFirst와는 () {우선 반환} 
   공용 T getSecond () {복귀 SECOND} 

   공개 무효 setFirst (T NEWVALUE) {먼저 = NEWVALUE} 
   공개 무효 setSecond (T NEWVALUE) {SECOND = NEWVALUE} 
}

  다음과 같이 프로그램의 결과는 다음과 같습니다

쌍 클래스 꺽쇠 괄호로 묶인 형태의 변수 T를 (<>) 도입하고, 클래스 이름을 따른다. 일반 클래스는 변수의 복수 종류의를 가질 수 있습니다. 예를 들어, 상기 클래스는 상기 제 도메인과 제 도메인이 다른 종류를 사용할 상기 쌍을 정의 할 수있다 :

공용 클래스 쌍 <T, U> {......} 

메소드의 클래스 정의에 반환 유형 및 종류 필드와 로컬 변수는 변수 타입을 지정. 예를 들어 : 제 전용 T //는 입력 변수를 사용

변수의 다른 종류의 특정 유형 예를 들어, 제네릭 형식을 인스턴스화 할 수 : 쌍 <문자열> 

시험 절차 2 :

, 편집 디버깅 및 실행 교과서 315 PairTest2 프로그램 프로그램을 이해의 결합 된 결과;

일반적인 프로그래밍 코드에서의 관련 주석을 추가;

일반적인 방법과 목적으로 정의 된 변수의 일반적인 정의를 알아보십시오.

다음과 같이 코드입니다 :

PairTest2 :

pair2 패키지; 

java.time을 가져옵니다. *; 

/ ** 
 * @version 2015년 6월 21일 1.02 
 * @author 케이 HORSTMANN 
 * / 
공용 클래스 PairTest2 
{ 
   공공 정적 무효 메인 (문자열 []에 args) 
   { 
      LOCALDATE [] 생일 = 
         { 
            LocalDate.of (1906, 12, 9) // G. 호퍼 
            LocalDate.of (1815, 12, 10), // A. 난봉꾼 
            LocalDate.of (1903, 12, 3), // J. 폰 노이만 
            LocalDate.of (1910, 6, 22), // K. 추제 
         }; 
      페어 <LOCALDATE> mm = ArrayAlg.minmax (생일); //实例化对象mm 
      에서 System.out.println ( "분 ="+ mm.getFirst ()); 
      에서 System.out.println ( "MAX ="+ mm.getSecond ()); 
   } 
}

ArrayAlg 클래스 
{ 
	 / ** 
	                       최소 및 유형 T 배열 객체의 최대 값을 얻는다. 
	       @param T 형 개체 어레이 
	       A가 널이거나 비우면 @return 귀무 들어, 최소 및 최대를 갖는 
    * / 
   페어 <T> MINMAX (T [] A) <T가이 대등 연장> 공용 static 
   { 
      IF (A == 널 || a.length == 0)는 null; 
      T 분 = A [0], 
      T 최대 = A [0] 
      에 대한 (INT I = 1]. I <a.length; I ++) 
      { 
         IF는 (min.compareTo (A는 [I])는> 0) 분 = A [I]는, 
         IF (max.compareTo (A는 [I])는 <0) 최대 = A [I]는 
      } 
      (최소 새로운 켤레 <리턴>을 맥스); 
   } 
} 

쌍:

pair2 패키지; 

/ ** 
 * @version 1.00 2004년 5월 10일 
 케이 HORSTMANN @author * 
 * / 
공용 클래스 쌍 <T> // 정의하는 제네릭 클래스가 소개합니다 형 T의 변수 
{ 
   개인 먼저 T; 
   SECOND T 개인은; 
 // 가변 형식을 사용하는 형태에있어서의 복귀 형 가변 지정된 
   공공 쌍 () {; SECOND = NULL; 첫째 = NULL} 
   공공 쌍 (T 먼저 SECOND T)를 = {먼저 this.first; this.second을 = SECOND} 

   공용 T getFirst와는 () {우선 반환} 
   공용 T getSecond () {복귀 SECOND} 

   공개 무효 setFirst (T NEWVALUE) {먼저 = NEWVALUE} 
   공개 무효 setSecond (T NEWVALUE) {SECOND = NEWVALUE} 
}  

다음과 같이 프로그램의 결과는 다음과 같습니다

 

일반적인 방법은 일반적인 카테고리로 정의 될 수 있고, 또한 일반 클래스를 정의 할 수있다 (방법 이름 :. 문자열 중간 = ArrayAlg <문자열> getMiddle 앞에 각괄호의 특정 유형에 일반적인 방법을 호출 할 때 "존", "Q.", "공개")

이 경우에, 메소드 호출 <문자열> 유형 파라미터를 생략 할 수있다.

전체 클래스의 유효한 일반 제네릭 클래스 정의. 이 방법을 사용하는 경우, 특정 개체 유형의 제네릭 클래스가 수정되었습니다 조작 할 수있는 모든 유형의 명확한 운영한다.

위해서는 다른 방법이 다른 유형을 작동 할 수 있도록하고, 종류는 불확실합니다. 제네릭은 다음 방법을 정의 할 수 있습니다.

* E는 확장 : E는 E 형 또는 상한의 서브 타입을 수신 할 수있다.
* 슈퍼 E : 부모 유형 E 또는 형식 E는 하한을받을 수 있습니다.

시험 절차 3 :

교과서를 335 PairTest3 시운전으로, 프로그램의 결합 된 결과는 프로그램을 이해;

와일드 카드 유형 정의 및 사용을 이해.

 다음과 같이 코드입니다 :

PairTest3 :

pair3 패키지; 

/ ** 
 * @version 1.01 2012-01-26 
 * @author 케이 HORSTMANN 
 * / 
공용 클래스 PairTest3 
{ 
   공공 정적 무효 메인 (문자열 []에 args) 
   { 
      var에 대표 이사 = 새로운 관리자 ( "거스 욕심", 800000, 2003, 12 15); 
      VAR의 최고 재무 책임자 (CFO)는 새로운 관리자 ( "시드 음흉", 600000, 2003, 12, 15) =; 
      VAR 친구 = 켤레 <관리자> (CEO, CFO);      
      printBuddies (친구); 

      ceo.setBonus (1000000); 
      cfo.setBonus (500,000); 
      관리자 [] = {관리자 CEO, CFO}; 

      VAR 결과 새로운 쌍 <직원> () =; 
      minmaxBonus (관리자 결과); 
      에서 System.out.println ( "첫 번째"+ result.getFirst ().
         + "초". result.getSecond + () getName ());
      maxminBonus (관리자 결과); 
      에서 System.out.println ( "최초"+ result.getFirst () getName (). 
         + "초". result.getSecond + () getName ()); 
   } 

   공공 정적 무효 printBuddies (쌍 p <직원 연장?>) //通配符类型解决了不能将子类传递给父类
   { 
      직원 제 p.getFirst = (); 
      종업원 초 = p.getSecond (); 
      에서 System.out.println (first.getName () + "및"+ second.getName () +는 "친구이다."); 
   } 

   공공 정적 무효 minmaxBonus (관리자 []는, 한 쌍 결과 <슈퍼 관리자?>) 
   { 
      경우 (a.length == 0) 돌려 준다 
      관리자 분 A = [0]; 
      관리자가 최대 = [0]; 
      (INT 위해 난 = 1; I <a.length; 
      { 
         경우 (min.getBonus ()> A [i]를 .getBonus ()) 분 = A [I]; 
         경우 (max.getBonus () <A [i]를 .getBonus ()) 최대 = A [I]; 
      } 
      result.setFirst (분); 
      result.setSecond (최대); 
   } 

   공공 정적 무효 maxminBonus (관리자 []는, 한 쌍 결과 <슈퍼 관리자?>) 
   { 
      minmaxBonus (a, 결과); 
      PairAlg.swapHelper (결과); // SavaHelp捕获通配符类型
   } 
//无法写入公共静态<T超级管理器> ... 
} 

클래스 PairAlg 
{ 
   공공 정적 부울 hasNulls (<?> 쌍 P) 
   { 
      복귀 p.getFirst () == 널 || p.getSecond () == 널; 
   }

   공공 정적 무효 스왑 (쌍 p <?>) {swapHelper (p); } 

   공용 static <T> 공극 swapHelper (페어 <T> P) 
   { 
      T = t p.getFirst (); 
      p.setFirst (p.getSecond ()); 
      p.setSecond (t); 
   } 
}

쌍:

pair3 패키지; 

/ ** 
 * @version 1.00 2004년 5월 10일 
 케이 HORSTMANN @author * 
 * / 
공용 클래스 쌍 <T> // 정의하는 제네릭 클래스가 소개합니다 형 T의 변수 
{ 
   개인 먼저 T; 
   SECOND T 개인은; 
 // 가변 형식을 사용하는 형태에있어서의 복귀 형 가변 지정된 
   공공 쌍 () {; SECOND = NULL; 첫째 = NULL} 
   공공 쌍 (T 먼저 SECOND T)를 = {먼저 this.first; this.second을 = SECOND} 

   공용 T getFirst와는 () {우선 반환} 
   공용 T getSecond () {복귀 SECOND} 

   공개 무효 setFirst (T NEWVALUE) {먼저 = NEWVALUE} 
   공개 무효 setSecond (T NEWVALUE) {SECOND = NEWVALUE} 
}

종업원:

pair3 패키지; 

java.time을 가져옵니다. *; 

공용 클래스 사원 
{   
   개인 문자열 이름; 
   개인 이중 급여; 
   개인 LOCALDATE hireDay; 

   공무원 (문자열 이름을 두 번 급여, INT 년, INT 월, INT 일) 
   { 
      this.name = 이름; 
      this.salary = 급여; 
      hireDay = LocalDate.of (년, 월, 일); 
   } 

   공공 문자열 getName () 
   { 
      반환 이름; 
   } 

   공공 더블 getSalary () 
   {   
      반환 급여; 
   } 

   공공 LOCALDATE getHireDay는 () 
   {   
      hireDay를 반환; 
   }

   공공 무효 raiseSalary (더블 byPercent) 
   {   
      이중 레이즈 = 급여 * byPercent / 100; 
      급여 + = 인상; 
   } 
}

매니저:

pair3 패키지; 

공용 클래스 관리자는 직원 확장 
{   
   개인 더블 보너스; 

   / ** 
      @param 이름 직원의 이름 
      @param 급여 급여 
      파라미터 : 올해 고용 년 
      파라미터 : 달 고용 개월 
      파라미터 : 하루 대여 일 
   * / 
   공공 관리자 (문자열 이름을 두 번 급여, INT 년, INT 월, INT 하루) 
   {   
      슈퍼 (이름, 급여, 년, 월, 일); 
      보너스 = 0; 
   } 

   공개 이중 getSalary () 
   { 
      이중 baseSalary super.getSalary = (); 
      반환 baseSalary + 보너스; 
   } 
 
   공개 무효 setBonus (더블 b)
   {   
      보너스 = B; 
   } 

   공공 더블 getBonus () 
   {   
      반환 보너스; 
   } 
}

  다음과 같이 프로그램의 결과는 다음과 같습니다

당신이 시간에 전달 된 실제 매개 변수가없는 경우, 형식 인수를 전달해야한다 제네릭 클래스, 제네릭 클래스를 사용하려는 경우, 컴파일러는 일반적인 경고를 제시 할 것이다.

와일드 카드를 사용하는 경우 :

사용은 상대적으로 까다로운 API에서 와일드 카드,하지만 와일드 카드는 많은 유연한 API 코드를 만들 수 있습니다.

당신이 널리 사용되는 라이브러리를 작성하는 경우, 와일드 카드를 사용하는 것이 적합해야합니다. 와일드 카드 원칙이있다 즉 :. 프로듀서 확장 해, 소비자 슈퍼 (PECS)는 전형적인 생산자 소비자 모델의 문제입니다.

 다양한 일반적인 목록의 상위 클래스를 표현하기 위해, 와일드 카드의 종류를 사용할 수 있습니다, 인수 세트로 물음표 기록, 목록을 입력 통과 (?) : "?"목록이 물음표의 요소를 (목록 요소 유형을 알 수없는 의미) 유형은 어떤 유형을 일치시킬 수 있습니다.

실험 요약 : (15 점)

이번 주 학습, 나는이 제네릭 프로그래밍, 제네릭 클래스 및 재사용, 형태의 안전성 및 효율성과 함께 일반적인 방법에 대해 배웠 일반 클래스는 권투와 언 박싱 값 유형을 지도록 강요하거나하지 않습니다 참조 형은 너무 성능을 프로그래밍을 개선하기 위해, 아래로 주조된다. 나는 제네릭 프로그래밍의 장점은 여러 가지가 될 수있는 코드를 작성하는 것입니다 생각 객체의 재사용 유형. 코드의 양이 증가 가독성을 줄일 수있다. 교사 제네릭 클래스를 듣고, 이론 수업 학습에서 특히 어려운 일이 아니다,하지만 당신은 실험 과정에서 프로그램을 실행할 때, 너무 자신의 프로그램에 여전히 큰 문제가 프로그램의 이해 없습니다. 연구 후, 나는이 지식을 이해하기 위해 더 많은 프로그램을 연습합니다.

추천

출처www.cnblogs.com/qyhq/p/11818609.html