《2016级java语言实验3指导(面向对象程序设计(继承、封装、多态))(共14页).docx》由会员分享,可在线阅读,更多相关《2016级java语言实验3指导(面向对象程序设计(继承、封装、多态))(共14页).docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上上机实验三:面向对象程序设计(继承、封装、多态)类是面向对象程序设计的基础,是Java的核心和本质所在,在Java中,所有的语言元素都封装在类中。编写java程序的过程就是从现实世界中抽象出java可实现的类,并用合适的语句定义它们的过程,本节将学习类的应用,以及如何创建类的实例,通过类的继承更有效的组织程序结构,明确类之间的关系。掌握本节所讲的内容后,读者就可以使用面向对象技术编写java程序了。接口是特殊的抽象类,只包含常量和方法的定义,而没有方法的实现,也就是说接口是方法定义和常量值的集合。包是Java语言中有效管理类的一个机制。通过关键字package声明包语
2、句,package语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包。使用import语句可以引入包中的类。一、实验目的1) 掌握类的定义和使用2) 掌握对象的声明和使用3) 了解构造函数的概念和使用4) 掌握类的继承关系和派生方法5) 掌握多态的概念与使用6) 掌握接口的定义和使用7) 掌握Java中包的应用二、实验内容1) 类的声明2) 定义类成员变量以及成员方法3) 实例化类、创建类对象以及类方法的调用4) 类的继承5) 通过实例理解接口的定义6) 通过实例熟悉接口的应用7) 正确应用Java中包和import语句三、实验步骤1) 类和类的实例化一个类的实现包括两部分:类声
3、明和类体。(1)、类声明publicabstractfinal class className extends superclassNameimplements interfaceNameList期中修饰符publicabstractfinal说明类的属性className为类名superclassName为父类的名字interfaceNameList为类实现的接口列表(2)、类体类体定义如下class classNamepublic|protected|private static final transient volatileType variableName; /成员变量public|
4、protected|private static final abstract native synchronizedreturnType methondName ( paramList ) throws exceptionListstatements /成员方法(3)、成员变量成员变量的声明方式如下 public|protected|private static final transient volatileType variableName; /成员变量其中:public|protected|private 可见性 static 静态变量(类变量),相当于实例变量 final 常量 tr
5、ansient 暂时性变量,用于对象存档 volatile 变量,用于共发线程的共享(4)、成员方法public|protected|private static final abstract native synchronizedreturnType methondName ( paramList ) throws exceptionList/方法体的声明statements /方法体其中:public|protected|private 可见性 static 静态方法,也叫类方法,可以通过类名直接调用 final 方法不能被重写abstract 抽象方法,没有方法体(体现多态时常用) na
6、tive 集成其他语言的代码 synchronized 控制多个并发线程的访问例子3-1请根据注释填写语句,并上机调试成功根据注释添加语句,并调试和修改程序,使其能够执行。-class Retangle public Retangle(double l, double w) length = l; width = w; public double calcPerimeter() /返回周长 (1) public double calcArea() /返回面积 (2) public void Show() /显示矩形的长和宽 (3) protected double length; protec
7、ted double width; class Square extends Retangle public Square(double side) /调用父类的构造方法 (4) public double calcPerimeter() return width * 4; public void Show() System.out.println( “边长为” + width + “的正方形”); public class Test public static void main(String args)Square sq1=new Square(2.0); sq1.Show();Syste
8、m.out.println("正方形的边长为"+sq1.calcPerimeter();(1) return (width+length)*2;(2) return width*length;(3) System.out.print("length="+length+"n"+"width="+width;(4) super(side,side);-填写的语句是:class Retangle public Retangle(double l, double w) length = l; width = w; publ
9、ic double calcPerimeter() /返回周长 return (width+length)*2; public double calcArea() /返回面积 return width*length; public void Show() /显示矩形的长和宽 System.out.print("length="+length+"n"+"width="+width ) ; protected double length; protected double width; class Square extends Retan
10、gle public Square(double side) /调用父类的构造方法 super(side,side); public double calcPerimeter() return width * 4; public void Show() System.out.println( "边长为" + width + "的正方形"); public class Test public static void main(String args)Square sq1=new Square(2.0); sq1.Show();System.out.prin
11、tln("正方形的周长为"+sq1.calcPerimeter();2) 类的继承继承是面向对象程序设计的方法中的一种重要手段,通过继承可以更有效的组织程序的结构,明确类之间的关系。继承通过extends关键字来实现,子类继承父类的属性和行为,同时可以修改父类的属性和行为,并添加新的属性和行为。Java不支持多重继承。创建子类的格式如下class SubClass extends SuperClass其中 SubClass子类的名称extends继承的关键字SuperClass父类的名字 例子3-2 请分析程序,填写语句的功能注释,并上机调试成功。下面这个例子通过点、圆的层
12、次结构,介绍类的继承。-import java.text.DecimalFormat; /调用格式化数字输出import javax.swing.JOptionPane; / joptionpane让您轻松弹出一个标准的对话框class Point /父类点的的定义 protected int x,y ; / 定义点的坐标public Point() / 确定构造函数setPoint(0,0); public Point(int a,int b) /构造函数重载 带参数的构造函数setPoint(a,b);public void setPoint(int a,int b) / (1) x=a;
13、y=b;public int getX()return x; /获得X的坐标public int getY() return y; / 获得Y的坐标public String toString()return ""+x+","+"y"+""/*子类圆的定义*/class Circle extends Point /圆类继承父类点类 protected double radius ;/定义圆的半径public Circle() setRadius(0);/ 定义子类的构造函数,隐含调用了父类的构造函数public C
14、ircle(double r,int a,int b)super(a,b);/ (2) setRadius(r);public void setRadius(double r)radius = (r>=0.0?r:0.0); / (3) public double getRadius() / 获得圆半径 return radius; public double area() / (4) return Math.PI*radius*radius; public String toString()/圆的半径。以及圆心坐标转换成字符串输出return "Center="+&
15、quot;"+x+","+y+""+"Radius="+radius; public class InheritanceTestpublic static void main(String args)Point pointRef,p;/声明两点对象Circle circleRef,c;/声明两圆对象String output;/定义一个字符串变量p=new Point(30,50);/给点对象赋值c=new Circle (2.7,120,89);/给圆对象赋值 /把点对象和圆对象转换成字符串后给字符串output赋值out
16、put="Pointp:"+p.toString()+"nCirclec:"+c.toString();pointRef=c;output=output+"nnCircle c(via poineRef):"+pointRef.toString();circleRef=(Circle)pointRef; output=output+"nnCircle c(via poineRef):"+circleRef.toString();DecimalFormat precision2=new DecimalFormat(&
17、quot;0.00");output+= "nAreaofc(via circleRef):"+precision2.format(circleRef.area();/将圆定义成点对象输出if( p instanceof Circle ) / (5) circleRef=(Circle) p;output+="nn cast successful" else output+="nn p dose not refer to a Circle"/利用对话框输出相关信息JOptionPane.showMessageDialog(n
18、ull,output,"InheritanceTset",JOptionPane.INFORMATION_MESSAGE);/退出System.exit(0);语句的功能注释:(1) 方法成员,设置变量x、y(2) 调用父类的构造函数 (3) 设置半径 (4) 求取面积 2. 接口的定义与应用接口声明的形式如下所示:interface 接口名字 /常量定义和方法定义接口使用的关键字是implements,形式如下所示:class A implements Printable , Addable其中类A中使用接口Printable 和 Addable接口的特点:1.类体中必须
19、实现接口中定义的所有方法;2. 接口中的方法和常量必须是public的。3.实现方法时,方法头必须一致(返回值类型,名字,参数);4.父类被继承时,接口同时被继承;5.接口也可被继承,关键字为extends;6.接口一般表示功能,而类一般表示属性。例子3-3本实例实现了一个字符栈。程序思路是:首先定义一个字符栈的接口CharStackInterface,定义了栈的空间容量,规定栈所包含的方法,然后定义栈类CharStack,该类实现了字符栈的接口,最后编写测试类StackDemo进行测试。请根据编程思路实现字符栈的接口CharStackInterface,并调试程序正确运行,写出程序执行结果。
20、-interface CharStackinterface/需要实现的字符栈接口class CharStack implements CharStackinterfacechar data;int top;CharStack()data=new charmaxsize;public void initStack()top=-1;public boolean push(char x)if(!full()data+top=x;return true;elsereturn false;public char pop()if(!empty()top-;return datatop+1;elseretu
21、rn '0'public boolean empty()return top=-1;public boolean full()return top=maxsize-1;public class StcckDemo public static void main(String args)CharStack s=new CharStack();s.initStack();s.push('A');s.push('B');System.out.println(s.pop();System.out.println(s.pop();字符栈的接口CharSta
22、ckInterface:程序的执行结果:四、上机实践1.编写程序:在圆类的基础上派生出了圆锥类,按照注释填空,并调试执行成功,写出程序的执行结果。 class Circle double r ; Circle( ) (1) /无参构造方法,默认半径为1.0Circle(double a) /有参构造方法 (2) double Area( ) (3) /返回面积double Girth( ) (4) /返回周长class Cone extends Circledouble h;Cone() super();h=1.0;Cone(double rr,double hh) (5) /为半径和高赋值
23、double V() (6) /返回圆锥的体积public class ConeTestpublic static void main(String args) Cone c1=new Cone(); System.out.println(c1.V(); Cone c2=new Cone(1.0,3.0); System.out.println(c2.V(); -按照注释的填空:(1) r=1.0(2) this.a=a;(3) return Area(4) return Girth(5) rr=r; hh=h;(6) return V程序的执行结果:c1./3c2. 2. 下面程序实现了抽象
24、类的继承和接口的实现,同时还体现了接口的回调和向上转型,请调试该程序,根据注释填空,并写出程序执行结果。-abstract class Person public abstract void Eat();public abstract void Sleep();interface Father public void Smoking();public void GoFishing();interface Mon public void WatchTV(); public void Cook();class Me /(1)继承Person类,实现Father和Mon接口 public void
25、Eat() System.out.println("我喜欢吃鱼香茄子"); public void Sleep() System.out.println("我喜欢睡觉时做梦"); public void Smoking() System.out.println("我不喜欢抽烟"); public void GoFishing() System.out.println("我喜欢钓鱼");public void WatchTV() System.out.println("我喜欢看电视");publi
26、c void Cook() System.out.println("我不太会做菜"); public class Test3 public static void main(String args) Person p1 = new Me(); p1.Eat(); /(2)调用p1的Sleep()方法 Mon m1 = (Mon)p1; /(3)调用m1的WatchTV()方法 m1.Cook(); -根据注释填空:(1) extends Person implements Father,Mon(2) p1.Sleep(3) m1.Cook程序执行结果:我喜欢吃鱼香茄子我喜欢
27、睡觉时做梦妈妈喜欢看电视妈妈不太会做菜3. 将程序上机调试成功,并写出程序执行结果。-import java.util.*;interface Instrument5 int i = 5; void play(); String what(); void adjust();class Wind5 implements Instrument5 public void play() System.out.println("Wind5.play()"); public String what() return "Wind5" public void adjus
28、t() class Percussion5 implements Instrument5 public void play() System.out.println("Percussion5.play()"); public String what() return "Percussion5" public void adjust() class Stringed5 implements Instrument5 public void play() System.out.println("Stringed5.play()"); pub
29、lic String what() return "Stringed5" public void adjust() class Brass5 extends Wind5 public void play() System.out.println("Brass5.play()"); public void adjust() System.out.println("Brass5.adjust()"); class Woodwind5 extends Wind5 public void play() System.out.println(&
30、quot;Woodwind5.play()"); public String what() return "Woodwind5" public class Music5 static void tune(Instrument5 i) i.play(); static void tuneAll(Instrument5 e) for(int i = 0; i < e.length; i+) tune(ei); public static void main(String args) Instrument5 orchestra = new Instrument55; int i = 0; orchestrai+ = new Wind5(); orchestrai+ = new Percussion5(); orchestrai+ = new Stringed5(); orchestrai+ = new Brass5(); orchestrai+ = new Woodwind5(); tuneAll(orchestra); 程序执行结果:专心-专注-专业