软件设计基础实践-Java面向对象编程练习题

第1关:正方体底面周长、底面面积和体积计算

200

  • 任务要求
  • 参考答案
  • 评论28

任务描述

本关任务:编程正方体类,计算正方体的底面周长、底面面积和体积。

相关知识

为了完成本关任务,你需要掌握:1.类的继承,2.superthis关键字。

类的继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法。

格式说明:

 
  1. class 父类 {
  2. }
  3. class 子类 extends 父类 {
  4. }

举例说明:

  • 小孩:属性(姓名,年龄,性别),方法(吃饭,睡觉,上学);
  • 老人:属性(姓名,年龄,性别),方法(吃饭,睡觉);

从上可以看出,小孩和老人有相同的属性和一些相同的方法,我们可以将其相同的属性和方法提取出来写在父类(Person)中,将不同部分写在子类中。 代码为:

 
  1. class Person{
  2. string name;
  3. int age;
  4. string sex;
  5. void eat(){
  6. System.out.println(name+"需要吃饭");
  7. }
  8. void sleep(){
  9. System.out.println(name+"需要睡觉");
  10. }
  11. }
  12. class Student extends Person{
  13. void goschool(){
  14. System.out.println(name+"需要上学");
  15. }
  16. }
  17. class Elder entends Person{
  18. }
super和this关键字

super关键字:我们可以通过super关键字实现对父类成员的访问,用来引用当前对象的父类。 this关键字:指向自己的引用。

举例说明:

 
  1. class Animal {
  2. void eat() {
  3. System.out.println("animal : eat");
  4. }
  5. }
  6. class Dog extends Animal {
  7. void eat() {
  8. System.out.println("dog : eat");
  9. }
  10. void eatTest() {
  11. this.eat(); // this 调用自己的eat方法
  12. super.eat(); // super 调用父类的eat方法
  13. }
  14. }
  15. public class Test {
  16. public static void main(String[] args) {
  17. Animal a = new Animal();
  18. a.eat();
  19. Dog d = new Dog();
  20. d.eatTest();
  21. }
  22. }

输出为:

 
  1. animal : eat
  2. dog : eat
  3. animal : eat
编程要求

上一次实验中定义了矩形类Rectangle

  • 成员变量有:widthlength
  • 成员方法有:area()perimeter()

派生一个子类:正方体类Cube。若正方体类的操作是求

  • 底面周长
  • 底面面积
  • 正方体体积

思考:这个子类除了从父类那里继承来的方法之外,还需要做哪些修改?

编写一个正方体类,要求实现:

  • 使用两种构造方法
  • 至少各创建一个正方体对象实例(cc1),c的边长为10c1的边长为5
  • 分别计算两个正方体的底面周长、底面面积和体积。
测试说明

无测试输入 预期输出: c底面周长:40.0 c底面面积:100.0 c体积:1000.0 c1底面周长:20.0 c1底面面积:25.0 c1体积:125.0


开始你的任务吧,祝你成功!

package step1;
//编写一个Cube类继承Rectangle
public class Cube extends Rectangle{
	/*********begin*********/
	//创建两个构造函数  
    //创建 无参 构造函数  调用父类构造方法默认 宽高 都为10
    public Cube(){
        super(10,10);
    }
    
    //创建 有参 构造函数 参数为 double d
    public Cube(double d){
        super(d,d);
    }
	//调用父类中的area方法和perimeter方法
	double area=super.area();
    double perimeter=super.perimeter();
	//编写计算体积的方法
    public double volume(){
        return super.area()*super.getWidth();
    }
	public static void main(String[] args){
	//创建两个正方体实例对象,并按相应格式输出正方体的底面周长,底面面积和体积。
    //创建一个 无参 正方体对象
	Cube c=new Cube();
	System.out.println("c底面周长:"+c.perimeter());
	System.out.println("c底面面积:"+c.area());
	System.out.println("c体积:"+c.volume());

                       
    //创建一个 有参 正方体对象 参数值为: 5
    Cube c1=new Cube(5);                  
    System.out.println("c1底面周长:"+c1.perimeter());
	System.out.println("c1底面面积:"+c1.area());
	System.out.println("c1体积:"+c1.volume());                   

	/*********end*********/	

	}
}

第2关:圆

200

  • 任务要求
  • 参考答案
  • 评论28

任务描述

