0505秦振威软件一班实验四 类的继承.docx
- 文档编号:26519287
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:15
- 大小:39.29KB
0505秦振威软件一班实验四 类的继承.docx
《0505秦振威软件一班实验四 类的继承.docx》由会员分享,可在线阅读,更多相关《0505秦振威软件一班实验四 类的继承.docx(15页珍藏版)》请在冰豆网上搜索。
0505秦振威软件一班实验四类的继承
实验报告四
课程
Java程序设计
实验项目
类的继承
成绩
学号
201305020115
姓名
秦振威
实验
日期
15.10.22
专业
班级
13级软件一班
指导
教师
杨力
实验报告上传到邮箱scxdyl@邮件主题务必写上专业年级(第几班)(否则查不到你没法给成绩)学号姓名和实验四类的继承
一【实验目的】
1.掌握类的继承方法。
2.掌握变量的继承和覆盖。
3.掌握方法的继承、重载和覆盖。
二【实验内容】
实验1Java创建继承的书写格式
在同一源文件中
classA
{
//类体
}
[public]classBextendsA
{
//类体
}
仔细阅读下面的程序,观察继承的书写格式
classPerson
{
Stringname;
intage;
voidprint()
{
System.out.println("name:
"+name+"age:
"+age);
}
}
classStudentextendsPerson
{
Stringschool;
voidsetdata(Stringname1,intage1,Stringschool1)
{
name=name1;
age=age1;
school=school1;
}
voidprintall()
{
print();
System.out.println("school:
"+school);
}
}
publicclassTestPerson1
{
publicstaticvoidmain(String[]args)
{
Students1=newStudent();//第二步取消注释
s1.setdata("zhangli",20,"swpu");
s1.printall();
}
}
(1)在子类Student中没有name和age,print()的定义,但setdata方法使用了name和age,printall()方法中调用了print(),为什么?
因为父类中的name和age定义为默认数据类型,在同包中其他类中可以使用,print()方法同样是默认类型,在同包子类中可以调用;
(2)在父类中的成员访问控制都是缺省方式,缺省方式的成员,在同包子类和其他类是否可以访问,不同包的子类和其他类是否可以访问
在同包子类和其他类中可以访问,不同包的子类和其他类不可以访问;
(3)运行程序,观察结果,理解继承的执行过程
实验2理解父类成员访问控制在同包子类不同包子类及其他类的访问限制
(1)将实验1中的父类Person中的成员
Stringname;
改为privateStringname;
voidprint()
改为privateprint()
观察是否有语法错误,为什么?
有语法错误,因为name的类型为私有的,不允许其他类访问,同理print()方法也是这样。
总结父类private成员继承后的访问限制
(2)观察下面的protected成员,在子类和类外是否能访问
classPerson
{
protectedStringname;
intage;
protectedvoidprint()
{
System.out.println("name:
"+name+"age:
"+age);
}
}
classStudentextendsPerson
{
Stringschool;
voidsetdata(Stringname1,intage1,Stringschool1)
{
name=name1;
age=age1;
school=school1;
}
voidprintall()
{
print();
System.out.println("school:
"+school);
}
}
publicclassTestPerson1
{
publicstaticvoidmain(String[]args)
{
Students1=newStudent();//第二步取消注释
s1.setdata("zhangli",20,"swpu");
s1.printall();
s1.print();//继承的方法
}
}
1)把代码放入开发工具中,观察是否有语法错误,观察父类保护类型成员在子类的是否可以直接使用,在其他类中是否可以直接使用(s1.print())
在子类和类外可以访问,父类保护类型成员在子类可以直接使用,在其他类中同样可以直接使用
2)总结父类protected成员在同包子类和其他类,不同包子类和其他类中是否可以访问
父类的protected成员在同包子类和其他类中可以访问,不同包子类和其他类中不可以访问;
(3))总结父类public成员在同包子类和其他类,不同包子类和其他类中是否可以访问
父类public成员在同包子类和其他类可以访问,不同包子类和其他类同样可以访问。
实验3仿照前面的例子,编写下面的程序
定义一个Person类,数据成员包含能够保存姓名的变量name,voidsetname(Stringname)实现给name赋值,能够输出姓名的成员函数PrintName()。
现从Person类派生出Worker 类,该类包括数据成员number用来记录对象的工号;包括voidsetdata(Stringname,Stringnumber)实现对worker数据成员的赋值,函数成员printinfor()用来输出对象的name和number个人信息。
要求:
⑴在Worker类的setdate成员函数中调用Person类的成员函数setname()
(2)在Worker类的printinfor()成员函数中须调用Person类的成员函数PrintName()。
(3)通过main函数创建Worker对象,实现数据的输入和输出
输入可以通过键盘输入
publicclassPerson{
Stringname;
voidsetname(Stringname)
{
this.name=name;
}
voidPrintName()
{
System.out.println(name);
}
}
publicclassWorkerextendsPerson{
Stringnumber;
voidsetdata(Stringname,Stringnumber)
{
this.name=name;
this.number=number;
}
voidprintinfor()
{
PrintName();
System.out.println(number);
}
}
importjava.util.Scanner;
publicclassTestPerson1{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Workerw1=newWorker();
Scannerscan=newScanner(System.in);
w1.name=scan.next();
w1.number=scan.next();
w1.printinfor();
}
}
实验4通过构造函数在创建子类对象的时候给成员变量赋值
观察父类Person构造函数的书写,子类构造函数的书写和main函数调用子类对象的书写形式
classPerson
{
Stringname;
Person()
{
this("zhang");//调用自己有参构造函数
}
Person(Stringname)
{
this.name=name;
}
voidprint()
{
System.out.println("name:
"+name);
}
}
classStudentextendsPerson
{
Stringschool;
Student()
{
}
Student(Stringname,Stringschool)
{
super(name);//调用父类有参构造函数必须为第一句用super
this.school=school;
}
voidprintall()
{
print();
System.out.println("school:
"+school);
}
}
publicclassTestPerson1
{
publicstaticvoidmain(String[]args)
{
Students1=newStudent();//调用子类对象无参构造函数
Students2=newStudent("wang","SWPU");//调用子类对象对应的有参构造函数
System.out.println("创建子类对象无参数");
s1.printall();
System.out.println("创建子类对象有参数");
s2.printall();
}
}
(1)仔细阅读意思代码,运行程序,观察结果,理解子类构造函数和父类构造函数的调用顺序,进一步理解构造函数只有给成员变量赋初值
(2)理解super,super()和super(参数列表)的含义,说出什么情况下需要显式调用super构造方法,并且super构造方法放置的位置
当子类构造函数需要调用父类构造函数时,放在方法的第一条语句
(3)子类构造函数
Student()
{
}
并没有写super(),创建无参的子类对象的时候,是否调用的super()
调用了super()
仿照上面的例子,编程对实验3编程题进行改写
定义一个Person类,数据成员包含能够保存姓名的变量name,相关构造函数,voidsetname(Stringname)实现给name赋值,能够输出姓名的成员函数PrintName()。
现从Person类派生出Worker 类,该类包括数据成员number用来记录对象的工号,相关构造函数;包括voidsetdata(Stringname,Stringnumber)实现对worker数据成员的赋值,函数成员printinfor()用来输出对象的name和number个人信息。
通过main函数创建Worker无参和有参对象,实现数据的输入和输出
输入可以通过键盘输入
publicclassPerson{
Stringname;
Person()
{
this("qin");
}
Person(Stringname)
{
this.name=name;
}
voidsetname(Stringname)
{
this.name=name;
}
voidPrintName()
{
System.out.println(name);
}
}
publicclassWorkerextendsPerson{
Stringnumber;
Worker()
{
}
Worker(Stringname,Stringnumber)
{
super(name);
this.number=number;
}
voidprintinfor()
{
PrintName();
System.out.println(number);
}
}
importjava.util.Scanner;
publicclassTestPerson1{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Workerw1=newWorker();
Workerw2=newWorker("xiaowei","4166");
Scannerscan=newScanner(System.in);
w1.name=scan.next();
w1.number=scan.next();
w1.printinfor();
w2.printinfor();
}
}
实验5通过super类调用父类成员
观察父类和子类程序,子类中如何调用父类的方法的
classTestA
{
Stringstr="testa";
intt;
voidf()
{
System.out.println("调用父类f()");
}
}
publicclassTestB2extendsTestA
{
Stringstr="testb";
voidf()
{
super.f();
System.out.println("调用子类方法");
System.out.println(str+","+t);
System.out.println(this.str+","+this.t);
System.out.println(super.str+","+super.t);
}
publicstaticvoidmain(Stringargs[])
{
TestB2b=newTestB2();
b.f();
}
}
(1)说明this,super的区别
(2)this表示当前对象,也就是当前类对象,super表示当前类的父类。
(2)在子类中继承的父类成员在可以访问的前提下,可以通过super来访问父类继承过来的成员
写出通过super访问继承的父类成员变量和成员方法的形式
super.父类成员变量,super.父类成员方法
将以上各题的源程序、运行结果写在该题后面,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在下面的空白中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 0505秦振威软件一班实验四 类的继承 0505 秦振威 软件 一班 实验 继承