다형성은 동일한 동작이 여러 가지 다른 표현이나 형태를 가질 수 있는 능력입니다.
다형성은 객체의 다양한 표현을 구현한 것입니다.
다형성 조건: 상속, 재작성, 상향 변환
동적 바인딩은 다형성 구현의 특정 형태입니다.
다음은 위 개념을 검증하기 위한 예이다.
// 车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)를 참고해주세요!