> Java > java지도 시간 > 본문

Java의 다형성 개념과 그 원리 구현에 대한 자세한 소개

黄舟
풀어 주다: 2017-04-13 09:57:58
원래의
1832명이 탐색했습니다.

JAVA의 다형성은 객체의 여러 표현을 구현한 것입니다. 객체 지향에서 가장 일반적인 다형성은 하위 클래스의 객체를 참조하기 위해 상위 클래스의 참조 를 사용할 때 발생합니다. 다음 글을 주로 소개하고 있습니다. 필요한 친구들은

을 참고하시면 됩니다. 1. 다형성이란?

1. 다형성의 정의

는 서로 다른 유형의 객체가 동일한 메시지에 응답하도록 하는 것을 의미합니다. 즉, 같은 메시지라도 보내는 객체에 따라 다양한 행동 방식을 채택할 수 있습니다. (메시지 보내기함수 호출입니다)

2. 다형성의 역할

유형 간 결합 관계 제거

3. 다형성 설명

소설 홍수, 예를 들어

어느 날 휴대전화에서 업데이트되는 여러 소설을 볼 수 있습니다. 예를 들어 The Great Master, Lord Snow Eagle, 용왕전설... 여기서는 다음과 같이 설명할 수 있습니다.

Novel a=대주군

Novel b=눈독수리

Novel c=Legend of the Dragon King

여기에 표시된 것은 다형성입니다. The Great Master, Lord Snow Eagle 및 Legend of the Dragon King은 모두 소설의 하위 범주를 참조할 수 있습니다. 이것이 다형성입니다. 런타임에만 참조 변수 가 가리키는 특정 인스턴스 개체

를 알 수 있습니다. 다형성에 대한 이해를 시작하려면, 반드시 "상향변형"이라는 것을 이해해야 합니다

위의 예에서 소설(XS)이 상위 카테고리인 대가(DZZ), 눈독수리왕(Snow Eagle Lord)입니다. (XYLZ) 및 Dragon King Legend(LWCS)는 모두 해당 하위 범주이므로 다음 코드를 정의합니다.

DZZ a=new DZZ();

이 내용이 낯설지 않습니다. 이는 큰 마스터 개체를 인스턴스화하는 것에 지나지 않습니다. 따라서 다음은 이 코드입니다.

XS a=new DZZ();

여기서는 이렇게 이해합니다. XS 유형 a는 여기에 정의되어 DZZ 개체 예를 가리킵니다. DZZ XS에서 를 상속하므로 DZZ는 자동으로 XS로 상향 변환될 수 있으므로 a는 DZZ 인스턴스 개체를 가리킬 수 있습니다. 이렇게 하면 매우 큰 이점이 있습니다. 상속에서는 하위 클래스가 하위 클래스를 가리키는 상위 클래스 참조 유형을 정의하는 경우 상위 클래스보다 더 강력한 기능을 제공할 수 있다는 것을 알고 있습니다. , 그러면 상위 클래스의 공통 기능을 참조할 수 있을 뿐만 아니라 하위 클래스

의 강력한 기능도 사용할 수 있습니다. 그러나 상향 변환에는 몇 가지 단점도 있습니다. , 이는 확실히 일부 메서드와 속성 의 손실로 이어질 것이며 결과적으로 해당 항목을 얻을 수 없습니다. 따라서 상위 클래스 유형의 적용은 상위 클래스에 정의된 모든 속성과 메소드 를 호출할 수 있으며 이는 하위 클래스

public class XS {

    public void fun1() {
      System.out.println("XS中的fun1");
      fun2();
    }


  public void fun2() {
     System.out.println("XS中的fun2");    
  }
}
로그인 후 복사
public class DZZ extends XS{

  /*
   * 子类重载父类方法
   * 父类中不存在该方法,向上转型后,父类是不能引用该方法的
   */
   public void fun1(String a) {
     System.out.println("DZZ中的fun1");
     fun2();
   }

   /*
    * 子类重写父类方法 
    * 调用必定使用这个方法
    */
   public void fun2() {
     System.out.println("DZZ中的fun2");
   }
}
로그인 후 복사
public class DuoTaiTest {

   public static void main(String[] args) {
     XS a=new DZZ();
     a.fun1();
  }
}
output:
XS中的fun1
DZZ中的fun2
로그인 후 복사

