โปรแกรม Java ใช้คลาสนามธรรมเพื่อนำแนวคิดเชิงนามธรรมไปใช้ในธรรมชาติ หน้าที่ของคลาสนามธรรมคือการจัดระเบียบคลาสที่เกี่ยวข้องจำนวนมากเข้าด้วยกันเพื่อจัดให้มีคลาสทั่วไป ซึ่งก็คือคลาสนามธรรม และคลาสเฉพาะที่จัดโดยคลาสนั้นจะได้รับมาจากคลาสนั้นเป็นคลาสย่อย คลาสนามธรรมแสดงลักษณะพฤติกรรมสาธารณะและถ่ายโอนไปยังคลาสที่ได้รับผ่านกลไกการสืบทอด วิธีการที่กำหนดไว้ในคลาสนามธรรมเรียกว่าวิธีการแบบนามธรรม วิธีการเหล่านี้มีเพียงการประกาศส่วนหัวของวิธีการ และใช้เครื่องหมายอัฒภาคเพื่อแทนที่คำจำกัดความของเนื้อความของวิธีการ นั่นคือ เฉพาะรูปแบบอินเทอร์เฟซของวิธีการสมาชิกเท่านั้นที่ถูกกำหนดโดยไม่มีการดำเนินการเฉพาะ . เฉพาะการกำหนดใหม่ของวิธีการสมาชิกนามธรรมโดยคลาสที่ได้รับจริงเท่านั้นที่จะดำเนินการที่เกี่ยวข้องกับคลาสที่ได้รับ
หลังจากที่แต่ละคลาสย่อยสืบทอดเมธอด abstract ของคลาสพาเรนต์แล้ว มันจะกำหนดใหม่ด้วยคำสั่งและเนื้อความของเมธอดที่แตกต่างกัน โดยสร้างคลาสย่อยหลายคลาสที่มีชื่อเดียวกัน ค่าที่ส่งคืนเหมือนกัน และรายการพารามิเตอร์เดียวกัน โดยมีวัตถุประสงค์เดียวกันแต่มีความแตกต่างบางประการในเฉพาะ วิธีการปฏิบัติ วัตถุประสงค์ของการกำหนดวิธีนามธรรมในคลาสนามธรรมคือการใช้อินเทอร์เฟซ กล่าวคือ คลาสย่อยทั้งหมดนำเสนอวิธีการที่มีชื่อเดียวกันสู่โลกภายนอก คลาสนามธรรมคือชุดของคุณลักษณะสาธารณะของคลาสย่อยทั้งหมดและคลาสที่มีวิธีนามธรรมตั้งแต่หนึ่งวิธีขึ้นไป ข้อดีประการหนึ่งของการใช้คลาสนามธรรมคือคุณสามารถใช้คุณสมบัติสาธารณะเหล่านี้ได้อย่างเต็มที่ เพื่อปรับปรุงประสิทธิภาพของการพัฒนาและบำรุงรักษาโปรแกรม ข้อจำกัดของคลาสนามธรรมและวิธีการนามธรรมมีดังนี้:
(1) คลาสใดๆ ที่ถูกแก้ไขด้วยตัวดัดแปลงนามธรรม เรียกว่าคลาสนามธรรม เมธอดสมาชิกใดๆ ที่ถูกแก้ไขด้วยตัวดัดแปลงนามธรรมจะเรียกว่าเมธอดนามธรรม
(2) คลาสนามธรรมอาจมีวิธีนามธรรมเป็นศูนย์หรือมากกว่านั้นก็ได้ หรืออาจมีวิธีที่ไม่ใช่นามธรรมก็ได้
(3) ไม่จำเป็นต้องมีเมธอดนามธรรมในคลาสนามธรรม แต่คลาสที่มีวิธีนามธรรมจะต้องเป็นคลาสนามธรรม
(4) สำหรับวิธีการเชิงนามธรรม เฉพาะชื่อวิธีการและประเภทของวิธีการเท่านั้นที่ถูกระบุในคลาสนามธรรมโดยไม่ต้องเขียนโค้ดการใช้งาน
(5) คลาสนามธรรมสามารถรับคลาสย่อยได้ และวิธีการเชิงนามธรรมทั้งหมดที่กำหนดไว้ในคลาสนามธรรมจะต้องถูกนำไปใช้ในคลาสย่อยที่ได้มาจากคลาสนามธรรม
(6) คลาสนามธรรมไม่สามารถสร้างวัตถุได้ งานสร้างวัตถุถูกนำไปใช้โดยคลาสย่อยที่ได้มาจากคลาสนามธรรม
(7) หากมีวิธีนามธรรมที่มีชื่อเดียวกันในคลาสหลัก จะไม่มีวิธีนามธรรมอื่นที่มีชื่อเดียวกันในคลาสย่อย
(8) บทคัดย่อไม่สามารถแก้ไขคลาสเดียวกันควบคู่ไปกับขั้นสุดท้ายได้
(9) บทคัดย่อไม่สามารถใช้แก้ไขวิธีการเดียวกันควบคู่ไปกับไพรเวต สแตติก ขั้นสุดท้าย หรือเนทิฟได้
ภาษา Java กำหนดว่าเมื่อคลาสมีเมธอดนามธรรม คลาสนั้นจะต้องถูกประกาศให้เป็นคลาสนามธรรม
เมื่อคลาสย่อยสืบทอดคลาสพาเรนต์ หากมีเมธอดนามธรรมในคลาสพาเรนต์ และคลาสย่อยรู้สึกว่าสามารถนำเมธอดนามธรรมทั้งหมดของคลาสพาเรนต์มาใช้ได้ คลาสย่อยจะต้องนำเมธอดนามธรรมทั้งหมดของคลาสพาเรนต์ไปใช้ เช่น เช่น:
/** * คลาสย่อย Dog สืบทอดคลาสนามธรรม Animal และใช้วิธีการนามธรรม enjoy * @author gacl * */คลาส Dog ขยาย Animal { /** * คลาส Dog เพิ่มคุณลักษณะเฉพาะของตัวเอง*/ public String furColor; ( String n, String c) { super(n);//เรียก Constructor ของคลาสพาเรนต์ Animal this.furColor = c; } @Override public void enjoy() { System.out.println("The dog barks.. .." ); -
หากคลาสย่อยรู้สึกว่าวิธีนามธรรมในคลาสพาเรนต์ไม่สามารถนำมาใช้ได้ ให้ประกาศคลาสย่อยเป็นคลาสนามธรรม เช่น:
/** * คลาสย่อย Cat ที่นี่สืบทอดมาจากคลาสนามธรรม Animal และโดยธรรมชาติแล้วสืบทอดวิธีนามธรรม enjoy() ที่ประกาศไว้ในคลาส Animal * อย่างไรก็ตาม คลาสย่อย Cat รู้สึกว่าไม่เหมาะสมที่จะนำเมธอด enjoy() นี้ไปใช้ ดังนั้นมันจึงประกาศตัวเองว่าเป็นคลาสนามธรรม * จากนั้นใครก็ตามที่นำเมธอด enjoy แบบนามธรรมนี้ไปใช้ และใครก็ตามที่สืบทอดคลาสย่อย จากนั้นจึงนำเมธอดนามธรรมนี้ไปใช้ enjoy() * @author gacl * */abstract class Cat ขยาย Animal { /** * Cat เพิ่มคุณสมบัติเฉพาะของตัวเอง*/ public String eyeColor; public Cat(String n, String c) { super(n);//เรียกคลาสพาเรนต์ วิธีการก่อสร้างของสัตว์ this.eyeColor = c;
คลาสย่อย Cat ที่นี่สืบทอดมาจากคลาสนามธรรม Animal และโดยธรรมชาติแล้วสืบทอดเมธอด abstract enjoy() ที่ประกาศไว้ในคลาส Animal อย่างไรก็ตาม คลาสย่อย Cat รู้สึกว่าไม่เหมาะสมที่จะใช้เมธอด enjoy() นี้ด้วยตัวเอง ดังนั้น เรียกตัวเองว่า Declared เป็นคลาสนามธรรม ดังนั้นใครก็ตามที่นำเมธอด enjoy นามธรรมไปใช้ และใครก็ตามที่สืบทอดคลาสย่อย จากนั้นใครก็ตามที่นำเมธอด abstract enjoy ไปใช้ และใครก็ตามที่สืบทอดคลาสย่อย จากนั้นจึงนำเมธอด abstract ไปใช้ enjoy() ชอบ:
/** * คลาสย่อย BlueCat สืบทอดคลาสนามธรรม Cat และใช้เมธอดนามธรรม enjoy ที่สืบทอดมาจากคลาสแม่ Cat * @author gacl * */class BlueCat ขยาย Cat { public BlueCat(String n, String c) { super(n , c); } /** * ใช้วิธีนามธรรม enjoy */ @Override public void enjoy() { System.out.println("The blue cat meows...");
รหัสทดสอบที่สมบูรณ์มีดังนี้:
package javatudy.summary;/** * Parent class Animal * เพิ่ม abstract ไว้หน้า class กล่าวคือ ประกาศดังนี้: abstract class Animal * ด้วยวิธีนี้ Animal class จะกลายเป็น abstract class */abstract class Animal { public String name; public Animal(String name) { this.name = name; } /** * Abstract method * มีเพียงคำจำกัดความของเมธอด แต่ไม่มีการดำเนินการ */ public abstract void enjoy(); }/** * คลาสย่อย Cat ที่นี่สืบทอดมาจากคลาสนามธรรม Animal และโดยธรรมชาติแล้วสืบทอดวิธีนามธรรม enjoy() ที่ประกาศไว้ในคลาส Animal * แต่คลาสย่อย Cat รู้สึกว่ามันต้องเป็น นำมาใช้เอง วิธีการ enjoy() นี้ก็ไม่เหมาะสมเช่นกัน ดังนั้นจึงประกาศตัวเองว่าเป็นคลาสนามธรรม * ดังนั้น ใครก็ตามที่นำเมธอด enjoy นามธรรมนี้ไปใช้ และใครก็ตามที่สืบทอดคลาสย่อย ดังนั้นใครก็ตามที่นำเมธอด abstract นี้ไปใช้ enjoy( ) * @author gacl * */abstract class Cat ขยาย Animal { /** * Cat เพิ่มคุณสมบัติเฉพาะของตัวเอง*/ public String eyeColor; public Cat(String n, String c) { super(n);//เรียกคลาสพาเรนต์ วิธีการก่อสร้างของสัตว์ this.eyeColor = c; }}/** * คลาสย่อย BlueCat สืบทอดคลาสนามธรรม Cat และใช้วิธีการนามธรรมเพลิดเพลินไปกับที่สืบทอดมาจากคลาสแม่ Cat * @author gacl * */class BlueCat ขยาย Cat { public BlueCat(String n, String c) { super(n, c); } /** * ใช้วิธีนามธรรม enjoy */ @Override public void enjoy() { System.out.println("Blue Cat meows. .."); } }/** * คลาสย่อย Dog สืบทอดคลาสนามธรรม Animal และใช้วิธีการนามธรรม enjoy * @author gacl * */class Dog ขยาย Animal { /** * คลาส Dog เพิ่มคุณลักษณะเฉพาะของตัวเอง * / สตริงสาธารณะ furColor; dog สาธารณะ (สตริง n, สตริง c) { super (n); // เรียกตัวสร้างคลาสแม่ Animal this.furColor = c; } @Override public void enjoy () { System.out.println ("Dog barks ...."); }} TestAbstract คลาสสาธารณะ { /** * @param args */ public static void main(String[] args) { /** * หลังจากประกาศคลาส Cat เป็นคลาสนามธรรมแล้ว คลาส Cat จะไม่สามารถสร้างอินสแตนซ์ได้ * เนื่องจากคลาสนามธรรมไม่สมบูรณ์และไม่มีแขนและขา คลาสนามธรรมจึงไม่สามารถสร้างอินสแตนซ์ได้ */ //Cat c = new Cat("Catname", "blue"); Dog d = new Dog("dogname", "black"); d.enjoy();//เรียกวิธี enjoy BlueCat ที่คุณใช้งาน c = new BlueCat("BlueCatname","blue"); c.enjoy();//เรียกวิธีการเพลิดเพลินที่คุณนำไปใช้}}