Java學(xué)生信息類(lèi)繼承與接口的原理及使用方式
Java學(xué)生信息類(lèi)繼承與接口原理及使用
(1)創(chuàng)建源程序MyGroup.java,其中的內(nèi)容是接口MyGroup的聲明。
(2)創(chuàng)建源程序Undergraduate.java,其中的類(lèi)Undergraduate繼承源程序Student.java中的抽象類(lèi)Student,實(shí)現(xiàn)其中的抽象方法print( )。
(3)創(chuàng)建源程序Postgraduate.java,其中的類(lèi)Postgraduate繼承源程序Student.java中的抽象類(lèi)Student,實(shí)現(xiàn)其中的抽象方法print( ),并且,在父類(lèi)的基礎(chǔ)上增加兩個(gè)新的屬性:導(dǎo)師和研究方向。
(4)StuGroup.java,MyGroup.java,Undergraduate.java,Postgraduate.java和Student.java在同一個(gè)包中。Main.java在無(wú)名包中。
上述源程序可以完成如下任務(wù):
使用者根據(jù)提示信息,選擇從鍵盤(pán)上輸入本科生或者研究生的學(xué)生信息,可以添加學(xué)生信息、刪除學(xué)生信息、顯示學(xué)生信息、按照學(xué)生成績(jī)排序等。
項(xiàng)目文件結(jié)構(gòu)截圖:

