-类继承与接口(三)实验报告
实验三 类的继承与接口
实验三类的继承与接口实验目的:1、熟练掌握Java语言面向对象的继承机制(extends关键字)2、在继承机制模式下熟练理解抽象类、抽象方法(abstract关键字)3、在继承机制模式下进一步深入掌握final、this、super的使用4、熟练掌握类的特殊形式-接口(interface)5、熟练掌握接口的实现(implements)、接口的继承(extends)6、熟练掌握Java语言中的内部类机制,重点掌握匿名内部类实现机制实验内容:一、类的继承题目一:填空,完成并运行程序。
写下程序运行结果并回答问题。
理解创建新类B(通过继承现有类A)的方法,使新类B具有类A的功能,并添加新的功能,编写主类考查通过继承创建的类B与父类A程序一:class A{int i,j;void showij(){System.out.println("i and j:"+i+" "+j);}}class B{ //B类继承A类的属性和方法int k;void showk(){System.out.println("k:"+k);}void sum(){System.out.println("i+j+k:"+(i+j+k));}}public class M1{public static void main(String args[]){A father =new A();B son=new B();father.i=10;father.j=20;//使用父类A中的方法son.i=7;son.j=8;son.k=9;//使用子类B从父类A中继承的方法//使用子类B新增的方法showk()son.sum();}}思考题:1、将父类A中的成员变量i声明为private,编译时观察有哪几处错误?2、在程序一中的子类B中添加语句:int i,j;(对父类A中的同名变量i,j 进行了重新定义)观察运行结果有什么不同?为什么?这种现象称为什么?3、在程序一中在子类B中添加成员方法:void showij(){System.out.println (“覆盖了父类的成员方法”);}(对父类A中的同名方法进行重新定义)观察运行结果有什么不同?为什么?这种现象称为什么?二、类的多态性目的:将功能相近的方法用同一名字表示。
java实验报告——继承与接口
System.out.print('\t'+"平均分");
System.out.println('\t'+"成绩等级");
for(int i=0; i<pg.length;i++) {
System.out.print(pg[i].Name); System.out.print('\t'+pg[i].Stu_type); System.out.print('\t'+String.valueOf(pg[i].C_score)); System.out.print('\t'+String.valueOf(pg[i].English_score)); System.out.print('\t'+String.valueOf(pg[i].Java_score)); System.out.print('\t'+String.valueOf(pg[i].score)); System.out.println('\t'+pg[i].sco_Level); } System.out.println(); } }
String Name=""; String Stu_type=""; int C_score; int English_score; int Java_score; int score; // String sco_Level=""; Sco_Level sco_Level;
public Student(String name,String stu_type,int sco1,int sco2,int sco3) {
java实验报告 类的继承
java实验报告类的继承一、实验目的1、深入理解 Java 中类的继承概念和机制。
2、掌握通过继承实现代码复用和功能扩展。
3、学会使用 super 关键字和方法重写。
二、实验环境1、操作系统:Windows 102、开发工具:Eclipse 或 IntelliJ IDEA三、实验内容1、创建一个父类`Animal`包含属性:`name`(字符串类型),`age`(整数类型)包含方法:`eat()`(打印出动物正在吃东西),`sleep()`(打印出动物正在睡觉)2、创建子类`Dog` 继承自`Animal`新增属性:`breed`(字符串类型,表示狗的品种)重写父类的`eat()`方法,打印出狗吃东西的特有方式新增方法:`bark()`(打印出狗在叫)3、创建子类`Cat` 继承自`Animal`新增属性:`color`(字符串类型,表示猫的颜色)重写父类的`sleep()`方法,打印出猫睡觉的特有姿势新增方法:`meow()`(打印出猫在叫)四、实验步骤1、在 Java 项目中创建一个名为`Animal` 的类:```javapublic class Animal {private String name;private int age;public Animal(String name, int age) {thisname = name;thisage = age;}public void eat(){Systemoutprintln(name +" is eating");}public void sleep(){Systemoutprintln(name +" is sleeping");}}```2、创建一个名为`Dog` 的类继承自`Animal`:```javapublic class Dog extends Animal {private String breed;public Dog(String name, int age, String breed) {super(name, age);thisbreed = breed;}@Overridepublic void eat(){Systemoutprintln(supergetName()+" the "+ breed +" dog is eating greedily");}public void bark(){}}```3、创建一个名为`Cat` 的类继承自`Animal`:```javapublic class Cat extends Animal {private String color;public Cat(String name, int age, String color) {super(name, age);thiscolor = color;}@Overridepublic void sleep(){Systemoutprintln(supergetName()+" the "+ color +" cat is sleeping curled up");}public void meow(){}}```4、在`Main` 类中进行测试:```javapublic class Main {public static void main(String args) {Dog dog = new Dog("Buddy", 3, "Labrador");dogeat();dogbark();dogsleep();Cat cat = new Cat("Mimi", 2, "White");cateat();catsleep();catmeow();}}```五、实验结果1、运行`Main` 类后,输出结果如下:`Buddy the Labrador dog is eating greedily``Buddy is barking``Buddy is sleeping``Mimi is eating``Mimi the White cat is sleeping curled up``Mimi is meowing`2、可以看到,子类`Dog` 重写了父类`Animal` 的`eat()`方法,展示了狗特有的吃东西方式;子类`Cat` 重写了父类的`sleep()`方法,展示了猫特有的睡觉姿势。
Java实验报告继承、多态、接口和异常处理
Java实验报告继承、多态、接⼝和异常处理实验5 继承、多态、接⼝和异常处理⼀、实验⽬的1、掌握Java的类和对象的声明和使⽤⽅法;2、掌握Java的类的继承和实现⽅法;3、掌握多态性在类的继承中的运⽤;4、掌握接⼝的定义与使⽤;5、掌握基本异常的处理机制;6、熟悉try语句与catch语句的搭配使⽤;7、了解有异常处理与没有异常处理的差别;8、多重catch语句的使⽤;9、使⽤Throws声明异常和Throw抛出异常。
⼆、实验环境1、PC微机;2、DOS操作系统或 Windows 操作系统;3、Java sdk程序开发环境、eclipse集成环境。
三、实验内容1. 设计三个类,分别是学⽣类Student,本科⽣类UnderGraduate,研究⽣类Postjgraduate,其中Student类是⼀个抽象类,它包含学⽣的基本信息如姓名、所学课程、课程成绩等,⽽Undergraduate类和Postgraduate类都是Student类的⼦类,这两个类计算课程成绩等级的⽅法有所不同,如下表所⽰。
假设某班级⾥既有研究⽣⼜有本科⽣,编写程序统计出全班学⽣2. 和Mobilephone具体实现,并设计⼀个应⽤程序类来使⽤这些类。
3.要求设计⼀个GUI图形窗⼝程序,该程序让⽤户输⼊⼀个星期中的任意⼀天的数字1-7,然后输出该数字所对应的是星期⼏。
四、实验步骤实验内容⼀1.建⽴package experiment5_1,其最终⽬录结构如下:2.建⽴Student类:package experiment5_1;public abstract class Student {final static int CourseNo = 3;String name;String type;int[] courses;String courseGrade;public Student(String name) {/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html = name; courses = new int[CourseNo];courseGrade = "" ;}public abstract void calculateGrade();public String getName( ) {return name;}public String getType( ) {return type ;}public String getCourseGrade( ) {return courseGrade;}public int getCourseScore(int courseNumber) {return courses[courseNumber];}public void setName(String name) {/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html = name;}public void setType(String type) {this.type = type;}public void setCourseScore(int courseNumber, int courseScore) { //按课程索引号设置课程成绩this.courses[courseNumber] = courseScore ;}}3.建⽴外部类(1)研究⽣类Postjgraduatepackage experiment5_1;public class postgraduate extends Student {public postgraduate(String name) {super(name);type = "研究⽣";}public void calculateGrade() {// TODO Auto-generated method stubint total = 0;double average = 0;for (int i = 0; i < CourseNo; i++) {total += courses[i];};average = total / CourseNo;if (average>=90&&average<100) courseGrade = "优秀"; else if (average>=80&&average<90) courseGrade = "良好"; else if (average>=70&&average<80) courseGrade = "⼀般"; else if (average>=60&&average<70) courseGrade = "及格"; else courseGrade = "不及格";}}(2)本科⽣类UnderGraduatepackage experiment5_1;public class undergraduate extends Student {public undergraduate(String name ) {super(name);type = "本科⽣";}public void calculateGrade() {int total = 0;double average = 0;for (int i = 0; i < CourseNo; i++) {total += getCourseScore(i) ;};average = total / CourseNo;if (average>=80&&average<100) courseGrade = "优秀"; else if (average>=70&&average<80) courseGrade = "良好"; else if (average>=60&&average<70) courseGrade = "⼀般"; else if (average>=50&&average<60) courseGrade = "及格"; else courseGrade = "不及格";}}4.编写代码测试函数package experiment5_1;public class polymorphism {public static void main(String[] args) {Student[] students = new Student[5];students[0] = new undergraduate("陈建平");students[1] = new undergraduate("鲁向东");students[2] = new postgraduate("匡晓华");students[3] = new undergraduate("周丽娜");students[4] = new postgraduate("梁欣欣");for (int i=0; i<5 ;i++) {students[i].setCourseScore(0,87);students[i].setCourseScore(1,90);students[i].setCourseScore(2,78);}for (int i=0; i<5 ;i++) {students[i].calculateGrade();}System.out.println("姓名" + " 类型" +" 成绩");System.out.println("-----------------------");for (int i=0; i<5 ;i++) {System.out.println(students[i].getName( )+" "+students[i].getType( )+" "+students[i].getCourseGrade( ));}}}实验内容⼆1.建⽴package experiment5_2,其最终⽬录结构如下:2.写接⼝Soundable代码:package experiment5_2;public interface Soundable {public void increaseV olume( );public void decreaseV olume( );public void stopSound( );public void playSound( );}3.创建三个类Radio、Walkman和Mobilephone具体实现,分别添加代码:// Mobilephone类package experiment5_2;class Mobilephone implements Soundable{public void increaseV olume( ) {System.out.println("增⼤⼿机⾳量");}public void decreaseV olume( ) {System.out.println("减⼩⼿机⾳量");}public void stopSound( ) {System.out.println("关闭⼿机");}public void playSound( ) {System.out.println("⼿机发出来电铃声");}}// Walkman类package experiment5_2;class Walkman implements Soundable { public void increaseV olume( ) { System.out.println("增⼤随声听⾳量"); }public void decreaseV olume( ) { System.out.println("减⼩随声听⾳量"); }public void stopSound( ) {System.out.println("关闭随声听");}public void playSound( ) {System.out.println("随声听发出⾳乐"); }}// Radio类package experiment5_2;class Radio implements Soundable{ public void increaseV olume( ) { System.out.println("增⼤收⾳机⾳量"); }public void decreaseV olume( ) { System.out.println("减⼩收⾳机⾳量"); }public void stopSound( ) {System.out.println("关闭收⾳机");}public void playSound( ) {System.out.println("收⾳机播放⼴播"); }}4.创建people类及编写测试代码://People类package experiment5_2;class People {public void listen(Soundable s) {s.playSound( );}}//测试代码package experiment5_2;import java.util.Scanner;public class InterfaceTest {public static void main(String[] args) {int i;People sportsman = new People( );Scanner scanner = new Scanner(System.in);Soundable[] soundDevice = new Soundable[3];//往声⾳设备数组中放⼊能发声的设备soundDevice[0] = new Radio( );soundDevice[1] = new Walkman( );soundDevice[2] = new Mobilephone();System.out.println("你想听什么? 请输⼊选择:0-收⾳机1-随声听2-⼿机");i = scanner.nextInt( );//开始听声⾳sportsman.listen(soundDevice[i]);soundDevice[i].increaseV olume( );soundDevice[i].stopSound();scanner.close();}}实验内容三1.建⽴package experiment5_3,其最终⽬录结构如下package experiment5_3;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class DateTransf extends JFrame implements KeyListener{/****/private static final long serialVersionUID = 1L;private static DateTransf frm;private static JTextField txt;private static JTextField data;DateTransf() {setTitle("数字与星期转换");setLocation(700, 300);setSize(400,130);}public static void main(String[] args) {frm = new DateTransf();frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setLayout(new GridLayout(2,2));txt = new JTextField(12);data = new JTextField(12);JLabel lable1 = new JLabel("输⼊数字:");JLabel lable2 = new JLabel("星期⼏:");frm.add(lable1);txt.addKeyListener(frm);frm.add(txt);frm.add(lable2);frm.add(data);frm.setVisible(true);}public void keyPressed(KeyEvent e) {if (e.getSource() == txt) {if (e.getKeyCode() == KeyEvent.VK_ENTER) // 判断按下的键是否是回车键{try {int number = Integer.parseInt(txt.getText());switch (number) {case 1:data.setText("Mon");break;case 2:data.setText("Tue");break;case 3:data.setText("Wen");break;case 4:data.setText("Thu");break;case 5:data.setText("Fri");break;case 6:data.setText("Sat");break;case 7:data.setText("Sun");break;default:JOptionPane.showMessageDialog(null, "您输⼊的数字不是1~7","⽆效⽇期",/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html RMATION_MESSAGE); break;}}catch (Exception e1) {// TODO: handle exceptionJOptionPane.showMessageDialog(null, "您输⼊的不是整数","⽆效⽇期",/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html RMA TION_MESSAGE); }}}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}}2.编译运⾏五、实验结果●实验内容⼀结果:●实验内容⼆结果:●实验内容三结果:六、实验⼩结1.这次实验的内容⽐较多,需要掌握Java的类和对象的声明和使⽤⽅法、Java的类的继承和实现⽅法、多态性在类的继承中的运⽤、接⼝的定义与使⽤、基本异常的处理机制、try语句与catch语句的搭配使⽤等等;2. 在实验过程中,重点是要区分好实例和类,灵活掌握类的调⽤。
java实验报告——继承与接口
南京理工大学泰州科技学院实验报告书课程名称:《Java 面向对象程序设计》实验题目:实验四继承与接口班级:09计算机(2)学号:0909030218姓名:尤源指导教师:李丛一、实验目的1.掌握Java语言的类的继承的概念。
2.掌握Java语言中抽象类的使用。
3.掌握Java语言中接口的使用4.掌握eclipse集成开发环境的使用。
二、实验内容1.类的继承,具体要求如下:(1)定义一Person类,该类具有属性人名、年龄、身份证号等信息以及将属性信息作为字符串返回的一方法;(2)定义一Student类,让该类继承Person类,该类除了具有属性人名、年龄、身份证号等信息以外还有学号,所在学校等信息;该类也具有将属性信息作为字符串返回的一方法;(3)编写测试类,测试这两个类2.定义一个动物抽象类Animal,该类有一个抽象的方法cry();定义一个小猫类Cat,该类继承了Animal类并实现了cry()方法,当调用cry()方法时打印“小猫喵喵叫”,定义一个小狗类Dog,该类也继承了Animal类并实现了cry()方法,当调用cry()方法时打印“小狗汪汪叫”。
3. 接口的运用。
定义一接口接口名叫Usb,该接口声明了两个方法分别为start()和stop()方法,定义一U 盘类UsbDiskWriter,一照相机类Camera、一手机类Mobile,让它们都实现该接口。
三、实验步骤实验(1)编写代码实验(2)编写代码实验(3)编写代码四、实验结果实验(1)运行结果实验(2)运行结果实验(3)运行结果五、结果分析1. 子类若想调用父类的构造函数必须要用super关键字。
2.接口体中只能运用抽象类。
3.在同一个java文件中只能在入口函数的类中用public。
接口用法示例实验报告(3篇)
第1篇一、实验目的1. 理解接口的概念和作用。
2. 掌握接口的基本用法,包括接口的定义、实现和实现类。
3. 通过实际操作,加深对接口的理解和应用。
二、实验环境1. 操作系统:Windows 102. 开发工具:IntelliJ IDEA3. 编程语言:Java三、实验内容1. 接口的基本概念2. 接口的定义与实现3. 接口的多态性4. 接口的应用示例四、实验步骤1. 接口的基本概念(1)打开IntelliJ IDEA,创建一个新的Java项目。
(2)在项目下创建一个包,命名为“com.example”,用于存放实验代码。
(3)在包下创建一个接口,命名为“IAnimal”,用于定义动物的基本行为。
```package com.example;public interface IAnimal {void eat();void sleep();}```2. 接口的定义与实现(1)在“com.example”包下创建一个类,命名为“Dog”,实现“IAnimal”接口。
```package com.example;public class Dog implements IAnimal {@Overridepublic void eat() {System.out.println("狗吃肉");}@Overridepublic void sleep() {System.out.println("狗睡觉");}}```(2)在“com.example”包下创建另一个类,命名为“Cat”,实现“IAnimal”接口。
```package com.example;public class Cat implements IAnimal {@Overridepublic void eat() {System.out.println("猫吃鱼");}@Overridepublic void sleep() {System.out.println("猫睡觉");}}```3. 接口的多态性(1)在主类“Main”中创建一个方法,用于测试接口的多态性。
Java实验3 继承与接口
实验3 继承与接口[实验目的]1、掌握java 继承中父类及其子类的定义方法。
2、掌握子类重写父类同名方法的方法。
3、掌握接口的用法。
[实验要求]1、复习理论教学中所学的内容。
2、认真进行实验预习,查阅参考书,书写源程序,书写实验预习报告。
3、认真总结实验并书写实验报告。
[实验课时] 2学时[实验教学方式] 学生上机实验,教师随堂指导。
[实验内容]1、定义父类People,分别定义People类的子类ChinaPeople,AmericanPeople和BeijingPeople 并分别重写父类中的各个方法。
最后在主方法中分别创建各子类的对象并调用各自的方法打印输出信息。
该程序的模板代码如下:请将其补充完整并调试运行。
class People{protected double weight,height;public void speakHello(){System.out.println("yayawawa");}public void averageHeight(){height=173;System.out.println("average height:"+height);}public void averageWeight(){weight=70;System.out.println("average weight:"+weight);}}class ChinaPeople extends People{【代码1】 //重写public void speakHello()方法,要求输出类似“你好,吃了吗”这样的//汉语信息【代码2】 //重写public void averageHeight()方法,要求输出类似//“中国人的平均身高:168.78厘米”这样的汉语信息【代码3】 //重写public void averageWeight()方法,//要求输出类似“中国人的平均体重:65公斤”这样的汉语信息public void chinaGongfu(){【代码4】//输出中国武术的信息,例如:"坐如钟,站如松,睡如弓"等}}class AmericanPeople extends People{【代码5】 //重写public void speakHello()方法,要求输出类似//“How do you do”这样的英语信息。
java实验报告3
java实验报告3java⾯对对象程序设计实验报告书实验名称:java继承与接⼝任课⽼师:李波学号:2012210922姓名:吴晗⼀实验⽬的和要求掌握对⼀个接⼝的不同实现的机制⼆实验内容1、编写⼀个Java应⽤程序,除了主类(TestOne)外,该程序中还有3个类:People、ChinaPeople 和AmericanPeople。
该程序具体要求如下:1)People类有public void speakHello()、public void averageHeight() 和public void averageWeight()⽅法。
2)ChinaPeople类是People的⼦类,新增了public void chinaGongfu()⽅法。
要求ChinaPeople 重写⽗类的public void speakHello()、public void averageHeight()和public void averageWeight()⽅法。
3)AmericanPeople类是People的⼦类,新增public void americanBoxing()⽅法。
要求AmericanPeople重写⽗类的public void speakHello()、public void averageHeight()和public void averageWeight()⽅法。
4)在TestOne类的主⽅法中分别创建各⼦类的对象并调⽤各⾃的⽅法打印输出信息。
即AmericanPeople类与ChinaPeople类同时继承People类,并对People类中已经有的⽅法进⾏重写,然后定义⼦类特有的⽅法,在⼀个测试类中创建这两个⼦类的对象,并调⽤这些⼦类的⽅法,观察结果的不同。
2、编写⼀个Java应⽤程序,除了主类(TestTwo)外,该程序还有Shape接⼝、三⾓形类Triangle 类、矩形Rectangle类。
java 继承与接口 实验三
信息与计算科学专业实验报告public class Example3.1{public static void main(String args[]){ChinaPeople chinaPeople=new ChinaPeople();AmericanPeople americanPeople=new AmericanPeople(); BeijingPeople beijingPeople=new BeijingPeople();chinaPeople.speakHello();americanPeople.speakHello();beijingPeople.speakHello();chinaPeople.averageHeight();americanPeople.averageHeight();beijingPeople.averageHeight();chinaPeople.averageWeight();americanPeople.averageWeight();beijingPeople.averageWeight();chinaPeople.chinaGongfu();americanPeople.americanBoxing();beijingPeople.beijingOpera() ;beijingPeople.chinaGongfu();}}实验结果:Company company=new Company(employee);System.out.println("公司年工资总额:"+company.salariesPay()); }}实验结果:(3)代码:interface ComputerWeight{public double computerWeight();}class Television implements ComputerWeight{public double computerWeight(){return 155;}}class Computer implements ComputerWeight{public double computerWeight(){return 105;}}class WashMachine implements ComputerWeightfor(int i=0;i<goodsOne.length;i++){if(i%3==0)goodsOne[i]=new Television();else if(i%3==1)goodsOne[i]=new Computer();else if(i%3==2)goodsOne[i]=new WashMachine();}for(int i=0;i<goodsTwo.length;i++){if(i%3==0)goodsTwo[i]=new Television();else if(i%3==1)goodsTwo[i]=new Computer();else if(i%3==2)goodsTwo[i]=new WashMachine();}Car bigcar=new Car(goodsOne);System.out.println("大货车装载的货物重量:"+bigcar.getTotalWeights()); Car smallcar=new Car(goodsTwo);System.out.println("小货车装载的货物重量:"+smallcar.getTotalWeights()); }}实验结果:。
继承电路技术实验报告(3篇)
第1篇一、实验目的本次实验旨在通过搭建一个简单的继承电路,加深对电路中基本元件及其连接方式的理解,掌握基本电路分析方法,并学习如何通过电路设计实现电路功能的继承和拓展。
二、实验原理继承电路是指通过电路设计,使得电路在原有的基础上,能够继承并扩展原有的功能。
在本次实验中,我们将通过搭建一个基本的串联电路,实现电路的继承功能。
三、实验器材1. 电源:直流电源,电压可调。
2. 电阻:不同阻值的电阻若干。
3. 电容:不同容值的电容若干。
4. 电感:不同电感的电感若干。
5. 开关:单刀单掷开关。
6. 导线:连接电路用。
7. 测量仪器:万用表。
四、实验步骤1. 搭建电路:- 根据实验要求,搭建一个串联电路,包括电源、电阻、电容和电感。
- 确保电路连接正确,无短路或断路现象。
2. 测量电路参数:- 使用万用表测量电路中各个元件的电阻、电容和电感值。
- 记录测量数据。
3. 分析电路特性:- 根据测量数据,分析电路的阻抗特性,计算电路的总阻抗。
- 分析电路的频率响应特性,观察电路在不同频率下的阻抗变化。
4. 电路继承设计:- 在原有的串联电路基础上,设计一个继承电路,增加一个新的功能。
- 例如,可以设计一个滤波电路,通过在原有电路中增加电容或电感,实现滤波功能。
5. 测试继承电路:- 使用万用表测试继承电路的参数,如滤波效果、电路阻抗等。
- 记录测试数据。
6. 分析与讨论:- 分析继承电路的设计原理,讨论电路设计过程中遇到的问题及解决方案。
- 比较继承电路与原有电路的差异,分析继承电路的优势。
五、实验结果1. 电路参数:- 电源电压:12V- 电阻R1:10Ω- 电容C1:100μF- 电感L1:1H2. 电路阻抗:- 频率f=1kHz时,电路阻抗Z=10.16Ω- 频率f=10kHz时,电路阻抗Z=9.84Ω3. 继承电路测试结果:- 滤波效果:在1kHz频率下,电路阻抗从10.16Ω降至8.92Ω,滤波效果明显。
实验三 继承和接口
实验三继承和接口1.写出实验具体内容5、6、7和8的代码。
5.定义三角形,继承于二维图形,实现父类的方法。
public class Triangle extends Plannar{double a,b,c;Triangle(){}Triangle(double x,double y,double z){a=x;b=y;c=z;}double getLong(){return a+b+c;}public double getArea(){double s=(a+b+c)/2;double area=Math.sqrt(s*(s-a)*(s-b)*(s-c));return area;}}6.定义圆柱体,继承于三维图形,实现父类的方法。
public class Cylinder extends ThreeDime{double high;double radius;Cylinder(double high,double radius){this.high=high;this.radius=radius;}double getVolume(){return Math.PI*radius*radius*high;}public double getArea(){double bottomArea=Math.PI*radius*radius;double sideArea=2*Math.PI*radius*high;return bottomArea+sideArea;}}7.定义直角三角形类,继承于三角形类,求其面积。
public class RightAngleTriangle extends Triangle{RightAngleTriangle(){}RightAngleTriangle(double x,double y,double z){a=x;b=y;c=z;}public double getArea(){return a*b/2;}}8.定义主类,利用接口回调方式调用直角三角形求面积的方法和求圆柱体的面积和体积的方法,并输出结果。
java 继承与接口 实验报告
应用数学学院专业1 班、学号_ _姓名___ __ 教师评定_________________实验题目继承与接口一、实验目的与要求实验目的:1、掌握类的继承关系。
2、掌握接口的定义与使用。
实验要求:按下列要求编写Java程序:1、定义接口Printx,其中包括一个方法printMyWay(),这个方法没有形参,返回值为空。
2、编写矩形类,矩形类要求实现Printx接口,有求面积、求周长的方法,printMyWay()方法要能显示矩形的边长、面积和周长。
3、编写正方形类作为矩形类的子类,正方形类继承了矩形类求面积和周长的方法,新增加求对角线长的方法,重写printMyWay()方法,要求该方法能显示正方形的边长、面积、周长和对角线长。
二、实验方案编辑该实验源程序如下:■LISTEN.javainterface Printx{ //定义接口public abstract void printMyWay();}class Rectangle implements Printx{ //矩形类double a,b;Rectangle(double a,double b){this.a=a;this.b=b;}public double getArea(){return a*b;}public double getLength(){return (a+b)*2.0;}public void printMyWay(){System.out.println("该矩形的长a="+a+"宽b="+b);System.out.println("面积s="+getArea());System.out.println("周长l="+getLength());}}class Square extends Rectangle{ //正方形类double c;Square(double a,double b){super(a,b);}public double getDiagonal(){c=Math.sqrt(a*a+b*b);return c;}public void printMyWay(){System.out.println("该矩形的长a="+a+"宽b="+b);System.out.println("面积s="+getArea());System.out.println("周长l="+getLength());System.out.println("对角线d="+getDiagonal());}}public class LISTEN {public static void main(String[] args) {Rectangle rectangle;Square square;rectangle=new Rectangle(11,5);square=new Square(5,5);rectangle.printMyWay();square.printMyWay();}}三、实验结果和数据处理运行上述源程序,可得如下运行结果:1、矩形长a=11 宽b=52、矩形长a=5 宽b=5四、结论接口是Java实现部分多继承功能的体现。
面向对象--类继承与接口实验报告
实验十类继承与接口(二)课程名称:面向对象程序设计实验项目名称:实验十类继承与接口(二)学生姓名:专业:学号:实验地点:实验日期:年月【实验目的】1.掌握Java类的继承特点,包括子类声明、对象创建2. 掌握域的继承与隐藏的特点和用法3. 掌握方法的继承与重写的特点和用法【实验内容】一. 改错题检查下面代码是否有错,如果有错,写明错误原因,并修正错误。
(1)class Aaa{int i;Aaa(){i=-1; }Aaa(int a){ i = a;}Aaa(double d){Aaa((int)d);}}是否出错:是出错原因(如果出错):构造器调用构造器不能直接用名class Aaa{int i;Aaa(){i=-1; }Aaa(int a){ i = a;}Aaa(double d){this((int)d);}}(2)class Aaa{int i;Aaa(){i=-1; }Aaa(int a){ i = a;}Aaa(double a){int b=(int)a;this(b);}}是否出错:是出错原因(如果出错):this放第一行class Aaa{int i;Aaa(){i=-1; }Aaa(int a){ i = a;}Aaa(double a){this((int)a);}}(3)class Aaa{int i;Aaa(int a){ i = a;}}class Bbb extends Aaa{Bbb(){ }}是否出错:是出错原因(如果出错):父类没有无参构造,子类中药通过super调用父类构造class Aaa{int i;Aaa(int a){ i = a;}}class Bbb extends Aaa{Bbb(int a) {super(a);}}(4)class Aaa{private int i;protected int j;}class Bbb extends Aaa{Bbb(){i = 10;j = 99;}}是否出错:是出错原因(如果出错):private只能在自己的类中使用class Aaa{protected int i;protected int j;}class Bbb extends Aaa{Bbb(){i = 10;j = 99;}}(5)编译下面程序,程序是否出错class A{int i =100;}class B extends A{int i =10000;public static void main(String[] args){a)是否出错:是b)出错原因(如果出错):不能在静态方法使用this superclass A{int i =100;}class B extends A{int i =10000;public void main(String[] args){}}c)如果将上述类B的int i =10000改为static int i =10000;类A的int i =100改为staticint i =100;程序是否出错?是出错原因(如果出错):不能在静态方法使用this superclass A{int i =100;}class B extends A{int i =10000;public void main(String[] args){}}d)如果将类B的main方法改为public static void main(String[] args){B b =new B();}程序是否出错? 是出错原因(如果出错):不能强制将in类型改为A如果没出错, 给出结果:上面的的含义:的含义:(6)class Aaa{int i;public void Aaa(int a){ i=a;}public static void main(String[] args){Aaa a = new Aaa(10);}}是否出错:是出错原因(如果出错):构造器没有返回class Aaa{int i;public Aaa(int a){ i=a;}public static void main(String[] args){Aaa a = new Aaa(10);}}(7)class Aaa{public static void main(String[] args){int[][] a=new int[5][];for( int i=0;i<;i++)for(int j=0;i<a[i].length;j++){a[i][j]= (int)(100*());}}}是否出错:出错原因(如果出错):for(int j=0;i<a[i].length;j++)出现无限循环class Aaa{public static void main(String[] args){int[][] a=new int[5][5];for( int i=0;i<;i++)for(int j=0;j<a[i].length;j++){a[i][j]= (int)(100*());}}}(8)class A{int abc(int i){return 1;} 程序分析设计题下面各个设计要放在各自的包中。
-类继承与接口(三)实验报告
浙江大学城市学院实验报告课程名称:面向对象程序设计实验项目名称:类继承与接口(三)学生姓名:专业:软件工程学号:实验地点:实验日期:年月日【实验目的】1.巩固Java类继承的相关知识2.理解对象上转型技术的优点和用途。
3.掌握接口的特点4.接口与抽象类的异同之处【实验内容】一、类继承相关知识强化1. 执行以下程序,给出执行Bbb的结果,并说明指出类Bbb的this.i与super.i的含义(即它们都对应哪个变量)。
class Aaa{int i;Aaa(int a){ i = a;}}class Bbb extends Aaa{int j,k;Bbb(int i){super(i);j = this.i;k = super.i;}public static void main(String[] args){Bbb b = new Bbb(18);System.out.println(b.j +"\t" + b.k);}}执行Bbb的结果:this.i与super.i的含义(即它们都对应哪个类中定义的变量):this.i和super.i 都对应Aaa中的变量2.接着上面例子,将类Bbb改写为以下代码,请写出程序运行结果,并说明这个例子与上面例子的区别。
class Bbb extends Aaa{int i= -1,j= -1,k= -1; //比上面例子增加一个实例变量i;Bbb(int i){super(i);j = this.i; //本语句含义是:k = super.i; //本语句含义是:}public static void main(String[] args){Bbb b = new Bbb(18);System.out.println(b.j +"\t" + b.k);}}执行Bbb的结果:这个例子与上面例子的区别:this.i对应Bbb中的isuper.i对应Aaa中的i3.对以下程序,给出执行Bbb的结果,并分析Bbb中main方法中a.show(1), b.show(1),c.show(1)的结果。
继承和接口的实验报告
深圳大学实验报告课程名称:JA V A程序设计实验项目名称:继承和接口学院:计算机与软件学院专业:指导教师:**报告人:侯锦辉学号:********** 班级:01 实验时间:2016-10-11实验报告提交时间:2016.10.22教务处制一、实验目的(1)理解继承的概念,掌握继承的语法;(2)学习定义和使用子类;(3)学习定义和使用抽象类;(4)学习定义和使用接口;(5)学习实现接口;(6)掌握继承过程中的方法覆盖,区分它与方法重载的不同;(7)掌握如何利用接口间接实现多重继承;(8)掌握对象类型之间的转换规则;(9)掌握多态与动态绑定。
二、实验内容本次实验内容有两题:第一题:(1)编写图形接口Shape,该接口包含一个常量pi(pi=3.14)和三个抽象方法:一个是getCircumference(),功能为求图形的周长;一个是getArea(),功能为求图形的面积;一个是getShapeName(),功能为返回图形的名称。
(2)编写类Show,该类有一个方法:printShape(Shape sh),功能为输出图形参数sh的名称、周长和面积。
(3)编写Show的两个子类,一个是圆形类Circle,另一个是矩形类Rectangle,要求这两个类都要实现图形接口Shape。
Circle类有一个成员变量:radius(圆的半径);Rectangle类有两个成员变量:height(长方形的高)和width(长方形的宽)。
并且,Rectangle类包含一个内部类JudgeSquare,它有一个方法judge(),判断这个长方形是否为一个正方形,并输出判断结果。
(4)编写测试类Test,生成一个Circle对象和两个Rectangle对象(一个为长方形,一个为正方形),三个对象分别调用父类的printShape方法,输出各自的周长和面积;其中Rectangle 对象还要调用内部类JudgeSquare的方法judge来判断自己是否为正方形;输出结果类似如下所示:(提示:实现一个接口的类的对象,可利用接口回调直接赋值给接口,和上转型类似(子类对象可直接赋值给父类对象))第二题:请设计3个类,分别是学生类Student,本科生类Undergraduate,研究生类Postgraduate,其中Student类是一个抽象类,它包含一些基本的学生信息,如姓名、类别(本科生还是研究生)、所学课程(这里假定为3门课,用一维数组表示)成绩和成绩等级等,而Undergraduate 类和Postgraduate都是Student类的子类,它们之间的主要差别是计算3门课程平均成绩等级的方法有所不同,研究生的标准要比本科生的标准高一些,如下表所示:80~100 优秀90~100 优秀70~80 良好80~90 良好60~70 一般70~80 一般50~60 及格60~70 及格50以下不及格60以下不及格假设某班级里既有本科生(3个)也有研究生(2个),请编写程序统计全班学生的成绩等级并显示出来。
继承与接口实验报告
继承与接口实验报告实验名称:继承与接口实验实验目的:通过编写一个Java程序,探究继承与接口的相关概念、特点和应用。
实验过程:在实验过程中,我们创建了一个Java程序,包含了多个类和接口,用于说明继承和接口的相关概念和应用。
其中,类之间的继承关系如下所示:``` Animal ├── Mammal │ ├── Cat │ └── Dog └── Reptile └── Snake ```注:以上为继承关系图,箭头指向父类/超类。
在该程序中,所有的动物(Animal)都有以下属性:- 名称(name) - 年龄(age)除此之外,猫(Cat)、狗(Dog)和蛇(Snake)都有自己的属性和方法。
其中,猫和狗都是哺乳动物(Mammal),而蛇是爬行动物(Reptile)。
我们使用了两个接口,分别是:- 可以发声的(Soundable) - 可以移动的(Movable)这两个接口分别定义了两个方法:发声(makeSound)和移动(move)。
在这些类和接口的基础上,我们编写了一个测试类(TestAnimals),测试了每个类和接口的功能。
实验结果:- Animal类:Animal类是所有动物的“祖先”类,它包含了所有动物共有的属性。
- Mammal类:Mammal类是哺乳动物的基类,它包含了所有哺乳动物共有的属性和方法。
- Reptile类:Reptile类是爬行动物的基类,它包含了所有爬行动物共有的属性和方法。
- Cat类:Cat类继承了Mammal类,它包含了猫的属性和方法。
- Dog类:Dog类继承了Mammal类,它包含了狗的属性和方法。
- Snake类:Snake类继承了Reptile类,它包含了蛇的属性和方法。
- Soundable接口:Soundable接口定义了makeSound 方法,用于让实现了该接口的类发出声音。
- Movable接口:Movable接口定义了move方法,用于让实现了该接口的类移动。
继承与接口实验报告
继承与接口实验报告本次实验主要涉及到Java中的继承和接口的使用。
通过实验,我们可以更好地理解和掌握继承和接口的概念、特点和使用方法。
实验步骤:1. 创建一个父类Animal,其中包含成员变量name和age,以及方法eat()和sleep()。
2. 创建两个子类Cat和Dog,它们分别继承自Animal类,并分别实现自己的eat()和sleep()方法。
3. 创建一个接口Swim,其中包含一个swim()方法。
4. 在Dog类中实现Swim接口,并实现swim()方法。
5. 创建一个测试类Test,其中包含main()方法。
在main()方法中,创建一个Cat对象和一个Dog对象,并分别调用它们的eat()和sleep()方法。
6. 在main()方法中,创建一个Swim类型的变量s,将Dog对象赋值给它,并调用s的swim()方法。
实验结果:通过实验,我们成功地创建了Animal类和它的两个子类Cat和Dog,它们分别继承了Animal类的成员变量和方法,并实现了自己的eat()和sleep()方法。
同时,我们还创建了Swim接口,并在Dog类中实现了它。
在测试类Test中,我们成功地创建了Cat和Dog对象,并调用了它们的eat()和sleep()方法。
同时,我们还创建了一个Swim 类型的变量s,将Dog对象赋值给它,并调用了s的swim()方法。
实验结论:通过本次实验,我们深入理解了Java中的继承和接口的概念和使用方法。
其中,继承可以让子类继承父类的成员变量和方法,从而避免了重复编写代码的问题;而接口则可以让类实现共同的方法,提高代码的重用性和可维护性。
同时,我们还学会了如何在子类中实现接口,并在测试类中使用。
这些知识对于我们今后的Java程序开发将有很大的帮助。
JAVA 实验报告类的继承与接口 期末考试重点答案
姓 专 名 业 学号 班级 面向对象程序设计 类的继承与接口 计算机 09 成 绩
指导教师 实验时间 2011-6-20
课程名称 实验名称 实验所用 仪器设备
一、实验目的: ⑴ 学习类的多态性。 ⑵ 学习接口的定义和实现接口的方法。 ⑶ 学习包的创建和引用,熟悉类成员的访问控制。 二、实验内容 (1) 定义一个抽象基类 Shape,它包含一个抽象方法 getArea(),从 Shape 类派 生出 Rectangle 和 Circle 类,这两个类都用 getArea()方法计算对象的面积。编写 编写应用程序使用 Rectangle 类和 Circle 类。 (2) 定义接口 myIntfc, 接口中只有一个名为 area 的方法, 该方法有一个 double 类型参数,返回类型也为 double。编写一个应用程序,并实现接口 myIntfc,接口中 area 方法的实现是返回参数的立方值;在应用程序中调用该方法并输出其结果。 (3) 定义一个类, 使该类中具有不同访问权限的成员, 将这个类存放在一个包中。 在另一个包内再编写第二个类, 在此类中编写一个方法, 在该方法中操作第一个类中 的成员。 三、实验步骤 (1) 1.定义一个抽象基类 Shape 2.在类 Shape 中建一个抽象方法 getArea() 3. 从 Shape 类派生出 Rectangle 和 Circle 类 4.在派生类 Rectangle 和 Circle 中分别编写自己的算法 5.利用主类调用类 Shape 的派生类 Rectangle 和 Circle 6.编译,执行 1. 定义接口 myIntfc 2. 接口中写一个 area 方法 3. myIntfc 5. 在接口中 area 方法的实现是返回参数的立方值 6. 在应用程序中调用该方法并输出其结果 7.调试结果,修改再调试 1. 定义一个类,使该类中具有不同访问权限的成员 2. 将这个类存放在一个包中 3. 在另一个包内再编写第二个类 4. 在此类中编写一个方法,在该方法中操作第一个类中的成员
继承实验报告实验总结
一、实验目的本次实验旨在通过C++语言对类的继承机制进行深入学习和实践,了解不同继承方式下基类成员在派生类中的访问权限,掌握构造函数与析构函数的调用时机与顺序,以及虚基类在多继承中的特殊作用。
二、实验内容1. 类的继承方式(1)公有继承在公有继承中,基类的公有成员和保护成员在派生类中分别作为公有成员和保护成员,派生类的成员函数可以直接访问它们,而无法直接访问基类的私有成员。
在类的外部,派生类的对象可以访问继承下来的基类公有成员。
(2)私有继承在私有继承中,基类的公有成员和保护成员作为派生类的私有成员,派生类的成员函数可以直接访问它们,但无法直接访问基类的私有成员。
在类外部,派生类的对象无法访问基类的所有成员。
(3)保护继承在保护继承中,基类的公有成员和保护成员作为派生类的保护成员,派生类的成员函数可以直接访问它们,但无法直接访问基类的私有成员。
在类外部,派生类的对象无法访问基类的所有成员。
2. 构造函数与析构函数的调用时机与顺序在多继承中,构造函数的调用顺序如下:(1)先调用所有基类的构造函数;(2)再调用派生类中子对象类的构造函数(如果派生类中没有子对象),最后调用派生类的构造函数;(3)析构函数的调用顺序与构造函数相反,先调用派生类的析构函数,再调用子对象类的析构函数,最后调用基类的析构函数。
3. 虚基类的构造函数与普通基类的构造函数在调用时的不同在多继承中,若存在虚基类,则其构造函数只会被调用一次,即使它在多个派生类中被继承。
这是因为虚基类在第一次继承时就已经初始化,后续的继承将直接使用已初始化的虚基类实例。
三、实验结果与分析1. 通过实验,我们验证了不同继承方式下基类成员在派生类中的访问权限,明确了公有继承、私有继承和保护继承的区别。
2. 实验结果显示,在多继承中,构造函数和析构函数的调用顺序符合预期,派生类可以正确地调用基类和子对象类的构造函数和析构函数。
3. 通过实验,我们了解了虚基类在多继承中的作用,避免了重复初始化同一基类的问题。
Java继承与接口实验报告
一、实验目的:1.掌握类的继承性;2.掌握Java的多态性;二、实验内容:1复数类的加减运算能够接收不同类型的参数既可以实现复数与实数的加减、复数与复数的加减运算。
2.习题5.93.习题5.10import java.util.Scanner;class A{int f(int a,int c){int m=a+c;return m;}int g(int b,int d){int n=b+d;return n;}int F(int a,int c){int m=a-c;return m;}int G(int b,int d){int n=b-d;return n;}}class B extends A{double f(double a,double c){double m=a+c;return m;}double g(double b,double d){double n=b+d;return n;}double F(double a,double c){double m=a-c;return m;}double G(double b,double d){double n=b-d;return n;}}public class fushu_1{public static void main(String args[]){B b=new B();System.out.println("选择int型请按1,选择double型请按2:");Scanner reader=new Scanner(System.in);int x=reader.nextInt();if(1==x){System.out.println("请输入两数据的实部或一个实部一个整数:");int p=reader.nextInt();int q=reader.nextInt();System.out.println("请输入两数据的虚部若为整数则输入0:");int j=reader.nextInt();int k=reader.nextInt();if(0!=k)System.out.println("你输入的数分别为:"+p+"+"+j+"i"+" "+q+"+"+k+"i");System.out.println("你输入的数分别为:"+p+"+"+j+" "+q);System.out.println("和为:"+b.f(p,q)+"+"+b.g(j,k)+"i");System.out.println("差为:"+b.F(p,q)+"-"+b.G(j,k)+"i");}if(2==x){System.out.println("请输入两数据的实部或一个实部一个整数:");double p=reader.nextDouble();double q=reader.nextDouble();System.out.println("请输入两数据的虚部若为整数则输入0:");double j=reader.nextDouble();double k=reader.nextDouble();if(0!=k)System.out.println("你输入的数分别为:"+p+"+"+j+"i"+" "+q+"+"+k+"i");if(0==k)System.out.println("你输入的数分别为:"+p+"+"+j+”i”+" "+q);System.out.println("和为:"+b.f(p,q)+"+"+b.g(j,k)+"i");System.out.println("差为:"+b.F(p,q)+"-"+b.G(j,k)+"i");}}}运行结果为:5.9 class A{char ch='a';char ch1='z';int m=(int)ch;int n=(int)ch1;void f(){for(int i=m;i<=n;i++){char ch2=(char)i;System.out.print(ch2+" ");}}}class B extends A{char GL='α';char GL1='ω';int p=(int)GL;int q=(int)GL1;void g(){for(int j=p;j<=q;j++){char GL2=(char)j;System.out.print(GL2+" ");}}}public class file5_9{public static void main(String args[]){B a=new B();System.out.println("英文字母为:");a.f();System.out.println();System.out.println("希腊字母为:");a.g();System.out.println();}}运行结果:5.10 import java.util.Scanner;class A{public int f(int a,int b){int m=0;for(int i=1;i<=a;i++){if(0==a%i&&0==b%i)m=i;}return m;}}class B extends A{public int f(int a,int b){int n=super.f(a,b);return a*b/n;}}//import java.util.Scanner;public class file5_10{public static void main(String args[]){A a=new A();B b=new B();Scanner reader=new Scanner(System.in);System.out .println("******注意输入的p和q不能小于或等于0******\n");System.out.println("请输入第一个数字p并按回车键");int p=reader.nextInt();while(p<=0){System.out.println("p不能小于或等于0,请从新输入:");p=reader.nextInt();}System.out.println("请输入第二个数字q并按回车键");int q=reader.nextInt();while(q<=0){System.out.println("q不能小于或等于0,请从新输入:");q=reader.nextInt();}//int p=5;//int q=6;System.out.println(p+"和"+q+"的最小公倍数为:");System.out.println(b.f(p,q));System.out.println(p+"和"+q+"的最大公约数为:"+"\n"+a.f(p,q));}}运行结果:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江大学城市学院实验报告课程名称:面向对象程序设计实验项目名称:类继承与接口(三)学生姓名:专业:软件工程学号:实验地点:实验日期:年月日【实验目的】1.巩固Java类继承的相关知识2.理解对象上转型技术的优点和用途。
3.掌握接口的特点4.接口与抽象类的异同之处【实验内容】一、类继承相关知识强化1. 执行以下程序,给出执行Bbb的结果,并说明指出类Bbb的this.i与super.i的含义(即它们都对应哪个变量)。
class Aaa{int i;Aaa(int a){ i = a;}}class Bbb extends Aaa{int j,k;Bbb(int i){super(i);j = this.i;k = super.i;}public static void main(String[] args){Bbb b = new Bbb(18);System.out.println(b.j +"\t" + b.k);}}执行Bbb的结果:this.i与super.i的含义(即它们都对应哪个类中定义的变量):this.i和super.i 都对应Aaa中的变量2.接着上面例子,将类Bbb改写为以下代码,请写出程序运行结果,并说明这个例子与上面例子的区别。
class Bbb extends Aaa{int i= -1,j= -1,k= -1; //比上面例子增加一个实例变量i;Bbb(int i){super(i);j = this.i; //本语句含义是:k = super.i; //本语句含义是:}public static void main(String[] args){Bbb b = new Bbb(18);System.out.println(b.j +"\t" + b.k);}}执行Bbb的结果:这个例子与上面例子的区别:this.i对应Bbb中的isuper.i对应Aaa中的i3.对以下程序,给出执行Bbb的结果,并分析Bbb中main方法中a.show(1), b.show(1),c.show(1)的结果。
class Aaa{void show(){System.out.println("Aaa中定义的show()");}void show(int i){System.out.println("Aaa中定义的show(int i)");}}class Bbb extends Aaa{void show(){System.out.println("Bbb中定义的show()");public static void main(String[] args){Aaa a = new Aaa();Bbb b = new Bbb();Aaa c = new Bbb();a.show(1);b.show(1);c.show(1);}}执行Bbb的结果:上面a.show(1)执行了那个类中定义的方法:上面b.show(1);执行了那个类中定义的方法:上面c.show(1)执行了那个类中定义的方法:分析:因为执行的是有参数的void show()所以调用的是Aaa中的方法。
C是上转型所以也是调用Aaa中的方法4. 对以下程序,给出执行Bbb的结果,并分析这个例子结果与前面第4个例子,你可以得出什么结论。
class Aaa{int i = 10;static void show(){System.out.println("Aaa中定义的show()");}}class Bbb extends Aaa{int i = 20;static void show(){System.out.println("Bbb中定义的show()");}public static void main(String[] args){Aaa a = new Aaa();Bbb b = new Bbb();Aaa c = new Bbb();a.show();b.show();c.show();((Bbb)c).show();System.out.println(c.i); //考虑此处System.out.println(((Bbb)c).i); //考虑此处}}执行Bbb的结果:((Bbb)c).show()执行结果:System.out.println(c.i)执行结果:System.out.println(((Bbb)c).i)执行结果:分析与结论:C进行的向上转型,将子类对象引用转换为超类类型。
所以c.i引用的是超类中的I 而也可以通过(Bbb)c向下转型二、程序分析思考以下是例5.22的部分关键代码,请分析思考以下问题:(1)Student类中设计抽象方法cost会带来什么好处?因为不同的学生所需要的学费不同,所以用抽象cost方法在不用的学生中调用cost 执行不同的代码返回对应的值。
(2)Student类的compareCost方法可以用于比较哪些类型的对象?如果没有设计抽象方法cost,那么会发生什么问题?可以比较上转型对象和子类对象。
如果没有抽象方法cost那么就必须在每一个子类都编写一个compareCost 导致太多的重复代码。
注意:分析重点是软件设计的通用性考虑。
abstract class Student {//定义学生对象的抽象超类private String name;public Student(String name){ = name; }public abstract double cost();//声明抽象方法,表示学习费用public double compareCost(Student otherStudent){//当前对象与参数对象的费用比较return this.cost() - otherStudent.cost(); //返回大于、等于、小于零的数字}public String getName(){return ; }public void setName(String name){ = name; }}class StudentCostTool{static double sumCost(Student[] students){//计算students所有学生的费用之和double sum = 0;for(int i=0;i<students.length;i++)sum = sum + students[i].cost();return sum;}static double averageCost(Student[] students){//计算students学生的平均费用return sumCost(students)/students.length;}static double maxCost(Student[] students){//计算students所有学生的费用最大值if(students.length == 1)return students[0].cost();int index = 0;for(int i=0;i<students.length;i++)if(students[index].compareCost(students[i]) < 0)index = i;return students[index].cost();}}三、接口与抽象类实验1. 编译下面的程序, 指出错误.interface A{ //语句1void show();void show(int i){System.out.println("A show()");}}(1) 是否出错? 出错原因?是,接口A必须是抽象方法即不能有实现代码。
(2) 如果将上面语句1的interface改为abstract class , 编译是否出错?(提示: 注意abstract修饰符)是。
之后变成了抽象类,那么void show()前面也应该加absrtract(3)根据上面的(1)和(2), 可以看出接口与抽象类的什么区别?接口中只能声明抽象方法,抽象类中既能声明抽象方法,也能声明非抽象方法,但抽象方法前面需要加上abstract。
接口则不需要。
2. 编译下面的程序, 指出错误.interface IA{void show();void show(int i);}class A implements IA{ //语句1public void show(int i){ //语句2System.out.println("A show()");}}(1) 上面的程序编译是否出错? 出错原因?出错,void show没有实现(2) 如果将语句1中的class 改为abstract class, 编译是否出错? 为何?否,因为抽象类可以不具体实现。
(3) 如果将语句2中的public删除, 编译是否出错? 为何?出错,因为interface中的方法都是public 所以子类中也应该声明为public3. 编译下面的程序, 回答问题abstract class A {public void show(){System.out.println("A show()");}}class AbstractClassTest{public static void main(String[] args){A a = new A();}}(1) 编译是否出错?出错(2) 类A的定义编译是否出错? 说明什么?(考虑抽象类中是否可以没有抽象方法)不出错,因为抽象类中是否可以没有抽象方法4. 编译下面的程序, 回答问题abstract class A{static abstract void show();class B extends A{public static void main(String[] args){show();}}(1) 上面的程序编译是否出错?是(2) 如何改正?abstract class A{public static abstract void show();}5. 编译下面的程序, 回答问题interface IA{int i;void show();}(1) 上面的程序编译是否出错?是,(2) 如果出错, 错在何处?I应该是一个静态常量需要赋值6. 编译下面的程序, 回答问题.interface IA{int i=100;void show(); //代码1}interface IB {int j=100;void show(int a); //代码2}class A implements IA,IB{public void show(){}//代码3public void show(int a){} //代码4}(1) 上面的程序编译是否出错?否(2) 代码1和代码3的区别是什么? 同样, 代码2与代码4的区别是什么?1 方法的声明,3是方法的实现7. 编译下面的程序, 回答问题.abstract class A{void show1(){}}abstract class B{void show2(){ }}class C extends A,B{void show3(){}}(1) 上面的程序编译是否出错?出错(2) 如果出错, 错在何处?类不能多重继承8. 编译下面的程序, 回答问题.final class A{void show(){}}class B extends A{void show2(){}}(1) 上面的程序编译是否出错?是(2) 如果出错, 错在何处?Final定义的不能继承9. 编译下面的程序, 回答问题.class A{final void show(){}}class B extends A{void show(){System.out.println("aaa");}}(1) 上面的程序编译是否出错?出错(2) 如果出错, 错在何处?Final类不能被覆盖10. 编译下面的程序, 回答问题.interface IA{} //没有定义任何成员class B{} //没有定义任何成员(1) 上面的程序编译是否出错?否(2) 如果没有出错, 你可以得出什么结论?接口和类都可以为空11.编译并运行下面程序,分析运行结果interface IStudent{void showDetail();}class Student implements IStudent{String name;int age;Student(){}Student(String name,int age){ = name;this.age = age;}public void showDetail(){System.out.println(name+"\t"+age);}}class GraduateStudent implements IStudent{String name;int age;String major;GraduateStudent(){}GraduateStudent(String name,int age,String major){ = name;this.age = age;this.major = major;}public void showDetail(){System.out.println(name+"\t"+age+"\t"+major);}}class InterfaceTest2{static void showStudent(IStudent iStud){ //代码1 iStud.showDetail();}public static void main(String[] args){Student a = new Student("张三",10);GraduateStudent b = new GraduateStudent("李斯",10,"cs");showStudent(a);showStudent(b);}}(1) 执行类InterfaceTest2, 输出结果是什么?张三10李斯10 cs(2) 请注意上面的代码1, 这是否说明如果某个类实现了某个接口所申明的方法, 那么可以通过该接口类型变量(而不是类引用变量)来调用所实现的方法?是实验报告要求将编程题源程序、运行结果,以及实验中遇到的问题和解决问题的方法,写在实验报告上。