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)有共同點,不同點在于:
- 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)型對象具有如下特點:
- 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

