Java类和对象的设计原理
作者:王小王_123
一、实验目的
- 1. 掌握面向对象的编程思想、类与对象;
- 2. 掌握类的封装性、继承性和多态性的作用;
- 3. 掌握成员变量和成员方法的特性、构造方法、toString方法、equals方法的使用;
- 4. 掌握this、super、final、static等关键字的使用;
- 5. 掌握接口及接口对象的使用;
- 6. 掌握包的定义与使用;
- 7. 掌握四种访问控制权限private、default、protected、public。
二、实验代码
1.定义一个类MyProgram,包含两个属性:
一个是private的整型属性data、一个是private的String类型属性str,封装这两个属性的四个方法setData( )和getData( )、setStr( )和getStr( );重写toString方法(自定义格式);重写equals方法(属性data和属性str均相同才表示两个对象相等)。并编写测试程序,测试MyProgram类的使用。
package 作业练习.test2; public class MyProgram { public static void main(String[] args) { Test t1=new Test(); Test t2=new Test(); t1.setStr("A"); t2.setStr("B"); t1.setData(1); t2.setData(2); System.out.println(t1.equals(t2)); System.out.println(t1.toString()); System.out.println(t2.toString()); } } class Test{ private String str; private int data; public String getStr() { return str; } public void setStr(String str) { this.str = str; } public int getData() { return data; } public void setData(int data) { this.data = data; } @Override public boolean equals(Object object) { Test test =(Test) object; if(test.getData()==this.getData()&&test.getStr() == this.getStr()) { return true; } else { return false; } } @Override public String toString() { return "str为"+this.getStr()+"\tdata为:"+this.getData(); } }
2. 在Vehicle类的基础上创建一个Tractor(拖拉机)类
它不仅拥有journey、wheelNum、LoadNum、driveSpeed四个属性和DriveAt()方法,而且还拥有自己的plough()方法,在该方法中要求能够显示journey、wheelNum、LoadNum三个属性的值。请编写测试类,调用DriveAt()、plough()方法。
package 作业练习.test2; public class Vehicle { public float journey; public int wheelNum; public int loadNum; public int driveSpeed; public Vehicle() { journey = 100.3f; wheelNum = 4; loadNum = 1; } public void driveAt(int speed) { if (speed >= 60) { System.out.println("行车速度太快,容易造成事故"); driveSpeed = 40; } else { System.out.println("你在安全行驶速度内行驶"); driveSpeed = speed; } } } package 作业练习.test2; public class Tractor extends Vehicle { public void plough() { System.out.println("公里数:"+this.journey); System.out.println("车速:"+this.driveSpeed); System.out.println("承载量:"+this.loadNum); } public static void main(String[] args) { Tractor t = new Tractor(); t.plough(); t.driveAt(80); t.plough(); } }
3. 组合实现汽车类
问题描述:一辆Car有(has)四个轮子(Wheels)和一个发动机(Engine)。现在要求用组合方法设计类Car、类Wheel和类Engine。
(1) 类Engine 有字符串属性type记录发动机的型号;
有构造方法,可设置发动机的型号;
有方法start()启动引擎(输出发动机型号和字符串“starts”的)。
(2)类Wheel有字符串属性type记录轮胎的型号,有整数类型属性index记录当前轮胎编号(1:front-left,2:front-right,3:back-left,4:back-right);
有构造方法,可设置轮胎的型号和编号;
有方法roll()表示轮胎正在转动(输出轮胎型号、轮胎位置和“rolling”的字符串)。
(3)类Car有字符串属性model记录轿车的型号,有属性wheels[]和engine,分别是Wheel类对象数组和Engine类对象;
有构造方法,参数是三个字符串,分别表示轿车的型号、轮胎型号和发动机的型号;
有方法changeWheel()可以改变指定轮胎的型号;
有方法start(),先输出轿车型号和字符串“firing”,然后调用Engine的start(),再调用所有轮胎的roll(),最后显示轿车型号和字符串“running”。
(4)编写测试程序测试上述所有方法。
package 作业练习.test2; class Engine extends Car { String type ; public void Engine(String type) { this.type = type; } void start() { System.out.println(type + " starts"); } } class Wheel extends Car { String type ; int index = 0; public void Wheel(String type, int index) { this.type = type; this.index = index; } void roll() { System.out.println("wheel" + index + " " + type + " rolling"); } } public class Car { String model; static Wheel[] wheels; static Engine engine = new Engine(); Car(String model, Wheel[] wheels, String eg) { this.model = model; this.wheels = wheels; engine.Engine(eg); } Car() { } public void changeWheel(int index, String str) { wheels[index - 1].Wheel(str, index); } void start() { System.out.println(model + " firing"); engine.start(); for (int i = 0; i < 4; i++) { wheels[i].roll(); } } public static void main(String[] args) { Wheel[] wheels = new Wheel[4]; String model = "玛莎拉蒂"; String engine = "FSI2.0L"; for (int i = 1; i <= 4; i++) { wheels[i - 1] = new Wheel(); wheels[i - 1].Wheel("德国马牌", i); } Car car = new Car(model, wheels, engine); car.start(); System.out.println("-----更改轮胎型号-----"); car.changeWheel(2, "米其林"); car.changeWheel(3, "倍耐力"); car.start(); } }
4. 有图形接口Shape
有图形接口Shape,参照圆Circle类补充完整正方形Square和三角形Triangle类,并分析运行结果。
package 作业练习.test2; interface Shape { void draw(); void erase(); } class Circle implements Shape { public void draw() { System.out.println("Circle.draw()"); } public void erase() { System.out.println("Circle.erase()"); } } class Square implements Shape { public void draw() { System.out.println("Square.draw()"); } public void erase() { System.out.println("Square.draw()"); } } class Triangle implements Shape { public void draw() { System.out.println("Triangle.draw()"); } public void erase() { System.out.println("Triangle.draw()"); } } public class Shapes { public static Shape randShape() { switch ((int) (Math.random() * 3)) { default: case 0: return new Circle(); case 1: return new Square(); case 2: return new Triangle(); } } public static void main(String[] args) { Shape[] s = new Shape[9]; for (int i = 0; i < s.length; i++) s[i] = randShape(); for (int i = 0; i < s.length; i++) s[i].draw(); } }
5. USB接口程序设计
通常人们使用的计算机上都有USB接口,鼠标、键盘、麦克风等都可以连接到USB接口中使用。在计算机启动时,这些设备也随之启动;当计算机关闭时,这些设备也会随之关闭。鼠标、键盘、麦克风等USB接口设备都启动后,计算机才开机成功;当这些设备都关闭后,计算机才关机成功。
读所编写的USB接口程序,该程序模拟了计算机的开机和关机过程,写出运行结果。
package 作业练习.test2.USB接口; public class Computer { private USB[] usbArr=new USB[4]; //向计算机上连接一个USB设备 public void add(USB usb){ //遍历所有的插槽 for(int i=0;i<usbArr.length;i++){ //如果发现一个空的 if(usbArr[i]==null){ usbArr[i]=usb; break; } } } //计算的开机功能 public void powerOn(){ //遍历所有的插槽 for(int i=0;i<usbArr.length;i++){ //如果发现有设备 if(usbArr[i]!=null){ //将USB设备启动 usbArr[i].turnOn(); } } System.out.println("计算机开机成功!!!"); } //计算的关机功能 public void powerOff(){ //遍历所有的插槽 for(int i=0;i<usbArr.length;i++){ //如果发现有设备 if(usbArr[i]!=null){ //将USB设备关闭 usbArr[i].turnOn(); } } System.out.println("计算机关机成功!!!"); } }
package 作业练习.test2.USB接口; public class KeyBoard implements USB { @Override public void turnOn() { System.out.println("键盘启动了......"); } @Override public void turnOff() { System.out.println("键盘关闭了......"); } }
package 作业练习.test2.USB接口; public class Mic implements USB { @Override public void turnOn() { System.out.println("麦克风启动了......"); } @Override public void turnOff() { System.out.println("麦克风关闭了......"); } }
package 作业练习.test2.USB接口; public class Mouse implements USB { @Override public void turnOn() { System.out.println("鼠标启动了......"); } @Override public void turnOff() { System.out.println("鼠标关闭了......"); } }
package 作业练习.test2.USB接口; public class Test { public static void main(String[] args) { //实例化计算机对象 Computer computer=new Computer(); //向计算机中添加鼠标、麦克风、键盘 computer.add(new Mouse()); computer.add(new Mic()); computer.add(new KeyBoard()); //启动计算机 computer.powerOn(); //关闭计算机 computer.powerOff(); } }
package 作业练习.test2.USB接口; public interface USB { void turnOn();//启动 void turnOff();//关闭 }
6.this关键字主要有三个应用:
(1)this调用本类中的属性,也就是类中的成员变量;
(2)this调用本类中的其他方法;
(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。
7.请简述static关键字的作用
static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
static修饰的方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都必须依赖具体的对象才能够被调用。static块可以优化程序性能,是因为它的特性:只会在类被初次加载的时候执行一次。
8.请简述super关键字的作用
super用于在 派生类中调用父类的重名方法,或者引用重名的变量。super被用在派生类中,就是为了明确调用父类的方法。
class base { int a = 100; } class sup1 extends base { int a = 200; void show() { System.out.println(a); System.out.println(a); } public static void main(String[] args) { new sup1().show(); } }
9.请简述final关键字的作用
final关键字可以用于三个地方。用于修饰类、类属性和类方法。被final关键字修饰的类不能被继承,被final关键字修饰的类属性和类方法不能被覆盖(重写);对于被final关键字修饰的类属性而言,子类就不能给他重新赋值了,如果重新赋值,会报错
到此这篇关于Java类和对象的设计原理的文章就介绍到这了,更多相关Java类和对象 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!