本关任务:在Circle类中,构造两个不同的圆,输出圆的信息。

相关知识

为了完成本关任务,你需要掌握:1.私有变量的继承,2.toString方法 #####私有变量的继承 无论父类中的成员变量是privatepublic还是其它类型的,子类都会继承父类中的这些成员变量。但是父类中的私有(private)成员变量,无法在子类中直接访问,可以通过从父类中继承得到的protectedpublic方法(如gettersetter方法)来访问。

举例说明:

 
  1. public class Person{
  2. private String name;
  3. public Person(String name){
  4. this.name = name;
  5. }
  6. public void setName(String name){
  7. this.name = name;
  8. }
  9. public String getName(){
  10. return name;
  11. }
  12. }
  13. public class Student extends Person{
  14. public Student(String name){
  15. super(name);
  16. }
  17. public static void main(String[] args){
  18. Student mStudent = new Student("abc");
  19. String mName = mStudent.getName();
  20. System.out.println("Name is : " + mName);
  21. mStudent.setName("efg");
  22. mName = mStudent.getName();
  23. System.out.println("Name is : " + mName);
  24. }
  25. }

预期输出: Name is : abc Name is : efg

toString方法

System.out.println()输出一个对象的时候,java默认调用对象的toString()方法。一般需要覆盖这个方法,这样根据覆盖逻辑你就可以输出自己的对象。

举例说明: 定义一个类User,有id,name属性,你直接输出一个user对象的话System.out.println(user),得到的只是“全限定名@地址首地址”,如果你在User类里面覆盖这个toString方法的话就能输出你想要的语句。 举例说明:

 
  1. public class User{
  2. public int id;
  3. public String name;
  4. public User(int id,String name){
  5. this.id=id;
  6. this.name=name;
  7. }
  8. public String toString(){
  9. return "user name is:"+ name +";"+"user id is:"+ id;
  10. }
  11. public static void main(String[] args){
  12. User user = new User(3,"dsda");
  13. System.out.println(user);
  14. }
  15. }

预期输出:user name is :zhangshan;user id is: 1;

编程要求
  • Point类描述“点”类,拥有两个成员变量xy(分别代表点的横坐标和纵坐标),给Point类两个自定义的构造方法。

  • Circle类描述“圆”类,是Point类的一个子类,这里点(x,y)为圆的圆心,并拥有一个成员变量radius(代表圆的半径),给Circle两个自定义的构造方法。分别覆盖每个类中的toString()方法,并在构造方法中借助toString()方法显示PointCircle各自的基本描述信息。

  • Circle中,构造两个不同的圆,调用构造方法,输出圆的信息。

:在实训里切换文件方法如下:

测试说明

无测试输入 预期输出: 第一个圆的信息: Point constructor:Center=[0.0,0.0]radius=0.0 Circle constructor:Center=[0.0,0.0]radius=10.0

第二个圆的信息: Point constructor:Center=[10.0,10.0]radius=0.0 Circle constructor:Center=[10.0,10.0]radius=5.0


开始你的任务吧,祝你成功!

package step2;

public class Circle extends Point {
	private double radius;

	/*********begin*********/
	//编写两个构造方法,无参函数中的半径默认为10,x和y均为0;
    //在构造方法中输出Circle constructor:  加上 toString方法输出的结果
	public Circle(){
        super(0.0,0.0);
        this.radius=10.0;
        System.out.println("Circle constructor:"+this.toString());
    }
    public Circle(double radius,double x,double y){
        super(x,y);
        this.radius=radius;
        System.out.println("Circle constructor:"+this.toString());
    } 
	
	//编写toString方法
	public String toString(){
        return "Center="+super.toString()+"radius="+this.radius;
    }
	/*********end*********/

	public static void main(String[] args) {
		Circle cir1, cir2;

		System.out.println("第一个圆的信息:");
		/*********begin*********/
		//构造第一个圆cir1
        cir1=new Circle();
		
		System.out.println("第二个圆的信息:");
		//构造第二个圆cir2,x为10,y为10,半径为5
        cir2=new Circle(5.0,10.0,10.0);
		/*********end*********/
	}
}

父类中”this" 指向问题

“this.方法”不管出现在父类还是子类代码中,指的都是子类方法。

这道题中父类无法修改,而且在父类的toString方法中没有“Center”语句,所以直接在子类的“toString”方法中添加Center即可

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值