MemoriseOff 發表於 2012-4-8 10:19:06

請問一下如何寫這道題目@@

class Ccircle
{
private static double pi=3.14;
private double radius;
public Ccircle(double r)
{
    radius=r;
}
public Ccircle Compare(Ccircle c3)
    {
      if(this.radius>c3.radius)
      return this;
      else
      return c3;
    }
}
public class test01
{

public static void main(String args[])
{
    Ccircle c1=new Ccircle(1.0);
    Ccircle c2=new Ccircle(2.0);
    Ccircle c3=c1.Compare(c2);
    if(c3==c1)
      System.out.println("r1 more biger");
    else
      System.out.println("t2 more biger");
      
}
}

在Java2教學手冊中遇到一個難題 請教一下各位大大
如何把在Ccircle類別內的compare()移動到test01類別內@@?

586020520 發表於 2012-4-20 00:19:09

本帖最後由 586020520 於 2020-6-8 23:29 編輯

這樣package javaapplication1;

class Ccircle {

    private static double pi = 3.14;
    private double radius;

    public Ccircle(double r) {
      radius = r;
    }

    public double getRadius() {
      return radius;
    }
}

public class test01 extends Ccircle {

    public test01(double r) {
      super(r);
    }

    public Ccircle Compare(Ccircle c3) {
      if (this.getRadius() > c3.getRadius()) {
            return this;
      } else {
            return c3;
      }
    }

    public static void main(String args[]) {
      test01 c1 = new test01(1.0);
      test01 c2 = new test01(2.0);
      test01 c3 = (test01) c1.Compare(c2);
      if (c3 == c1) {
            System.out.println("r1 more biger");
      } else {
            System.out.println("t2 more biger");
      }

    }
}
或是這樣package javaapplication1;

class Ccircle {

    private static double pi = 3.14;
    private double radius;

    public Ccircle(double r) {
      radius = r;
    }

    public double getRadius() {
      return radius;
    }
}

public class test01 extends Ccircle {

    public test01(double r) {
      super(r);
    }




    public Ccircle Compare(Ccircle c3) {
      if (this.getRadius() > c3.getRadius()) {
            return this;
      } else {
            return c3;
      }
    }

    public static void main(String args[]) {
      test01 c1 = new test01(1.0);
      test01 c2 = new test01(2.0);
      Ccircle c3 = c1.Compare(c2);
      if (c3 == c1) {
            System.out.println("r1 more biger");
      } else {
            System.out.println("t2 more biger");
      }

    }
}
跟你解釋一下流程好了

首先把public Ccircle Compare這個方法搬進test01裡面時

第一個遇到的的問題應該是radius這個變數抓不到,因為設成private

所以需要在Ccircle裡面建立一個方法getRadius來專門取radius,這也就是封裝

之後把public Ccircle Compare方法裡的this.radius和c3.radius改成this.getRadius()和c3.getRadius()

這樣還是會有錯誤,因為getRadius是屬於Cclicle的,所以要繼承Cclrcle

繼承之後還是有錯

因為Ccircle沒有預設建構子,所以在test01裡面必須要有一個建構子呼叫父類別的帶參數建構子

public test01(double r) {
      super(r);
    }

再來是把 Ccircle c1 = new Ccircle(1.0); 改成 test01 c1 = new test01(1.0);

因為已經把Compare這個方法搬移到test01裡

所以把c1宣告成Ccircle會抓不到Compare方法

接下來c2要宣告成哪一種都可以,因為test01和Ccircle是繼承關係

最後c3的宣告也是都可以,宣告成test01就用多型 test01 c3 = (test01) c1.Compare(c2);

因為Compare方法的回傳值是Ccircle,所以要轉

宣告成Ccircle就用Ccircle c3 = c1.Compare(c2);

話說這題目還蠻不錯的,OOP的三大特性都有了
頁: [1]
查看完整版本: 請問一下如何寫這道題目@@