탄생을 위한 연산자 instanceof(Java)~instanceof 연산자 사용법~

10943 단어 instanceofJava

주의 사항


사용할 범주에 대한 자세한 정보


이 기사는'매우 통속적이고 알기 쉽게 썼다.'에 이어 썼다.이에 따라 일부 소스 코드(Cat 클래스, Dog 클래스, Life form 클래스) 등은 맨 아래'설명에 사용된 학급 등에 대한 상세 정보'항목에 기재된다.
이 글은 "instanceof 연산자"에서 시작합니다.

업로드 및 다운로드 정보


이 글에서 업로드와 다운로드 내용을 살짝 복습했지만
자세히 알고 싶으신 분들은 다음 기사를 보세요.
- 「 규격 변경 시 변경량을 줄일 수 있는 업로드 캐릭터(Java)
- 「 Java에 대한 리플레이를 알기 쉽게 썼어요.

개발 환경


텍스트 편집기 Atom 사용(이하 atom-vertion 실행 결과)


Atom : 1.28.0
Electron: 2.0.3
Chrome : 61.0.3163.100
Node : 8.9.3

다음 명령은 "java-version" 실행 결과입니다~


java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

업로드 및 다운로드


instanceof 설명에 들어가기 전에 간단하게 복습을 해볼게요.


instanceof 연산자도 상방, 하방과 밀접한 관계를 가진다.
그러니 조금만 복습해 봅시다.
업로드란 하위 클래스 실례에서 부모 클래스 실례를 초기화하는 것이다.
설계 단계에서 하위 클래스를 얼마나 만들 수 있는지 결정하지 않은 경우에도 매개변수를 상위 인스턴스에 설정하여 하위 인스턴스를 인수인계할 수 있습니다.
하지만 이것도 문제다.며칠 전 투고한'Java에 대한 리플레이를 알기 쉽게 썼어요.에서 설명한 바와 같이 캐릭터를 업로드한 상태에서 하위 클래스만의 함수를 호출할 수 없다.
거기서 카운트다운...
다음은 본론.

안에 뭐예요?


다음 절차를 보고 무슨 일이 일어날지 예상해 보세요.
또 학급에 대한 자세한 내용은'설명에 사용된 학급 등에 대한 상세한 정보'에 기재했다.
Main.java
public class Main{
  public static void main(String[] args){
    Life_form life_form = new Life_form();

    java.util.Random r = new java.util.Random();
    if( r.nextInt(2) == 0 ){
      life_form = new Cat();

    }else{
      life_form = new Dog();

    }

//ダウンキャストからの独自関数呼び出し。
    Cat lifo = (Cat)life_form;
    lifo.catPunch();

  }
}
실행 결과는 다음과 같다.

실행 결과



절차를 설명해 주세요.
임의의 숫자를 생성하고 0이면 Cat 인스턴스, 1이면 Dog 인스턴스를 업데이트합니다.
그런 다음 Cat 클래스를 아래로 할당하여 Cat 클래스의 고유한 함수인 catPunch()를 호출합니다.
실행해보면 캣펀치()가 잘 호칭되는 경우와 ClassCastException 오류로 변하는 경우 두 가지로 나뉜다.
생성된 인스턴스가 Cat인 경우에만 제대로 작동할 수 있습니다.
역설적으로 Dog 인스턴스가 생성되면 오류가 된다는 것이다.
당연하죠.if문의 네모를 보면 알 수 있어요, Life.form 인스턴스의 솔리드에도 Dog 인스턴스가 있을 수 있습니다.
Cat 인스턴스를 강제로 제거해도 솔리드가 Dog 인스턴스인 경우 Cat 인스턴스가 될 수 없습니다.
자류만의 함수라고 부르려면 친류 실례의 실체가 무엇인지 알아야 한다.

instanceof 연산자


이렇게 해서 가까스로 업로드를 통해 하위 클래스 실례를 망라하더라도 내용을 모르면 적당한 분배를 할 수 없고 결과는 하위 클래스만의 함수라고 할 수 없다.
이거 불편해요.
나는 실례의 실체를 조사하고 싶다.
그걸 실현하기 위해서 instanceof 연산자가 있습니다.
インスタンス instanceof 型名
이 문장은 실례의 실체가 무엇인지 조사할 수 있다.
실례의 실체와 모델이 일치하면 진짜가 된다.만약 일치하지 않는다면, 가짜는 당연히 반환값으로 되돌아올 것이다.
이에 근거하여 방금 수정한 프로그램은 다음과 같다.

성공 사례


Main.java
public class Main{
  public static void main(String[] args){
    Life_form life_form = new Life_form();

    java.util.Random r = new java.util.Random();
    if( r.nextInt(2) == 0 ){
      life_form = new Cat();

    }else{
      life_form = new Dog();

    }

//インスタンス instanceof 型名
    if( life_form instanceof Cat ){
      Cat cat = (Cat)life_form;
      cat.catPunch();

    }else{
      Dog dog = (Dog)life_form;
      dog.dogAttack();

    }

  }
}

실행 결과



그래, 실체적인 행동에 따라 출력된다.
주의해야 할 것은if문장 조건식의instanceof 연산자는 적당한 하행 분배를 실현할 수 있다.
또한 생성된 실례 단독 함수가 정확하게 불리는지 확인해 주십시오.
이렇게 하면 instanceof 연산자를 사용하면 안전한 하행 분배를 실현할 수 있다.

총결산

  • instanceof 연산자는 インスタンス instanceof 型名 에서 사용되고 실례의 실체와 유형 이름이 사실이라면 반환값으로 가변한다.
  • instanceof 연산자를 사용하면 실례적인 실체에 따라 행동을 바꿀 수 있다.
  • instanceof 연산자를 사용하여 업로드된 하위 클래스의 실례적인 함수를 사용하고자 할 때 안전한 하행 체인을 실현할 수 있습니다.
  • 설명에 사용된 카테고리 등 상세 내용


    Life_form.java
    //親クラス 
    public class Life_form{
      public void makeSound(){
        System.out.println("???");
      }
    }
    
    Cat.java
    public class Cat extends Life_form{
      @Override
      public void makeSound(){
        System.out.println("にゃあ");
      }
    
      public void catPunch(){
        System.out.println("ネコパン");
      }
    
    }
    
    Dog.java
    public class Dog extends Life_form {
      @Override
      public void makeSound(){
        System.out.println("クゥーン!");
      }
    
      public void dogAttack(){
        System.out.println("かみつく");
      }
    }
    

    좋은 웹페이지 즐겨찾기