Java學(xué)生信息類繼承與接口的原理及使用方式
Java學(xué)生信息類繼承與接口原理及使用
(1)創(chuàng)建源程序MyGroup.java,其中的內(nèi)容是接口MyGroup的聲明。
(2)創(chuàng)建源程序Undergraduate.java,其中的類Undergraduate繼承源程序Student.java中的抽象類Student,實現(xiàn)其中的抽象方法print( )。
(3)創(chuàng)建源程序Postgraduate.java,其中的類Postgraduate繼承源程序Student.java中的抽象類Student,實現(xiàn)其中的抽象方法print( ),并且,在父類的基礎(chǔ)上增加兩個新的屬性:導(dǎo)師和研究方向。
(4)StuGroup.java,MyGroup.java,Undergraduate.java,Postgraduate.java和Student.java在同一個包中。Main.java在無名包中。
上述源程序可以完成如下任務(wù):
使用者根據(jù)提示信息,選擇從鍵盤上輸入本科生或者研究生的學(xué)生信息,可以添加學(xué)生信息、刪除學(xué)生信息、顯示學(xué)生信息、按照學(xué)生成績排序等。
項目文件結(jié)構(gòu)截圖:
Main.java位于無名包下
//main.java import 包.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); StuGroup group=new StuGroup(20); //group可以容納20個學(xué)生 int num; //實際輸入的學(xué)生信息 System.out.println("要創(chuàng)建本科生信息表還是研究生信息表?\nA.本科生\tB.研究生"); Scanner reader = new Scanner(System.in); char choice = reader.next().charAt(0);//charAt(index)用于返回索引處的字符 switch(choice) { case 'A': case 'a': System.out.println("請問要輸入多少個本科生的信息?"); num = reader.nextInt(); Student stuB[] = new Undergraduate[num];//stuB[]對象數(shù)組是子類Undergraduate對象的上轉(zhuǎn)型對象 for(int i=0;i<num;i++) { System.out.println("請輸入第"+(i+1)+"位學(xué)生的學(xué)號,姓名,數(shù)學(xué)、計算機(jī)成績"); stuB[i] = new Undergraduate(reader.nextInt(), reader.next(),reader.nextDouble(), reader.nextDouble());//從鍵盤輸入學(xué)生信息,并賦值給學(xué)生 group.addStu(stuB[i]);//參數(shù)為引用類型 } System.out.println("輸入的本科生信息為:"); group.print(); group.addStu(new Undergraduate(1312,"shgd",99,98.5)); group.addStu(new Undergraduate(1316,"ddsa",89,88.5)); System.out.println("添加后所有本科生的信息為:"); group.print(); break; case 'B': case 'b': System.out.println("請問要輸入多少個研究生的信息?"); num = reader.nextInt(); Student[] stuY = new Postgraduate[num];//stuY[]對象數(shù)組是子類Postgraduate對象的上轉(zhuǎn)型對象 for(int i=0;i<num;i++) { System.out.println("請輸入第"+(i+1)+"位學(xué)生的學(xué)號,姓名,數(shù)學(xué)、計算機(jī)成績,導(dǎo)師和研究方向,以空格隔開"); stuY[i] = new Postgraduate(reader.nextInt(), reader.next(),reader.nextDouble(), reader.nextDouble(),reader.next(),reader.next()); group.addStu(stuY[i]); } System.out.println("輸入的研究生信息為:"); group.print(); group.addStu(new Postgraduate(1312,"shgd",99,98.5,"xyy","os")); group.addStu(new Postgraduate(1316,"ddsa",89,88.5,"wcl","rgzn")); System.out.println("添加后所有研究生信息為:"); group.print(); break; default: System.out.println("輸入錯誤?。?!"); break; } System.out.println("刪除第幾個同學(xué)?"); group.removeStu(reader.nextInt()); System.out.println("最新的學(xué)生信息為:"); group.print(); group.sort(1); group.print();//按照數(shù)學(xué)成績排序后輸出 group.sort(2); group.print();//按照計算機(jī)成績排序后輸出 in.close(); } }
1.Student.java是學(xué)生信息類,是抽象類。里面用于學(xué)生信息的初始化,get和set方法間接操作域變量,用于對學(xué)生信息的設(shè)置和獲取。并聲明了抽象方法print();
2.Postgraduate類是Student類的子類,實現(xiàn)研究生信息的初始化,實現(xiàn)抽象方法,輸出研究生信息。
3.Undergraduate類是Student類的子類,實現(xiàn)本科生信息的初始化,實現(xiàn)抽象方法,輸出本科生信息。
4.Mygroup.java是接口聲明
6.StuGroup.java 其中的類實現(xiàn)了接口MyGroup。
是添加學(xué)生信息、刪除學(xué)生信息、顯示學(xué)生信息、按照學(xué)生成績排序,輸出學(xué)生信息方法的實現(xiàn)。
上述五個.java文件位于同一“包”文件下。
//Mygroup.java package 包; //接口MyGroup的聲明。 interface Mygroup { boolean addStu(Student x); Student removeStu(int index); void sort(int x); }
//Student.java package 包; public abstract class Student { //抽象學(xué)生類的屬性有學(xué)號(int),姓名(String),數(shù)學(xué)成績(double),計算機(jī)成績(double) int num; String name; double mathScore; double computerScore; //【構(gòu)造方法】 Student(int num,String name,double mathScore,double computerScore) { this.num = num; this.name = name; this.mathScore = mathScore; this.computerScore = computerScore; } public void getNum(int num) { this.num = num; } public int setNum() { return this.num; } public void getName(String name) { this.name = name; } public String setName() { return this.name; } public void getMathScore(double mathScore) { this.mathScore = mathScore; } public double setMathScore() { return this.mathScore; } public void getComputerScore(double computerScore) { this.computerScore =computerScore; } public double setComputerScore() { return this.computerScore; } abstract void print(); //抽象方法,子類要實現(xiàn)這個方法,也就是輸出學(xué)生的信息 }
//Postgraduate.java package 包; //創(chuàng)建源程序Postgraduate.java,其中的類Postgraduate繼承源程序Student.java中的抽象類Student,實現(xiàn)其中的抽象方法print( ),并且,在父類的基礎(chǔ)上增加兩個新的屬性:導(dǎo)師和研究方向。 public class Postgraduate extends Student{ String teacher; String direction; public Postgraduate(int num, String name, double mathScore, double computerScore,String teacher,String direction) { super(num, name, mathScore, computerScore);//子類使用super調(diào)用父類的構(gòu)造方法 this.teacher = teacher; this.direction = direction; } void getTeacher(String teacher) { this.teacher =teacher; } String setTeacher() { return this.teacher; } void getDirection(String direction) { this.direction =direction; } String setDirection() { return this.direction; } void print( )//子類實現(xiàn)抽象類的方法 { System.out.println("研究生學(xué)生信息為:"+"學(xué)號:"+setNum()+",姓名:"+setName()+",數(shù)學(xué)成績:"+setMathScore()+",計算機(jī)成績:"+setComputerScore()+"導(dǎo)師:"+setTeacher()+",研究方向:"+setDirection()); } }
//Undergraduate.java package 包; //創(chuàng)建源程序Undergraduate.java,其中的類Undergraduate繼承源程序Student.java中的抽象類Student,實現(xiàn)其中的抽象方法print( )。 public class Undergraduate extends Student{ public Undergraduate(int num, String name, double mathScore, double computerScore) { super(num, name, mathScore, computerScore);//子類使用super調(diào)用父類的構(gòu)造方法 } void print() { System.out.println("本科生信息:"+"學(xué)號:"+setNum()+" ,姓名:"+setName()+" ,數(shù)學(xué)成績:"+setMathScore()+" ,計算機(jī)成績:"+setComputerScore()); } }
//StuGroup.java package 包; public class StuGroup implements Mygroup { private Student[] stu; private int length; //實際容量 public StuGroup(int len) { stu = new Student[len]; } private boolean isOverflow() //輔助方法,判斷數(shù)組是否溢出 { if(this.length<stu.length) return false; else return true; } public boolean isEmpty() //判斷數(shù)組是否為空 { return this.length==0; } public boolean addStu(Student x) //添加學(xué)生信息 { if(isOverflow()) return false; stu[length++]=x; return true; } public Student removeStu(int index) //刪除指定位置的學(xué)生信息 { if(isEmpty()) { System.out.println("學(xué)生表空的~~~刪除失敗~~~~"); return null; } Student temp=stu[index-1]; for(int i=index-1;i<this.length-1;i++) { stu[i]=stu[i+1]; } this.length--; return temp; } public void sort(int x) //按照成績排序,參數(shù)1按數(shù)學(xué)排序,參數(shù)2按計算機(jī)排序 { if(x==1) { for(int i =0;i<length-1;i++) for(int j =0;j<length-i-1;j++)//冒泡排序 { if(stu[j].setMathScore()<stu[j+1].setMathScore()) { Student temp;//聲明一個對象(引用),用于交換 temp =stu[j+1]; stu[j+1] = stu[j]; stu[j] = temp; } } System.out.println("按數(shù)學(xué)成績降序排列為:"); } else if(x==2) { for(int i =0;i<length-1;i++) for(int j =0;j<length-i-1;j++) { if(stu[j].setComputerScore()<stu[j+1].setComputerScore()) { Student temp; temp =stu[j+1]; stu[j+1] = stu[j]; stu[j] = temp; } } System.out.println("按計算機(jī)成績降序排名:"); } } public void print() { for(int i =0;i<length;i++) stu[i].print();//調(diào)用Student子類的print()方法 } }
結(jié)論分析
(1) 通過抽象類Student和接口MyGroup分析對比總結(jié):
Java提供和支持創(chuàng)建抽象類和接口。它們的實現(xiàn)有共同點(diǎn),不同點(diǎn)在于:
- 1.接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
- 2.類可以實現(xiàn)很多個接口,類在實現(xiàn)接口方法時一定要用public來修飾,但是只能繼承一個抽象類.
- 3.類如果要實現(xiàn)一個接口,它必須要實現(xiàn)接口聲明的所有方法。但是,類可以不實現(xiàn)抽象類聲明的所有方法,當(dāng)然,在這種情況下,類也必須得聲明成是抽象的。
- 4.抽象類可以在不提供接口方法實現(xiàn)的情況下實現(xiàn)接口。
- 5.Java接口中聲明的變量默認(rèn)都是final的。抽象類可以包含非final的變量。
- 6.Java接口中的成員函數(shù)默認(rèn)是public的。抽象類的成員函數(shù)可以是private,protected或者是public。
- 7.接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調(diào)用的。
(2)Student stuB[] = new Undergraduate[num];//stuB[]對象數(shù)組是子類Undergraduate對象的上轉(zhuǎn)型對象,通過本例總結(jié):
上轉(zhuǎn)型對象具有如下特點(diǎn):
- 1.上轉(zhuǎn)型對象不能操作子類新增的成員變量(失掉了這部分屬性),不能調(diào)用子類新增的方法(失掉了一些行為)。
- 2.上轉(zhuǎn)型對象可以訪問子類繼承和隱藏的成員變量,也可以調(diào)用子類繼承的方法或子類重寫的方法。上轉(zhuǎn)型對象操作子類繼承的方法或子類重寫的實例方法,其作用等價于子類對象去調(diào)用這些方法。因此,如果子類重寫了父類的某個實例方法后,當(dāng)對象的上轉(zhuǎn)型調(diào)用這個實例方法時一定是調(diào)用了子類重寫的實例方法。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
【java 多線程】守護(hù)線程與非守護(hù)線程的詳解
這篇文章主要介紹了java守護(hù)線程與非守護(hù)線程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04