다형성 및 인터페이스
결합 방법으로서. 프로그램을 실행하기 전에, 바인딩의 사용은, 우리는 사전에 번들로 문의하십시오. 프로그램이 실행되는 경우에만 동적 결합 효과를 사용하여 동적 바인딩 자바있다. 자바는 모든 방법들은 정적 및 최종 외에뿐만 아니라 전용 방법에서, 동적 바인딩이다. 상위 클래스는 방법 A를 가지고 있다면, 서브 클래스가 적용되지 않으며, 다음 업 캐스팅함으로써, 상위 클래스의 메소드를 호출 할 것)을가 (전화 포함한다면, 서브 - 카테고리 메소드가 호출된다.
연습 2
패키지 다형; 공공 클래스 원이 확장 모양 { 공공 무효 추첨 () {에서 System.out.println ( "Circle.draw ()" );} 공공 무효 삭제 () {에서 System.out.println ( "Circle.erase ()" );} 공공 무효 인쇄 () {에서 System.out.println는 ( "이 원 프린트입니다" ); } } / * 출력 : Triagnle.draw () 이 인쇄물 Triagnle.draw () 이 인쇄물 Square.draw () 이 인쇄물 Triagnle.draw () 이 인쇄물 Square.draw () 이 인쇄물 Triagnle.draw ( ) 이 인쇄 인 Square.draw () 이 인쇄물 Triagnle.draw () 이 인쇄물 Circle.draw () 이 원형 인 잉크 * /
Exercise10
패키지 다형; 공용 클래스 Exercise10 { 공공 정적 무효 메인 (문자열 []에 args) { 한 t = 새로운 두 (); 고마워(); // 출력 : 이는 두 개의 B } } 클래스 하나 { 무효화 A () { B (); } 공극 B () { 에서 System.out.println는 ( "이고 이것은" ); } } 클래스 두 연장 하나 { 공극 B () { 에서 System.out.println는 ( "이 두 B는"); } }
2. 부모 클래스에 서브 클래스 업 캐스팅 참조가, 모든 데이터 필드는 다중 상태의 규칙을 준수하지 않을 경우 직접 부모 클래스가 아닌 서브 클래스의 데이터 필드를 호출 부모 클래스에 대한 참조를 호출합니다. 그래서 관심을 지불, 그것은 변수 데이터 필드와 부모 클래스의 서브 클래스 부모 클래스 데이터 필드가 숨겨져 있도록로 설정하거나 비공개로 설정되어 이름을하지 않는 것이 좋습니다.
3. 호출 부모 클래스 생성자 후, 방법은 모든 전화도 오버라이드 (override)됩니다 실제 시퀀스 생성자 호출이다. 다음은 다른 초기화입니다.
인터페이스
클래스는 다음이 클래스는 추상 클래스로 선언되어야한다 추상 메소드를 가지고 한 번 1. 추상 메소드 (abstract 메소드)는, 추상 클래스는 추상 클래스 자체가 미완성 클래스이기 때문에 인스턴스화 할 수 없습니다. 당신이 추상 클래스에서 상속하는 경우, 그것은 추상 메소드를 모두 구현해야합니다. 클래스는 추상 메소드없는 경우에도, 추상 (추상) (즉,이 형태가 없습니다 인스턴스화)를 선언 할 수도 있습니다. 서브 클래스 호출 (메소드가 서브 클래스에서 올바른 재정의 경우) 생성자는 부모 클래스 추상 메소드, 자동 완성 메소드를 호출하면 03, 생성자는 추상 상위 클래스를 호출 연습에서 볼 수있다 .
Exercise02
패키지 인터페이스; 공공 클래스 Exercise02가 { // 작동하지 않습니다 공공 정적 무효 메인 (문자열 []에 args)를 { A A = 새 A (); //은 (A)의 추상 클래스 초기화 할 수 없습니다 } } 추상 클래스 { 무효 B () { 에서 System.out.println을 ( "이것은이다" ); } }
Exercise03
패키지 인터페이스; 공용 클래스 Exericse03는 연장 X { 개인 INT의 t = 1 ; 공극 인쇄 ( INT X) { t = X; 에서 System.out.println (t); } 공공 정적 무효 메인 (문자열 []를 인수) { 새로운 Exericse03 (). 잉크 (3); // 출력 : 2,3 } } 추상 클래스 X { X () { 프린트 ( 2 ); } 추상적 무효 인쇄 ( INT나는); }
4. 인터페이스는 데이터 필드를 포함 할 수 있지만 있어야 정적 , 최종 . 상속 구현 뒤에 쉼표로 연결하는 인터페이스의 수, 할 수있다, 인터페이스 경우는 상속, 하나의 상속 때 있습니다. 당신이 엔티티 클래스 (비 인터페이스) 인터페이스와 클래스에서 상속해야하는 경우, 엔티티 클래스는 사설을 필요로한다.
실제 응용 프로그램 인터페이스 클래스 또는 추상 클래스를 선택? 당신이에게 더 만들 수없는하려면 -defined 기본 클래스의 메서드 나 멤버 변수를 다음 인터페이스 클래스를 사용합니다.
인터페이스가 될 수 있지만 자바는 다중 상속을 다중 상속, 그래서 아무 다이아몬드 상속 문제를 지원하지 않기 때문에 또한, 그러나, 방법이 실현되지 않은, 인터페이스가 더 멤버 변수 없다는 것을 유의하고, 모든 방법은 매우 추상적입니다.
도메인 자동 정지 최종의 인터페이스의 예. 모든 인터페이스가 공개해야 인터페이스 모자이크. 인터페이스는 클래스에 포함되어있는 경우, 개인 외부 인터페이스는 클래스에서 구현되지 않습니다.
인터페이스와 팩토리 인터페이스의 사용에있어서 멀티플렉싱 될 수있다. 다음과 같습니다 :
클래스 XX는 확장 YY가 구현 AA, BB, CC ... NN을
수입 정적 net.mindview.util.Print *. ; 인터페이스 게임 { 부울 이동 (); } 인터페이스 GameFactory {게임 getGame를 (); } 클래스 체커 구현하는 게임 { 개인 INT 이동 = 0 ; 개인 정적 최종 INT MOVES = 3 ; 공공 부울 이동 () { 인쇄 ( "체커 이동"+ 이동); 반환 이동 ++! = 이동; } } 클래스 CheckersFactory는 구현 GameFactory을 { 공공 게임 getGame () { 반환 새 ) (체커; } } 클래스 체스 구현하는 게임 { 개인 INT 이동 = 0 ; 개인 정적 최종 INT MOVES = 4 ; 공공 부울 이동 () { 인쇄 ( "체스 이동"+ 이동); 반환 이동 ++! = 이동; } } 클래스 ChessFactory는 구현 GameFactory는 { 공공 게임 getGame는 () { 반환 새 ) (체스; } } 공개 클래스 게임 { 공공 정적 무효 에 PlayGame (GameFactory 공장) { 게임의 = factory.getGame (); 반면 (s.move ()) ; } 공공 정적 무효 메인 (문자열 []에 args) { PlayGame을 ( 새로운 CheckersFactory ()); 에 PlayGame ( 새 ChessFactory ()); } } / * 출력 : 체커 0 이동 체커 1 이동 이동 2 체커 체스 이동 0 체스 이동 한 체스 이동 2 체스 이동 3 * /// ~