Java学生信息类继承与接口的原理和使用方法_定义学生类使用继承接口-程序员宅基地

技术标签: Java  Java学生信息的简单操作  接口的实现  

(1)创建源程序MyGroup.java,其中的内容是接口MyGroup的声明。
(2)创建源程序Undergraduate.java,其中的类Undergraduate继承源程序Student.java中的抽象类Student,实现其中的抽象方法print( )。
(3)创建源程序Postgraduate.java,其中的类Postgraduate继承源程序Student.java中的抽象类Student,实现其中的抽象方法print( ),并且,在父类的基础上增加两个新的属性:导师和研究方向。
(4)StuGroup.java,MyGroup.java,Undergraduate.java,Postgraduate.java和Student.java在同一个包中。Main.java在无名包中。
上述源程序可以完成如下任务:
使用者根据提示信息,选择从键盘上输入本科生或者研究生的学生信息,可以添加学生信息、删除学生信息、显示学生信息、按照学生成绩排序等。


项目文件结构截图:
在这里插入图片描述


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个学生
		int num;  //实际输入的学生信息
		System.out.println("要创建本科生信息表还是研究生信息表?\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[]对象数组是子类Undergraduate对象的上转型对象
			for(int i=0;i<num;i++)
			{
    
				System.out.println("请输入第"+(i+1)+"位学生的学号,姓名,数学、计算机成绩");
				stuB[i] = new Undergraduate(reader.nextInt(), reader.next(),reader.nextDouble(), reader.nextDouble());//从键盘输入学生信息,并赋值给学生
				group.addStu(stuB[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("请问要输入多少个研究生的信息?");
			num = reader.nextInt();
			 Student[] stuY = new Postgraduate[num];//stuY[]对象数组是子类Postgraduate对象的上转型对象
			for(int i=0;i<num;i++)
			{
    
				System.out.println("请输入第"+(i+1)+"位学生的学号,姓名,数学、计算机成绩,导师和研究方向,以空格隔开");
				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("删除第几个同学?");
		group.removeStu(reader.nextInt());
		System.out.println("最新的学生信息为:");
		group.print();
		group.sort(1);
		group.print();//按照数学成绩排序后输出
		group.sort(2);
		group.print();//按照计算机成绩排序后输出
		in.close();
	}
}

  1. Student.java是学生信息类,是抽象类。里面用于学生信息的初始化,get和set方法间接操作域变量,用于对学生信息的设置和获取。并声明了抽象方法print();
  2. Postgraduate类是Student类的子类,实现研究生信息的初始化,实现抽象方法,输出研究生信息。
  3. Undergraduate类是Student类的子类,实现本科生信息的初始化,实现抽象方法,输出本科生信息。
  4. Mygroup.java是接口声明
  5. StuGroup.java 其中的类实现了接口MyGroup。
    是添加学生信息、删除学生信息、显示学生信息、按照学生成绩排序,输出学生信息方法的实现。
    上述五个.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 
{
    
    //抽象学生类的属性有学号(int),姓名(String),数学成绩(double),计算机成绩(double)
	int num;
	String name;
	double mathScore;
	double computerScore;
    //【构造方法】 
	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(); //抽象方法,子类要实现这个方法,也就是输出学生的信息
}

//Postgraduate.java
package;
//创建源程序Postgraduate.java,其中的类Postgraduate继承源程序Student.java中的抽象类Student,实现其中的抽象方法print( ),并且,在父类的基础上增加两个新的属性:导师和研究方向。
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调用父类的构造方法
		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( )//子类实现抽象类的方法
	{
    
		System.out.println("研究生学生信息为:"+"学号:"+setNum()+",姓名:"+setName()+",数学成绩:"+setMathScore()+",计算机成绩:"+setComputerScore()+"导师:"+setTeacher()+",研究方向:"+setDirection());
	}

}

//Undergraduate.java
package;
//创建源程序Undergraduate.java,其中的类Undergraduate继承源程序Student.java中的抽象类Student,实现其中的抽象方法print( )。
public class Undergraduate extends Student{
    
	public Undergraduate(int num, String name, double mathScore, double computerScore) {
    
		super(num, name, mathScore, computerScore);//子类使用super调用父类的构造方法
	}
	 void print() 
	 {
    
		System.out.println("本科生信息:"+"学号:"+setNum()+" ,姓名:"+setName()+" ,数学成绩:"+setMathScore()+" ,计算机成绩:"+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()    //辅助方法,判断数组是否溢出
	{
    
		if(this.length<stu.length)
			return false;
		else
			return true;
	}
	
	public boolean isEmpty()    //判断数组是否为空
	{
    
		return this.length==0;
	}
	
	public boolean addStu(Student x)  //添加学生信息
	{
    
		if(isOverflow())
			return false;
		stu[length++]=x;
		return true;
	}
	
	public  Student removeStu(int index)  //删除指定位置的学生信息
	{
    
		if(isEmpty())
		{
    
			System.out.println("学生表空的~~~删除失败~~~~");
			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)   //按照成绩排序,参数1按数学排序,参数2按计算机排序
	{
    
		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("按数学成绩降序排列为:");
	
	     }
		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("按计算机成绩降序排名:");
		}
     }	
	public void print()
	{
    
		                 
		for(int i =0;i<length;i++)
			stu[i].print();//调用Student子类的print()方法
	}
		
}


结论分析:
(1) 通过抽象类Student和接口MyGroup分析对比总结:
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
1.接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
2.类可以实现很多个接口,类在实现接口方法时一定要用public来修饰,但是只能继承一个抽象类.
3.类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
4.抽象类可以在不提供接口方法实现的情况下实现接口。
5.Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
6.Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
7.接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
(2)Student stuB[] = new Undergraduate[num];//stuB[]对象数组是子类Undergraduate对象的上转型对象,通过本例总结:
上转型对象具有如下特点:
1.上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉了一些行为)。
2.上转型对象可以访问子类继承和隐藏的成员变量,也可以调用子类继承的方法或子类重写的方法。上转型对象操作子类继承的方法或子类重写的实例方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写了父类的某个实例方法后,当对象的上转型调用这个实例方法时一定是调用了子类重写的实例方法。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43296134/article/details/103177092

智能推荐

基于Kepler.gl 和 Google Earth Engine 卫星数据创建拉伸多边形地图-程序员宅基地

文章浏览阅读965次,点赞18次,收藏21次。现在我们有了 2021 年和 2023 年的 NDVI 数据帧,我们需要从 2021 年的值中减去 2023 年的值以捕获 NDVI 的差异。该数据集包括像素级别的植被值,我们将编写一个自定义函数来根据红色和绿色波段的表面反射率计算 NDVI。在我的上一篇文章中,我演示了如何将单个多边形分割/镶嵌为一组大小均匀的六边形。现在我们有了植被损失数据,让我们使用 Kepler.gl 可视化每个六边形的植被损失。将地图保存为 HTML 文件,在浏览器中打开 HTML 以获得更好的视图。现在我们将调用该函数并使用、

Echarts绘制任意数据的正态分布图_echarts正态分布图-程序员宅基地

文章浏览阅读3.3k次,点赞6次,收藏5次。正态分布,又称高斯分布或钟形曲线,是统计学中最为重要和常用的分布之一。_echarts正态分布图

Android中发送短信等普通方法_android bundle.get("pdus");-程序员宅基地

文章浏览阅读217次。首先要在Mainfest.xml中加入所需要的权限:[html] view plain copyprint?uses-permission android:name="android.permission.SEND_SMS"/> uses-permission android:name="android.permission.READ_SMS"/> _android bundle.get("pdus");

2021-07-26 WSL2 的安装和联网_wsl2 联网-程序员宅基地

文章浏览阅读2.6k次。0、说明最近在学习 Data Assimilation Research Testbed (DART) 相关内容,其软件是在 Unix/Linux 操作系统下编译和运行的 ,由于我的电脑是 Windows 10 的,DART 推荐可以使用 Windows Subsystem For Linux (WSL) 来创建一个 Windows 下的 Linux 子系统。以下的内容主要介绍如何安装 WSL2,以及 WSL2 的联网。1、如何在 Windows 10 下安装WSL具体的安装流程可以在 microso_wsl2 联网

DATABASE_LINK 数据库连接_添加 database link重复的数据库链接命-程序员宅基地

文章浏览阅读1k次。DB_LINK 介绍在本机数据库orcl上创建了一个prod_link的publicdblink(使用远程主机的scott用户连接),则用sqlplus连接到本机数据库,执行select * from scott.emp@prod_link即可以将远程数据库上的scott用户下的emp表中的数据获取到。也可以在本地建一个同义词来指向scott.emp@prod_link,这样取值就方便多了..._添加 database link重复的数据库链接命

云-腾讯云-实时音视频:实时音视频(TRTC)-程序员宅基地

文章浏览阅读3.1k次。ylbtech-云-腾讯云-实时音视频:实时音视频(TRTC)支持跨终端、全平台之间互通,从零开始快速搭建实时音视频通信平台1.返回顶部 1、腾讯实时音视频(Tencent Real-Time Communication,TRTC)拥有QQ十几年来在音视频技术上的积累,致力于帮助企业快速搭建低成本、高品质音视频通讯能力的完整解决方案。..._腾讯实时音视频 分享链接

随便推点

用c语言写个日历表_农历库c语言-程序员宅基地

文章浏览阅读534次,点赞10次,收藏8次。编写一个完整的日历表需要处理许多细节,包括公历和农历之间的转换、节气、闰年等。运行程序后,会输出指定年份的日历表。注意,这个程序只是一个简单的示例,还有很多可以改进和扩展的地方,例如添加节气、节日等。_农历库c语言

FL Studio21.1.1.3750中文破解百度网盘下载地址含Crack补丁_fl studio 21 注册机-程序员宅基地

文章浏览阅读1w次,点赞28次,收藏27次。FL Studio21.1.1.3750中文破解版是最优秀、最繁荣的数字音频工作站 (DAW) 之一,日新月异。它是一款录音机和编辑器,可让您不惜一切代价制作精美的音乐作品并保存精彩的活动画廊。为方便用户,FL Studio 21提供三种不同的版本——Fruity 版、Producer 版和签名版。所有这些版本都是独一无二的,同样具有竞争力。用户可以根据自己的需要选择其中任何一种。FL Studio21.1.1.3750中文版可以说是一站式综合音乐制作单位,可以让您录制、作曲、混音和编辑音乐。_fl studio 21 注册机

冯.诺伊曼体系结构的计算机工作原理是,冯 诺依曼型计算机的工作原理是什么...-程序员宅基地

文章浏览阅读1.3k次。冯诺依曼计算机工作原理冯 诺依曼计算机工作原理的核心是 和 程序控制世界上不同型号的计算机,就其工作原理而言,一般都是认为冯 诺依曼提出了什么原理冯 诺依曼原理中,计算机硬件系统由那五大部分组成的 急急急急急急急急急急急急急急急急急急急急急急冯诺依曼结构计算机工作原理的核心冯诺依曼结构和现代计算机结构模型 转载重学计算机组成原理 一 冯 诺依曼体系结构从冯.诺依曼的存储程序工作原理及计算机的组成来..._简述冯诺依曼计算机结构及工作原理

四国军棋引擎开发(2)简单的事件驱动模型下棋-程序员宅基地

文章浏览阅读559次。这次在随机乱下的基础上加上了一些简单的处理,如进营、炸棋、吃子等功能,在和敌方棋子产生碰撞之后会获取敌方棋子大小的一些信息,目前采用的是事件驱动模型,当下完一步棋界面返回结果后会判断是否触发了相关事件,有事件发生则处理相关事件,没有事件发生则仍然是随机下棋。1.事件驱动模型首先定义一个各种事件的枚举变量,目前的事件有工兵吃子,摸暗棋,进营,明确吃子,炸棋。定义如下:enum MoveE..._军棋引擎

STL与泛型编程-第一周笔记-Geekband-程序员宅基地

文章浏览阅读85次。1, 模板观念与函数模板简单模板: template< typename T > T Function( T a, T b) {… }类模板: template struct Object{……….}; 函数模板 template< class T> inline T Function( T a, T b){……} 不可以使用不同型别的..._geekband 讲义

vb.net正则表达式html,VB.Net常用的正则表达式(实例)-程序员宅基地

文章浏览阅读158次。"^\d+$"  //非负整数(正整数 + 0)"^[0-9]*[1-9][0-9]*$"  //正整数"^((-\d+)|(0+))$"  //非正整数(负整数 + 0)"^-[0-9]*[1-9][0-9]*$"  //负整数"^-?\d+$"    //整数"^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0)"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0..._vb.net 正则表达式 取html中的herf