วิธีเริ่มต้นของอินเตอร์เฟส Java8
วิธีการเริ่มต้นคืออะไรและทำไมจึงมีวิธีการเริ่มต้น?
พูดง่ายๆคืออินเทอร์เฟซสามารถมีวิธีการใช้งานและไม่จำเป็นต้องใช้คลาสเพื่อใช้วิธีการ เพียงเพิ่มคำหลักเริ่มต้นก่อนชื่อเมธอด
ทำไมคุณถึงต้องการคุณสมบัตินี้? ก่อนอื่นอินเทอร์เฟซก่อนหน้านี้เป็นดาบสองคม ข้อได้เปรียบคือมันมุ่งเป้าไปที่นามธรรมมากกว่าการเขียนโปรแกรมที่เป็นรูปธรรม ข้อเสียคือเมื่อจำเป็นต้องแก้ไขอินเทอร์เฟซจำเป็นต้องแก้ไขคลาสทั้งหมดที่ใช้อินเทอร์เฟซ เฟรมเวิร์กคอลเลกชันปัจจุบันก่อน Java 8 ไม่มีวิธีการ foreach วิธีแก้ปัญหาที่สามารถคิดได้คือการเพิ่มวิธีการใหม่และการใช้งานไปยังอินเทอร์เฟซที่เกี่ยวข้องใน JDK อย่างไรก็ตามสำหรับเวอร์ชันที่เผยแพร่เป็นไปไม่ได้ที่จะเพิ่มวิธีการใหม่ในอินเทอร์เฟซโดยไม่ส่งผลกระทบต่อการใช้งานที่มีอยู่ ดังนั้นวิธีการเริ่มต้นจึงแนะนำ วัตถุประสงค์ของพวกเขาคือการทำให้อินเทอร์เฟซไม่ได้แนะนำให้เข้ากันไม่ได้กับการใช้งานที่มีอยู่
ดังที่แสดงด้านล่าง
อินเตอร์เฟสสาธารณะสัตว์ {โมฆะเริ่มต้นกิน () {system.out.println ("สัตว์กินวิธีเริ่มต้นกิน"); - มีการประกาศอินเทอร์เฟซและมีวิธีการเริ่มต้นเพียงวิธีเดียวเท่านั้น จากนั้นเขียนคลาสเฉพาะเพื่อใช้อินเทอร์เฟซนี้
สุนัขชั้นสาธารณะใช้สัตว์ {โมฆะสาธารณะ sayhi () {system.out.println ("สุนัข"); } โมฆะคงที่สาธารณะหลัก (สตริง args []) {dog dog = สุนัขใหม่ (); dog.eat (); -ในคลาสเฉพาะไม่จำเป็นต้องแทนที่วิธีเริ่มต้น แต่ต้องใช้วิธีการนามธรรม
การสืบทอดหลายวิธีของวิธีการเริ่มต้น
รหัสที่แสดงด้านล่าง
อินเทอร์เฟซสาธารณะ A {void dosomething (); เป็นโมฆะเริ่มต้น Hello () {System.out.println ("Hello World จาก Interface A"); } เริ่มต้น void foo () {system.out.println ("foo จากอินเตอร์เฟส a"); }} อินเตอร์เฟส b ขยาย {void เริ่มต้น hello () {system.out.println ("Hello World จากอินเตอร์เฟส B"); A.Super.Hello (); this.foo (); A.super.foo (); }} คลาส C ใช้ b, a {@Override โมฆะสาธารณะ dosomething () {system.out.println ("C วัตถุจำเป็นต้องทำอะไรบางอย่าง"); } โมฆะคงที่สาธารณะหลัก (String args []) {a obj = new C (); obj.hello (); // วิธีการของ B Call B obj.dosomething (); -ผลการพิมพ์:
Hello World จาก Interface Bhello World จาก Interface Afoo จาก Interface Afoo จาก Interface AC Object ต้องการทำอะไรบางอย่าง
obj.hello () เรียกวิธีเริ่มต้นในอินเตอร์เฟส B ในเวลาเดียวกันวิธีการเริ่มต้นในอินเตอร์เฟส B เรียกวิธีเริ่มต้นในอินเทอร์เฟซพาเรนต์
ลองมาดูตัวอย่างอื่นและคิดเกี่ยวกับวิธีการเริ่มต้นที่มีชื่อเดียวกันในหลายมรดกดังที่แสดงด้านล่าง
อินเทอร์เฟซสาธารณะ d {เป็นโมฆะเริ่มต้น Hello () {System.out.println ("Hello World จาก D"); }} อินเตอร์เฟส e {void เริ่มต้น hello () {system.out.println ("Hello World จาก E"); }} คลาส F ดำเนินการ d, e {@Override โมฆะสาธารณะ hello () {system.out.println ("Hello World F class"); d.super.hello (); e.super.hello (); } โมฆะคงที่สาธารณะหลัก (สตริง args []) {f f = new f (); f.hello (); - เราจำเป็นต้องกำหนดวิธีเริ่มต้นของอินเทอร์เฟซที่จะเรียกดังนี้:
d.super.hello (); e.super.hello ();
อีก ตัวอย่างหนึ่งของวิธีการเริ่มต้นของ Java8 :
Java8 ได้เพิ่มวิธีการเริ่มต้นสำหรับอินเทอร์เฟซซึ่งหมายความว่าสามารถนำไปใช้ในอินเทอร์เฟซได้ วิธีการใช้งานนี้เป็นการใช้งานเริ่มต้นและคุณยังสามารถเขียนวิธีเริ่มต้นนี้ใหม่ในคลาสการใช้งานอินเตอร์เฟส
ตัวอย่างต่อไปนี้:
คลาสสาธารณะ AppInterfacedefaultMethod {อินเตอร์เฟสคงที่สาธารณะ defaultMethodDemo {// กำหนดวิธีเริ่มต้นด้วยคำหลักเริ่มต้นที่นำหน้าด้วยวิธีเริ่มต้นตามด้วยการประกาศวิธีการและวิธีการ demo demo เริ่มต้น } void dosomething (); } Democlass ระดับสแตติกสาธารณะใช้ defaultMetHodDemo {@Override โมฆะสาธารณะ dosomething () {system.out.println ("ทำอะไรบางอย่าง"); }} คลาสสแตติกระดับสาธารณะ DemoclassoverRidedemo ใช้ defaultMethoddemo {// rewrite วิธีเริ่มต้น @Override โมฆะสาธารณะตัวอย่างโมฆะ (อินพุตสตริง) {system.out.println ("ตัวอย่าง" + อินพุต + "โดยวิธีการ override"); } @Override โมฆะสาธารณะ dosomething () {system.out.println ("ทำอะไรบางอย่าง"); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {defaultMethoddemo demo = democlass ใหม่ (); Demo.Demo ("ABC"); defaultMethoddemo demooverride = democlassoverRidedEmo () ใหม่ (); Demooverride.demo ("ABC"); -ข้างต้นเป็นการแนะนำรายละเอียดเกี่ยวกับวิธีการเริ่มต้นของอินเทอร์เฟซ Java8 และฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคน