如何在另一个对象中引用变量

时间:2015-03-14 17:42:58

标签: java arraylist field

我是一个绝对的编程初学者,我正在尝试从一本书中学习Java。我很困惑。

这本书有一个练习(这就像章节的中间部分,所以有很多建立起来,但我会试着说清楚)要求我们在课堂上添加一个方法。基本上,我们获得了一组预先构建的类,它们应该像一个简单的拍卖程序。因此,有一个数组列表,其中包含一个投标人列表,他们出价多少以及批号。本练习要求我们添加一种方法,打印出中标人名单及其出价值。

好的,这是有道理的。我可以围绕它应该如何工作。我甚至写了下面的代码:`

    /**
 * Exercise 4.48
 * for each item in the list of lots, get the highest bid.
 * if highest bid is not null, print the bidder and value
 * otherwise, print "lot not sold"
 */
 public void close()
{
    for(Lot lot : lots) {
        Bid highestBid = lot.getHighestBid();
        if(highestBid != null) {
            System.out.println(bidder, value);
        }
        else{
            System.out.println("Lot not sold.");
        }
    }
}

当尝试编译它时,它会在bidder上停止,因为我没有定义变量。显然我应该告诉它“投标人”应该是什么意思。 Bidder是同一程序中“Person”对象中变量的名称,在整个项目中使用,但我仍然不清楚如何理解我的“出价人”是同一个“出价者”。我认为我会遇到与“价值”相同的问题。

我错过了什么?

编辑使代码看起来像代码。

根据要求,这是Person ...类? (我对术语不太满意。我会到达那里。抱歉。)

        /**
     * Maintain details of someone who participates in an auction.
     * @author David J. Barnes and Michael Kölling.
     * @version 2011.07.31
     */
    public class Person
    {
        // The name of this person.
        private final String name;

        /**
         * Create a new person with the given name.
         * @param name The person's name.
         */
        public Person(String name)
        {
            this.name = name;
        }

        /**
         * @return The person's name.
         */
        public String getName()
        {
            return name;
        }
    }

        **/**
     * A class to model an item (or set of items) in an
     * auction: a lot.
     * 
     * @author David J. Barnes and Michael Kölling.
     * @version 2011.07.31
     */
    public class Lot
    {
        // A unique identifying number.
        private final int number;
        // A description of the lot.
        private String description;
        // The current highest bid for this lot.
        private Bid highestBid;

        /**
         * Construct a Lot, setting its number and description.
         * @param number The lot number.
         * @param description A description of this lot.
         */
        public Lot(int number, String description)
        {
            this.number = number;
            this.description = description;
            this.highestBid = null;
        }

        /**
         * Attempt to bid for this lot. A successful bid
         * must have a value higher than any existing bid.
         * @param bid A new bid.
         * @return true if successful, false otherwise
         */
        public boolean bidFor(Bid bid)
        {
            if(highestBid == null) {
                // There is no previous bid.
                highestBid = bid;
                return true;
            }
            else if(bid.getValue() > highestBid.getValue()) {
                // The bid is better than the previous one.
                highestBid = bid;
                return true;
            }
            else {
                // The bid is not better.
                return false;
            }
        }

        /**
         * @return A string representation of this lot's details.
         */
        public String toString()
        {
            String details = number + ": " + description;
            if(highestBid != null) {
                details += "    Bid: " + 
                           highestBid.getValue();
            }
            else {
                details += "    (No bid)";
            }
            return details;
        }

        /**
         * @return The lot's number.
         */
        public int getNumber()
        {
            return number;
        }

        /**
         * @return The lot's description.
         */
        public String getDescription()
        {
            return description;
        }

        /**
         * @return The highest bid for this lot.
         *         This could be null if there is
         *         no current bid.
         */
        public Bid getHighestBid()
        {
            return highestBid;
        }
    }
    **

    /**
 * A class that models an auction bid.
 * It contains a reference to the Person bidding and the amount bid.
 * 
 * @author David J. Barnes and Michael Kölling.
 * @version 2011.07.31
 */
public class Bid
{
    // The person making the bid.
    private final Person bidder;
    // The value of the bid. This could be a large number so
    // the long type has been used.
    private final long value;

        /**
         * Create a bid.
         * @param bidder Who is bidding for the lot.
         * @param value The value of the bid.
         */
        public Bid(Person bidder, long value)
        {
            this.bidder = bidder;
            this.value = value;
        }

        /**
         * @return The bidder.
         */
        public Person getBidder()
        {
            return bidder;
        }

        /**
         * @return The value of the bid.
         */
        public long getValue()
        {
            return value;
        }
    }


    import java.util.ArrayList;

    /**
     * A simple model of an auction.
     * The auction maintains a list of lots of arbitrary length.
     *
     * @author David J. Barnes and Michael Kölling.
     * @version 2011.07.31
     * 
     * 3/12/15 added close method exercise 4.48
     * 
     */

        public class Auction
        {
            // The list of Lots in this auction.
            private ArrayList<Lot> lots;
            // The number that will be given to the next lot entered
            // into this auction.
            private int nextLotNumber;

            /**
             * Create a new auction.
             */
            public Auction()
            {
                lots = new ArrayList<Lot>();
                nextLotNumber = 1;
            }

            /**
             * Enter a new lot into the auction.
             * @param description A description of the lot.
             */
            public void enterLot(String description)
            {
                lots.add(new Lot(nextLotNumber, description));
                nextLotNumber++;
            }

            /**
             * Show the full list of lots in this auction.
             */
            public void showLots()
            {
                for(Lot lot : lots) {
                    System.out.println(lot.toString());
                }
            }

            /**
             * Make a bid for a lot.
             * A message is printed indicating whether the bid is
             * successful or not.
             * 
             * @param lotNumber The lot being bid for.
             * @param bidder The person bidding for the lot.
             * @param value  The value of the bid.
             */
            public void makeABid(int lotNumber, Person bidder, long value)
            {
                Lot selectedLot = getLot(lotNumber);
                if(selectedLot != null) {
                    Bid bid = new Bid(bidder, value);
                    boolean successful = selectedLot.bidFor(bid);
                    if(successful) {
                        System.out.println("The bid for lot number " +
                                           lotNumber + " was successful.");
                    }
                    else {
                        // Report which bid is higher.
                        Bid highestBid = selectedLot.getHighestBid();
                        System.out.println("Lot number: " + lotNumber +
                                           " already has a bid of: " +
                                           highestBid.getValue());
                    }
                }
            }

            /**
             * Return the lot with the given number. Return null
             * if a lot with this number does not exist.
             * @param lotNumber The number of the lot to return.
             */
            public Lot getLot(int lotNumber)
            {
                if((lotNumber >= 1) && (lotNumber < nextLotNumber)) {
                    // The number seems to be reasonable.
                    Lot selectedLot = lots.get(lotNumber - 1);
                    // Include a confidence check to be sure we have the
                    // right lot.
                    if(selectedLot.getNumber() != lotNumber) {
                        System.out.println("Internal error: Lot number " +
                                           selectedLot.getNumber() +
                                           " was returned instead of " +
                                           lotNumber);
                        // Don't return an invalid lot.
                        selectedLot = null;
                    }
                    return selectedLot;
                }
                else {
                    System.out.println("Lot number: " + lotNumber +
                                       " does not exist.");
                    return null;
                }
            }
            /**
             * Exercise 4.48
             * for each item in the list of lots, get the highest bid.
             * if highest bid is not null, print the bidder and value
             * otherwise, print "lot not sold"
             */
             public void close()
            {
                for(Lot lot : lots) {
                    Bid highestBid = lot.getHighestBid();
                    if(highestBid != null) {
                        System.out.println(bidder, value);
                    }
                    else{
                        System.out.println("Lot not sold.");
                    }
                }
            }

2 个答案:

答案 0 :(得分:0)

感谢您通过提供支持代码澄清您的问题!

这应该可以解决您的问题。改变这一行:

System.out.println(bidder, value);

到此:

System.out.println(highestBid.getBidder().getName() + " bids " + highestBid.getValue())

highestBid变量存储Bid类型的对象。您可以查看Bid类定义,以查看对象具有Bid类型的含义。基本上,Bid对象有一个名为getValue()的方法,它返回bid的值,以及一个方法getBidder(),它返回一个Person对象(一个遵守Person类定义的对象)。因此,查看Person类,看看Person对象如何有一个名为getName()的方法,该方法将该名称返回为String。

最后,我们可以使用我们方便的内置System.out.println()函数打印名称和值。

答案 1 :(得分:0)

教你最基本的,

将一个类视为现实生活中的对象, 它有自己的特征,您定义为class variables

这些应该(通常)定义为私有,因此对它们的调用必须从类函数(getter和setter)发生。我们这样做的原因是你可以设置一些限制。 (例如:&#34;不高于3&#34;或者&#34;必须是最小值4 char.long&#34; ...)

类函数就像:类中的小隐藏类,它们执行一些代码。注意&#34; In&#34;,函数IN类。而不是相反。因此,您在函数内部创建的变量不为类所知,但函数知道类变量。

我怀疑你打电话给biddervalue

  • 如果在定义close()函数的同一个类之外将其定义为私有,则不使用getter。

但实际上我们很难知道出了什么问题。请向我们提供close()功能

的类别

编辑:

close()的代码应该是......

public void close()
        {
            for(Lot lot : lots) {
                Bid highestBid = lot.getHighestBid();
                if(highestBid != null) {
                    System.out.println(highestBid.getBidder(), highestBid.getValue());
                }
                else{
                    System.out.println("Lot not sold.");
                }
            }