에만 존재하는 메소드 및 속성의 범위를 벗어납니다. 다형성을 위해 다음과 같이 요약할 수 있습니다.
하위 클래스를 가리키는 상위 클래스 참조가 상위 클래스로 변환되었습니다. 상위 클래스가 소유한 메소드와 속성, 하위 클래스에 존재하지만 하위 클래스에 있는 메소드에만 액세스할 수 있습니다. 상위 클래스에 없는 경우에만 액세스할 수 있으므로 메서드 오버로드에도 불구하고 이 참조를 사용할 수 없습니다. 하위 클래스가 상위 클래스의 일부 메서드를 재정의하는 경우 이러한 메서드를 호출할 때 하위 클래스에 정의된 메서드(동적 연결, 동적 호출)를 사용해야 합니다.

지향적인 경우 객체 다형성은 컴파일- 시간 다형성과 런타임 다형성은 정적이며, 이는 주로 메서드의 오버로딩을 의미하며, 이 함수는 편집 후에 두 가지 다른 기능이 됩니다. 런타임에는 다형성이 없습니다. 런타임 다형성은 동적이며 동적 바인딩을 통해 달성됩니다. 이를 다형성이라고 합니다.

2. 다형성 구현

1. 구현 조건

처음에 상속을 없앴습니다. 주의. 하위 클래스인 Father는 하위 클래스를 가리키는 상위 클래스 유형 참조를 작성할 수 있습니다. 이 참조는 하위 클래스나 상위 클래스에 동일한 메시지가 전송될 때 상위 클래스인 Father 객체와 하위 클래스 Child 객체를 모두 처리할 수 있습니다. 클래스, 객체가 사용될 때 객체는 자신이 속한 참조에 따라 다른 동작을 수행합니다. 이것이 다형성입니다. 즉, 다형성은 동일한 메시지가 서로 다른 클래스의 응답을 다르게 한다는 것을 의미합니다.

Java다형성을 달성하려면 세 가지 필수 조건이 있습니다: 상속, 재작성, 상향 변환

상속: in In 다형성, 상속 관계에 있는 하위 클래스와 상위 클래스가 있어야 합니다

재작성: 하위 클래스는 상위 클래스의 특정 메소드를 재정의하고, 이러한 메소드가 호출되면 하위 클래스의 메소드가 호출됩니다

向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法

只有满足了上述三个条件,我们才能够在同一个继承结构中使用同一的逻辑实现代码处理不同的对象,从而达到执行不同的行为

对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法

2.实现形式

继承

public class XS {

      private String name;

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public XS() {

    }

    public String drink() {
      return "你看的小说名字:"+getName();
    }

    public String toString() {
       return null;
    }


}
public class DZZ extends XS{


  public DZZ() {
    setName("DZZ");
  }

  public String drink() {
    return "你看的小说名字:"+getName();
  }

  public String toString() {

    return "小说名:"+getName();
  }
}
public class XYLZ extends XS{

  /**
   * 
   */
  public XYLZ() {
     setName("XYLZ");
  }

  public String drink() {
    return "你看的小说名字:"+getName();
  }

  public String toString() {

    return "小说名:"+getName();
  }
}   
public class DuoTaiTest {
    public static void main(String[] args) {
      XS [] xs=new XS[2];

      DZZ a=new DZZ();
      XYLZ b=new XYLZ();

      xs[0]=a;
      xs[1]=b;

      for(int i=0;i<2;i++) {
       System.out.println(xs[i].toString()+"::::"+xs[i].drink());
      }

      System.out.println("-------------------");
  }
}
ouput:
小说名:DZZ::::你看的小说名字:DZZ
小说名:XYLZ::::你看的小说名字:XYLZ
-------------------
로그인 후 복사

在上面的代码中DZZ,XYLZ继承XS 并且重写了drink(),toString()方法,程序运行结果是调用子类中方法,输出DZZ,XYLZ的名称,这就是多态的表现。不同的对象可以执行相同的行为,但是他们都需要通过自己的实现方式来执行,这就要得益于向上转型了

我们都知道所有的类都继承自超类Object,toString()方法也是Object中方法,当我们这样写时:

Object o = new DZZ();
System.out.println(o.toString());

output:
小说名:DZZ
로그인 후 복사

Object,XS,DZZ三者继承链关系是:DZZ—>XS—>Object。所以我们可以这样说:当子类重写父类的方法被调用时,只有对象继承链中的最末端的方法才会被调用。但是注意如果这样写:

Object o = new xs();

System.out.println(o.toString());

output:
null//因为DZZ并不存在于该对象继承链中
로그인 후 복사

所以基于继承实现的多态可以总结如下:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。

如果父类是抽象类,那么子类必须要实现父类中所有的抽象方法,这样该父类所有的子类一定存在统一的对外接口,但其内部的具体实现可以各异。这样我们就可以使用顶层类提供的统一接口来处理该层次的方法。

위 내용은 Java의 다형성 개념과 그 원리 구현에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