เขียน Java (ทับ) และการบรรทุกเกินพิกัด (Overload)
Rewrite (แทนที่)
เขียนใหม่เป็น subclass ของขั้นตอนการดำเนินการเพื่อให้สามารถเข้าถึงวิธีการเรียนผู้ปกครองอีกครั้งเขียน! ค่าที่ส่งคืนและพารามิเตอร์จะไม่เปลี่ยนแปลง ว่าเป็นกรณีเดียวกันแกนเขียน!
เขียนใหม่ประโยชน์จาก subclasses ตามต้องการกำหนดเฉพาะเจาะจงในการกระทำของพวกเขา
นั่นคือ subclass ของวิธีการเรียนผู้ปกครองสามารถรับรู้ได้ตามความจำเป็น
ในหลักการเชิงวัตถุเขียนใหม่หมายความว่าคุณสามารถแทนที่วิธีการที่มีอยู่ ตัวอย่างมีดังนี้
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象 a.move();// 执行 Animal 类的方法 b.move();//执行 Dog 类的方法 } }
ตัวอย่างข้างต้นรวบรวมผลมีดังนี้
动物可以移动 狗可以跑和走
ในตัวอย่างข้างต้นจะเห็นได้แม้ B เป็นประเภทสัตว์ แต่มันเป็นวิธีการดำเนินการย้ายระดับสุนัข
เพราะนี่คือที่รวบรวมเวลา แต่การตรวจสอบพารามิเตอร์ชนิดอ้างอิง
อย่างไรก็ตามในเวลาเรียกใช้ชนิดของเครื่องเสมือนจาวา (JVM) ของวัตถุที่ระบุและวิธีการดำเนินงานของวัตถุ
ดังนั้นในตัวอย่างข้างต้นคอมไพเลอร์ที่ได้รับสามารถที่จะประสบความสำเร็จเพราะวิธีการย้ายที่มีอยู่ระดับสัตว์ แต่วิ่งวิ่งเป็นวิธีการสำหรับวัตถุโดยเฉพาะอย่างยิ่ง
พิจารณาตัวอย่างต่อไปนี้:
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } public void bark(){ System.out.println("狗可以吠叫"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象 a.move();// 执行 Animal 类的方法 b.move();//执行 Dog 类的方法 b.bark(); } }
ตัวอย่างข้างต้นรวบรวมผลมีดังนี้
TestDog.java:30: cannot find symbol symbol : method bark() location: class Animal b.bark(); ^
โปรแกรมจะโยนความผิดพลาดสะสมเพราะไม่มีการอ้างอิงประเภท B วิธีเปลือกสัตว์
วิธีการเขียนกฎ
- รายการพารามิเตอร์จะต้องตรงเช่นเดียวกับวิธีการที่จะถูกเขียนใหม่;
- ประเภทกลับต้องถูกเขียนใหม่ทั้งหมดที่มีประเภทการกลับมาของวิธีการเดียวกัน;
- การเข้าถึงไม่ต่ำกว่าวิธีการเข้าถึงระดับผู้ปกครองแทนที่ ตัวอย่างเช่น: ถ้าระดับผู้ปกครองมีการประกาศที่สาธารณะแล้วแทนที่วิธีนี้ใน subclass ไม่สามารถประกาศเป็นการป้องกัน
- สมาชิกของชนชั้นปกครองเท่านั้นที่สามารถแทนที่ subclasses ของมัน
- ประกาศเป็นวิธีสุดท้ายไม่สามารถแทนที่
- ประกาศเป็นวิธีการคงไม่สามารถเขียนใหม่ แต่สามารถประกาศอีกครั้ง
- ชั้นผู้ปกครองและ subclass ในแพคเกจเดียวกันประเภทรองสามารถแทนที่ระดับผู้ปกครองของวิธีการทั้งหมดนอกเหนือจากแถลงการณ์ของวิธีการส่วนตัวและครั้งสุดท้าย
- ซับคลาสและ superclass ไม่ได้เป็นแพคเกจเดียวกันดังนั้นเพียง subclasses สามารถแทนที่การประกาศของวิธีการที่ไม่ใช่สุดท้ายของประชาชนระดับผู้ปกครองและการป้องกันสำหรับ
- วิธีการแทนที่สามารถโยนยกเว้นใด ๆ ไม่ได้รับคำสั่งโดยไม่คำนึงว่าวิธีการที่ได้รับการเขียนใหม่โยนข้อยกเว้น แต่วิธีการที่ไม่สามารถแทนที่การยกเว้นบังคับโยนใหม่หรือกว้างกว่าการประกาศบังคับเป็นวิธีการแทนที่ข้อยกเว้นมิฉะนั้นคุณจะ
- คอนสตรัคไม่สามารถเขียนใหม่
- หากวิธีการที่ไม่สามารถรับมรดกก็ไม่สามารถแทนที่วิธีนี้
การใช้คำหลักที่ซูเปอร์
เมื่อคุณจะต้องมีการเขียนใหม่เพื่อเรียกวิธีการเรียนของผู้ปกครองใน subclass ที่จะใช้คำหลักที่ซุปเปอร์
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ super.move(); // 应用super类的方法 System.out.println("狗可以跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal b = new Dog(); // Dog 对象 b.move(); //执行 Dog类的方法 } }
ตัวอย่างข้างต้นรวบรวมผลมีดังนี้
动物可以移动 狗可以跑和走
โอเวอร์โหลด (Overload)
โอเวอร์โหลด (มากไป) อยู่ในระดับภายในวิธีการที่มีชื่อเดียวกัน แต่มีพารามิเตอร์ที่แตกต่างกัน ประเภทผลตอบแทนอาจจะเหมือนหรือต่างกัน
แต่ละวิธีมากเกินไป (หรือคอนสตรัค) จะต้องมีรายการที่ไม่ซ้ำกันของชนิดอาร์กิวเมนต์
ก่อสร้างมากเกินไปเท่านั้น
การบรรทุกเกินพิกัดกฎ
- วิธีการมากเกินไปต้องเปลี่ยนรายการพารามิเตอร์;
- วิธีการมากเกินไปสามารถเปลี่ยนประเภทผลตอบแทน;
- วิธีการมากเกินไปอาจมีการเปลี่ยนแปลงปรับเปลี่ยนการเข้าถึง
- วิธีการมากเกินไปสามารถประกาศข้อยกเว้นใหม่หรือการตรวจสอบที่กว้างขึ้น;
- วิธีการที่สามารถจะอยู่ในระดับเดียวกันหรือมากเกินไปในประเภทรอง
ตัวอย่าง
public class Overloading { public int test(){ System.out.println("test1"); return 1; } public void test(int a){ System.out.println("test2"); } //以下两个参数类型顺序不同 public String test(int a,String s){ System.out.println("test3"); return "returntest3"; } public String test(String s,int a){ System.out.println("test4"); return "returntest4"; } public static void main(String[] args){ Overloading o = new Overloading(); System.out.println(o.test()); o.test(1); System.out.println(o.test(1,"test3")); System.out.println(o.test("test4",1)); } }
ความแตกต่างระหว่างการเขียนมากไป
จุดของความแตกต่าง | วิธีการมากเกินไป | วิธีการเอาชนะ |
---|---|---|
รายการพารามิเตอร์ | คุณต้องได้รับการแก้ไข | จะต้องไม่ได้รับการแก้ไข |
ประเภทกลับ | คุณสามารถปรับเปลี่ยน | จะต้องไม่ได้รับการแก้ไข |
ผิดปกติ | คุณสามารถปรับเปลี่ยน | สามารถลดลงได้หรือถูกลบออกคุณจะต้องไม่โยนข้อยกเว้นใหม่หรือที่กว้างขึ้น |
ทางเข้า | คุณสามารถปรับเปลี่ยน | จะต้องไม่เป็นข้อ จำกัด ที่เข้มงวดมากขึ้น (ไม่ จำกัด สามารถลดลง) |