>Java >java지도 시간 >03.Java 기초 - 다형성

03.Java 기초 - 다형성

黄舟
黄舟원래의
2017-02-27 10:13:111398검색

기본 개념

다형성은 동일한 동작이 여러 가지 다른 표현이나 형태를 가질 수 있는 능력입니다.

다형성은 객체의 다양한 표현을 구현한 것입니다.

다형성 조건: 상속, 재작성, 상향 변환

동적 바인딩은 다형성 구현의 특정 형태입니다.


예제 연구

다음은 위 개념을 검증하기 위한 예이다.

// 车class Car {    public void show(){
        System.out.println("This is a car");
    }
}//丰田class Toyota extends Car{    public void show(){
        System.out.println("This is a Japan car");
    }
}//别克class Buick extends Car{    public void show(){
        System.out.println("This is a USA car");
    }
}public class Test{  
    public static void main(String[] args) {
        Car c1 = new Toyota();
        Car c2 = new Buick();
        c1.show();
        c2.show();        // 打印内容:
        // This is a Japan car
        // This is a USA car
    }
}

코드를 살펴보면 Car의 show 메소드를 호출하면 클래스의 다형성을 반영하는 다양한 내용이 출력됩니다. 동시에 이 예는 다형성이 발생하기 위한 세 가지 기본 조건도 충족합니다.

  • 상속됨: Toyota와 Buick은 Car에서 상속

  • 다시 쓰기: 토요타와 뷰익이 자동차의 쇼 방식을 다시 쓴다

  • 상향적 변신: 도요타와 뷰익을 만들 때 상향이 일어난다. 뷰익 객체 변환


일반적인 주제를 살펴보겠습니다.

class A {    public String show(A obj) {        return ("A and A");
    }    public String show(D obj) {        return ("A and D");
    }
}

class B extends A {    public String show(A obj) {        return ("B and A");
    }    public String show(B obj) {        return ("B and B");
    }
}

class C extends B {
}

class D extends B {
}public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();        // 1.因此 B 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(b));        // 2.因为 C 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(c));        // 3.调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a1.show(d));        // 4.因为 B 向上转型成 A, 且 B 是 A 的子类,调用类 A 的 show(A obj) 方法
        // 但是由于 B 中重写了 show(A obj) 方法,导致运行期间发生的动态绑定,调用 类 B 的 show(A obj) 方法
        // ,输出:B and A
        System.out.println(a2.show(b));        // 5.同上
        System.out.println(a2.show(c));        // 6.B 向上转型成 A,默认调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a2.show(d));        // 7.调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(b));        // 8.C 是 B 的子类,调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(c));        // 9.调用继承自类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(b.show(d));

    }
}

생성자와 다형성

마찬가지로

class Parent {    void print() {
        System.out.println("I am a Parent");
    }

    Parent() {
        print();
    }
}

class Son extends Parent {    int num = 1;    // 重写(override)了父类方法
    void print() {
        System.out.println("I am a Son " + num);
    }

    Son() {
        print();
    }
}public class Test {
    public static void main(String[] args) {
        Son son = new Son();        /**
         * 输出内容: 
         * I am a Son 0
         * I am a Son 1
         */
    }
}

를 예제를 통해 살펴보면, Parent의 생성자가 동적 바인딩으로 인해 Son의 print()를 호출하는 것을 볼 수 있습니다. num이 초기화되지 않았기 때문에 값은 0입니다.

기본 개념

다형성은 동일한 동작이 여러 가지 다른 표현이나 형태를 가질 수 있는 능력입니다.

다형성은 객체의 다양한 표현을 구현한 것입니다.

다형성 조건: 상속, 재작성, 상향 변환

동적 바인딩은 다형성 구현의 특정 형태입니다.


예시 연구

다음은 위의 개념을 검증하기 위한 예이다.

// 车class Car {    public void show(){
        System.out.println("This is a car");
    }
}//丰田class Toyota extends Car{    public void show(){
        System.out.println("This is a Japan car");
    }
}//别克class Buick extends Car{    public void show(){
        System.out.println("This is a USA car");
    }
}public class Test{  
    public static void main(String[] args) {
        Car c1 = new Toyota();
        Car c2 = new Buick();
        c1.show();
        c2.show();        // 打印内容:
        // This is a Japan car
        // This is a USA car
    }
}

코드를 살펴보면 Car의 show 메소드를 호출하면 클래스의 다형성을 반영하는 다양한 내용이 출력됩니다. 동시에 이 예는 다형성이 발생하기 위한 세 가지 기본 조건도 충족합니다.

  • 상속됨: Toyota와 Buick은 Car에서 상속

  • 다시 쓰기: 토요타와 뷰익이 자동차의 쇼 방식을 다시 쓴다

  • 상향적 변신: 도요타와 뷰익을 만들 때 상향이 일어난다. 뷰익 객체 변환


일반적인 주제를 살펴보겠습니다.

class A {    public String show(A obj) {        return ("A and A");
    }    public String show(D obj) {        return ("A and D");
    }
}

class B extends A {    public String show(A obj) {        return ("B and A");
    }    public String show(B obj) {        return ("B and B");
    }
}

class C extends B {
}

