第1关:正方体底面周长、底面面积和体积计算
- 任务要求
- 参考答案
- 评论28
任务描述
本关任务:编程正方体类,计算正方体的底面周长、底面面积和体积。
相关知识
为了完成本关任务,你需要掌握:1.类的继承,2.super
与this
关键字。
类的继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法。
格式说明:
class 父类 {
}
class 子类 extends 父类 {
}
举例说明:
- 小孩:属性(姓名,年龄,性别),方法(吃饭,睡觉,上学);
- 老人:属性(姓名,年龄,性别),方法(吃饭,睡觉);
从上可以看出,小孩和老人有相同的属性和一些相同的方法,我们可以将其相同的属性和方法提取出来写在父类(Person
)中,将不同部分写在子类中。 代码为:
class Person{
string name;
int age;
string sex;
void eat(){
System.out.println(name+"需要吃饭");
}
void sleep(){
System.out.println(name+"需要睡觉");
}
}
class Student extends Person{
void goschool(){
System.out.println(name+"需要上学");
}
}
class Elder entends Person{
}
super和this关键字
super
关键字:我们可以通过super
关键字实现对父类成员的访问,用来引用当前对象的父类。 this
关键字:指向自己的引用。
举例说明:
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的eat方法
super.eat(); // super 调用父类的eat方法
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}
输出为:
animal : eat
dog : eat
animal : eat
编程要求
上一次实验中定义了矩形类Rectangle
- 成员变量有:
width
和length
- 成员方法有:
area()
和perimeter()
派生一个子类:正方体类Cube
。若正方体类的操作是求
- 底面周长
- 底面面积
- 正方体体积
思考:这个子类除了从父类那里继承来的方法之外,还需要做哪些修改?
编写一个正方体类,要求实现:
- 使用两种构造方法
- 至少各创建一个正方体对象实例(
c
和c1
),c
的边长为10
,c1
的边长为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方法
public double area(){//底面面积
return super.area();
}
public double perimeter(){ //底面周长
return super.perimeter();
}
//编写计算体积的方法
public double tj(){
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.tj() );
//创建一个 有参 正方体对象 参数值为: 5
Cube c1 = new Cube(5);
System.out.println("c1底面周长:"+ c1.perimeter() );
System.out.println("c1底面面积:"+ c1.area() );
System.out.println("c1体积:"+ c1.tj() );
/*********end*********/
}
}
第2关:圆
- 任务要求
- 参考答案
- 评论28
任务描述
本关任务:在Circle
类中,构造两个不同的圆,输出圆的信息。
相关知识
为了完成本关任务,你需要掌握:1.私有变量的继承,2.toString
方法 #####私有变量的继承 无论父类中的成员变量是private
、public
还是其它类型的,子类都会继承父类中的这些成员变量。但是父类中的私有(private
)成员变量,无法在子类中直接访问,可以通过从父类中继承得到的protected
、public
方法(如getter
、setter
方法)来访问。
举例说明:
public class Person{
private String name;
public Person(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
public class Student extends Person{
public Student(String name){
super(name);
}
public static void main(String[] args){
Student mStudent = new Student("abc");
String mName = mStudent.getName();
System.out.println("Name is : " + mName);
mStudent.setName("efg");
mName = mStudent.getName();
System.out.println("Name is : " + mName);
}
}
预期输出: Name is : abc
Name is : efg
toString方法
用System.out.println()
输出一个对象的时候,java默认调用对象的toString()
方法。一般需要覆盖这个方法,这样根据覆盖逻辑你就可以输出自己的对象。
举例说明: 定义一个类User
,有id,name
属性,你直接输出一个user
对象的话System.out.println(user)
,得到的只是“全限定名@地址首地址”,如果你在User
类里面覆盖这个toString
方法的话就能输出你想要的语句。 举例说明:
public class User{
public int id;
public String name;
public User(int id,String name){
this.id=id;
this.name=name;
}
public String toString(){
return "user name is:"+ name +";"+"user id is:"+ id;
}
public static void main(String[] args){
User user = new User(3,"dsda");
System.out.println(user);
}
}
预期输出:user name is :zhangshan;user id is: 1;
编程要求
-
Point
类描述“点”类,拥有两个成员变量x
和y
(分别代表点的横坐标和纵坐标),给Point
类两个自定义的构造方法。 -
Circle
类描述“圆”类,是Point
类的一个子类,这里点(x,y)为圆的圆心,并拥有一个成员变量radius
(代表圆的半径),给Circle
两个自定义的构造方法。分别覆盖每个类中的toString()
方法,并在构造方法中借助toString()
方法显示Point
或Circle
各自的基本描述信息。 -
在
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();
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*********/
}
}