Main.java位于無(wú)名包下
//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個(gè)學(xué)生
int num; //實(shí)際輸入的學(xué)生信息
System.out.println("要?jiǎng)?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("請(qǐng)問(wèn)要輸入多少個(gè)本科生的信息?");
num = reader.nextInt();
Student stuB[] = new Undergraduate[num];//stuB[]對(duì)象數(shù)組是子類(lèi)Undergraduate對(duì)象的上轉(zhuǎn)型對(duì)象
for(int i=0;i<num;i++)
{
System.out.println("請(qǐng)輸入第"+(i+1)+"位學(xué)生的學(xué)號(hào),姓名,數(shù)學(xué)、計(jì)算機(jī)成績(jī)");
stuB[i] = new Undergraduate(reader.nextInt(), reader.next(),reader.nextDouble(), reader.nextDouble());//從鍵盤(pán)輸入學(xué)生信息,并賦值給學(xué)生
group.addStu(stuB[i]);//參數(shù)為引用類(lèi)型
}
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("請(qǐng)問(wèn)要輸入多少個(gè)研究生的信息?");
num = reader.nextInt();
Student[] stuY = new Postgraduate[num];//stuY[]對(duì)象數(shù)組是子類(lèi)Postgraduate對(duì)象的上轉(zhuǎn)型對(duì)象
for(int i=0;i<num;i++)
{
System.out.println("請(qǐng)輸入第"+(i+1)+"位學(xué)生的學(xué)號(hào),姓名,數(shù)學(xué)、計(jì)算機(jī)成績(jī),導(dǎo)師和研究方向,以空格隔開(kāi)");
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("輸入錯(cuò)誤?。。?);
break;
}
System.out.println("刪除第幾個(gè)同學(xué)?");
group.removeStu(reader.nextInt());
System.out.println("最新的學(xué)生信息為:");
group.print();
group.sort(1);
group.print();//按照數(shù)學(xué)成績(jī)排序后輸出
group.sort(2);
group.print();//按照計(jì)算機(jī)成績(jī)排序后輸出
in.close();
}
}
1.Student.java是學(xué)生信息類(lèi),是抽象類(lèi)。里面用于學(xué)生信息的初始化,get和set方法間接操作域變量,用于對(duì)學(xué)生信息的設(shè)置和獲取。并聲明了抽象方法print();
2.Postgraduate類(lèi)是Student類(lèi)的子類(lèi),實(shí)現(xiàn)研究生信息的初始化,實(shí)現(xiàn)抽象方法,輸出研究生信息。
3.Undergraduate類(lèi)是Student類(lèi)的子類(lèi),實(shí)現(xiàn)本科生信息的初始化,實(shí)現(xiàn)抽象方法,輸出本科生信息。
4.Mygroup.java是接口聲明
6.StuGroup.java 其中的類(lèi)實(shí)現(xiàn)了接口MyGroup。
是添加學(xué)生信息、刪除學(xué)生信息、顯示學(xué)生信息、按照學(xué)生成績(jī)排序,輸出學(xué)生信息方法的實(shí)現(xiàn)。
上述五個(gè).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é)生類(lèi)的屬性有學(xué)號(hào)(int),姓名(String),數(shù)學(xué)成績(jī)(double),計(jì)算機(jī)成績(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(); //抽象方法,子類(lèi)要實(shí)現(xiàn)這個(gè)方法,也就是輸出學(xué)生的信息
}
//Postgraduate.java
package 包;
//創(chuàng)建源程序Postgraduate.java,其中的類(lèi)Postgraduate繼承源程序Student.java中的抽象類(lèi)Student,實(shí)現(xiàn)其中的抽象方法print( ),并且,在父類(lèi)的基礎(chǔ)上增加兩個(gè)新的屬性:導(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);//子類(lèi)使用super調(diào)用父類(lèi)的構(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( )//子類(lèi)實(shí)現(xiàn)抽象類(lèi)的方法
{
System.out.println("研究生學(xué)生信息為:"+"學(xué)號(hào):"+setNum()+",姓名:"+setName()+",數(shù)學(xué)成績(jī):"+setMathScore()+",計(jì)算機(jī)成績(jī):"+setComputerScore()+"導(dǎo)師:"+setTeacher()+",研究方向:"+setDirection());
}
}
//Undergraduate.java
package 包;
//創(chuàng)建源程序Undergraduate.java,其中的類(lèi)Undergraduate繼承源程序Student.java中的抽象類(lèi)Student,實(shí)現(xiàn)其中的抽象方法print( )。
public class Undergraduate extends Student{
public Undergraduate(int num, String name, double mathScore, double computerScore) {
super(num, name, mathScore, computerScore);//子類(lèi)使用super調(diào)用父類(lèi)的構(gòu)造方法
}
void print()
{
System.out.println("本科生信息:"+"學(xué)號(hào):"+setNum()+" ,姓名:"+setName()+" ,數(shù)學(xué)成績(jī):"+setMathScore()+" ,計(jì)算機(jī)成績(jī):"+setComputerScore());
}
}
//StuGroup.java
package 包;
public class StuGroup implements Mygroup
{
private Student[] stu;
private int length; //實(shí)際容量
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) //按照成績(jī)排序,參數(shù)1按數(shù)學(xué)排序,參數(shù)2按計(jì)算機(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;//聲明一個(gè)對(duì)象(引用),用于交換
temp =stu[j+1];
stu[j+1] = stu[j];
stu[j] = temp;
}
}
System.out.println("按數(shù)學(xué)成績(jī)降序排列為:");
}
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ì)算機(jī)成績(jī)降序排名:");
}
}
public void print()
{
for(int i =0;i<length;i++)
stu[i].print();//調(diào)用Student子類(lèi)的print()方法
}
}
結(jié)論分析
(1) 通過(guò)抽象類(lèi)Student和接口MyGroup分析對(duì)比總結(jié):
Java提供和支持創(chuàng)建抽象類(lèi)和接口。它們的實(shí)現(xiàn)有共同點(diǎn),不同點(diǎn)在于:
- 1.接口中所有的方法隱含的都是抽象的。而抽象類(lèi)則可以同時(shí)包含抽象和非抽象的方法。
- 2.類(lèi)可以實(shí)現(xiàn)很多個(gè)接口,類(lèi)在實(shí)現(xiàn)接口方法時(shí)一定要用public來(lái)修飾,但是只能繼承一個(gè)抽象類(lèi).
- 3.類(lèi)如果要實(shí)現(xiàn)一個(gè)接口,它必須要實(shí)現(xiàn)接口聲明的所有方法。但是,類(lèi)可以不實(shí)現(xiàn)抽象類(lèi)聲明的所有方法,當(dāng)然,在這種情況下,類(lèi)也必須得聲明成是抽象的。
- 4.抽象類(lèi)可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口。
- 5.Java接口中聲明的變量默認(rèn)都是final的。抽象類(lèi)可以包含非final的變量。
- 6.Java接口中的成員函數(shù)默認(rèn)是public的。抽象類(lèi)的成員函數(shù)可以是private,protected或者是public。
- 7.接口是絕對(duì)抽象的,不可以被實(shí)例化。抽象類(lèi)也不可以被實(shí)例化,但是,如果它包含main方法的話(huà)是可以被調(diào)用的。
(2)Student stuB[] = new Undergraduate[num];//stuB[]對(duì)象數(shù)組是子類(lèi)Undergraduate對(duì)象的上轉(zhuǎn)型對(duì)象,通過(guò)本例總結(jié):
上轉(zhuǎn)型對(duì)象具有如下特點(diǎn):
- 1.上轉(zhuǎn)型對(duì)象不能操作子類(lèi)新增的成員變量(失掉了這部分屬性),不能調(diào)用子類(lèi)新增的方法(失掉了一些行為)。
- 2.上轉(zhuǎn)型對(duì)象可以訪(fǎng)問(wèn)子類(lèi)繼承和隱藏的成員變量,也可以調(diào)用子類(lèi)繼承的方法或子類(lèi)重寫(xiě)的方法。上轉(zhuǎn)型對(duì)象操作子類(lèi)繼承的方法或子類(lèi)重寫(xiě)的實(shí)例方法,其作用等價(jià)于子類(lèi)對(duì)象去調(diào)用這些方法。因此,如果子類(lèi)重寫(xiě)了父類(lèi)的某個(gè)實(shí)例方法后,當(dāng)對(duì)象的上轉(zhuǎn)型調(diào)用這個(gè)實(shí)例方法時(shí)一定是調(diào)用了子類(lèi)重寫(xiě)的實(shí)例方法。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java通過(guò)接口實(shí)現(xiàn)匿名類(lèi)的實(shí)例代碼
這篇文章介紹了Java通過(guò)接口實(shí)現(xiàn)匿名類(lèi)的實(shí)例代碼,有需要的朋友可以參考一下2013-10-10
【java 多線(xiàn)程】守護(hù)線(xiàn)程與非守護(hù)線(xiàn)程的詳解
這篇文章主要介紹了java守護(hù)線(xiàn)程與非守護(hù)線(xiàn)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
鄰接表無(wú)向圖的Java語(yǔ)言實(shí)現(xiàn)完整源碼
這篇文章主要介紹了鄰接表無(wú)向圖的Java語(yǔ)言實(shí)現(xiàn)完整源碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
Java語(yǔ)法基礎(chǔ)之函數(shù)的使用說(shuō)明
函數(shù)就是定義在類(lèi)中的具有特定功能的一段小程序,函數(shù)也稱(chēng)為方法2013-07-07