class D extends B {
}public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();        // 1.因此 B 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(b));        // 2.因为 C 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(c));        // 3.调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a1.show(d));        // 4.因为 B 向上转型成 A,应该是调用类 A 的 show(A obj) 方法
        // 由于 B 中重写了 show(A obj) 方法,实际调用 类 B 的方法,,输出:B and A
        System.out.println(a2.show(b));        // 5.同上
        System.out.println(a2.show(c));        // 6.B 向上转型成 A,默认调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a2.show(d));        // 7.调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(b));        // 8.C 是 B 的子类,调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(c));        // 9.调用继承自类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(b.show(d));

    }
}

생성자와 다형성

마찬가지로

class Parent {    void print() {
        System.out.println("I am a Parent");
    }

    Parent() {
        print();
    }
}

class Son extends Parent {    int num = 1;    // 关键 -> 重写了父类的方法
    void print() {
        System.out.println("I am a Son " + num);
    }

    Son() {
        print();
    }
}public class Test {
    public static void main(String[] args) {
        Son son = new Son();        // 输出内容: 
        // I am a Son 0
        // I am a Son 1
    }
}

의 분석 결과를 살펴보기 위해 예제를 사용합니다. 실제로는 세 가지 내용이 포함됩니다.

  • Son 인스턴스화 과정에서 생성자는 Parent, Parent의 생성자가 먼저 실행됩니다.

  • Son이 인쇄 방법을 재정의하므로 Parent는 Son의 재작성 방법을 호출합니다.

  • Parent에서는 num이 아직 초기화되지 않았기 때문에 값이 0입니다.

기본 개념

다형성은 동일한 동작이 여러 가지 다른 표현이나 형태를 갖는 능력입니다.

다형성은 객체의 다양한 표현을 구현한 것입니다.

다형성 조건: 상속, 재작성, 상향 변환

동적 바인딩은 다형성 구현의 특정 형태입니다.


예제 연구

다음은 위 개념을 검증하기 위한 예이다.

// 车class Car {    public void show(){
        System.out.println("This is a car");
    }
}//丰田class Toyota extends Car{    public void show(){
        System.out.println("This is a Japan car");
    }
}//别克class Buick extends Car{    public void show(){
        System.out.println("This is a USA car");
    }
}public class Test{  
    public static void main(String[] args) {
        Car c1 = new Toyota();
        Car c2 = new Buick();
        c1.show();
        c2.show();        // 打印内容:
        // This is a Japan car
        // This is a USA car
    }
}

코드를 살펴보면 Car의 show 메소드를 호출하면 클래스의 다형성을 반영하는 다양한 내용이 출력됩니다. 동시에 이 예는 다형성이 발생하기 위한 세 가지 기본 조건도 충족합니다.

  • 상속됨: Toyota와 Buick은 Car에서 상속

  • 다시 쓰기: 토요타와 뷰익이 자동차의 쇼 방식을 다시 쓴다

  • 상향적 변혁: 도요타와 뷰익을 만들 때 상향이 일어난다. 뷰익 객체 변환


일반적인 주제를 살펴보겠습니다.

class A {    public String show(A obj) {        return ("A and A");
    }    public String show(D obj) {        return ("A and D");
    }
}

class B extends A {    public String show(A obj) {        return ("B and A");
    }    public String show(B obj) {        return ("B and B");
    }
}

class C extends B {
}

class D extends B {
}public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();        // 1.因此 B 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(b));        // 2.因为 C 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(c));        // 3.调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a1.show(d));        // 4.因为 B 向上转型成 A, 且 B 是 A 的子类,调用类 A 的 show(A obj) 方法
        // 但是由于 B 中重写了 show(A obj) 方法,导致运行期间发生的动态绑定,调用 类 B 的 show(A obj) 方法
        // ,输出:B and A
        System.out.println(a2.show(b));        // 5.同上
        System.out.println(a2.show(c));        // 6.B 向上转型成 A,默认调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a2.show(d));        // 7.调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(b));        // 8.C 是 B 的子类,调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(c));        // 9.调用继承自类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(b.show(d));

    }
}

생성자와 다형성

마찬가지로

class Parent {    void print() {
        System.out.println("I am a Parent");
    }

    Parent() {
        print();
    }
}

class Son extends Parent {    int num = 1;    // 重写(override)了父类方法
    void print() {
        System.out.println("I am a Son " + num);
    }

    Son() {
        print();
    }
}public class Test {
    public static void main(String[] args) {
        Son son = new Son();        /**
         * 输出内容: 
         * I am a Son 0
         * I am a Son 1
         */
    }
}

를 예제를 통해 살펴보면, Parent의 생성자가 동적 바인딩으로 인해 Son의 print()를 호출하는 것을 볼 수 있습니다. num이 초기화되지 않았기 때문에 값은 0입니다.

분석 결과에는 실제로 세 가지 내용이 포함됩니다.

  • Son 인스턴스화 과정에서 Parent 생성자와 Parent 생성자가 먼저 실행됩니다.

  • Son이 인쇄 방법을 재정의하므로 Parent는 Son의 재작성 방법을 호출합니다.

  • Parent에서는 num이 아직 초기화되지 않았기 때문에 값이 0입니다.

위 내용은 03.Java 기본 - 다형성 컨텐츠에 대한 자세한 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:02.Java 기초 - 상속다음 기사:02.Java 기초 - 상속