2

编程新手,java新手。我似乎了解类及其组件、方法等基本部分,但我不知道如何将它们组合在一起。例如,我正在按照教程并尝试编写一个类 Card ,它可以成为基于构造期间传递的 args 的任何卡片。

我的第一个问题是,如果我将类 Card 声明为 public(第 5 行),编译器会说非法的表达式开始。

如果我删除 public,它会继续 println 语句,它抱怨非静态变量不能从静态环境中引用。那是因为我在 main 方法中工作,它总是静态的,对吧?所以,我需要向 Card 添加方法来读取内部状态并将其提供给 println 语句,这样行吗?

public class Deck {
    public static void main(String[] args) {

    class Card {
        public int rank;
        public int suit;

        public Card(int startSuit, int startRank) {
            rank = startRank;
            suit = startSuit;
        }
    }

        Card aceOfSpades = new Card(1, 1);
        System.out.println("Card is ..." + Card.rank + " of " + Card.suit);
    }
}

第二轮 这是新代码,文件是 Card.java:

public class Card {

        //declare states
        //rank 1-13 for ace-king
        //suit 1-4 spade,heart,club,diamond
        public int rank;
        public int suit;

        //constructor
        public Card(int startSuit, int startRank) {
            rank = startRank;
            suit = startSuit;

        }

        //methods for Card




        public static void main(String[] args) {
            //call Card constructor
            //make card ace of spades (1,1)
            Card aceOfSpades = new Card(1,1);

            //read internal state of new Card object
            //what kind of card is it?
            System.out.println("Card is ..." + rank + " of " + suit);
        }
}

我平衡​​了我的大括号,主要方法现在是 Card 类的一部分,我认为它看起来更好。oney 编译错误现在与 println 语句中的变量相关联。(不能从静态上下文中引用非静态变量套装。)我认为这意味着我必须编写 getSuit() 和 getRank() 之类的方法来读取变量状态,然后在我的 println 中使用该方法,而不是变量本身?

这种方法看起来像这样,对吧?

public int getSuit() {

    return suit;

}

(请多多包涵,我的格式不完全正确,我会努力的)

4

3 回答 3

0

您的第二个代码几乎是正确的。您只需像这样修改 main 中的代码:

 System.out.println("Card is ..." + aceOfSpades.rank + " of " + aceOfSpades.suit);

您对静态是正确的,主要是静态的,他只能访问静态变量。通过添加 aceOfSpades,您可以指定您创建的对象。你有一个参考,你可以阅读内部价值观等级和西装。

但是正如您所建议的,更好的方法是创建 setter/getter 方法:setRank(int), getRank(), .... 您可以替换

public int rank;
by 
private int rank; 

因此,您的内部值在对象之外受到保护。
请注意,即使您将排名设置为私有,main() 方法仍然可以直接读取排名的值。这是因为 private 意味着只在类中可见,而 main 是你类的一部分。
但是如果你在你的 Deck 对象中实例化一个 Card 对象,它将无法直接读取内容。

隐藏对象内部值的思想是面向对象的基本思想,称为封装

于 2013-04-20T18:48:15.010 回答
0

将类Card移出方法体 main()。所有这些代码都应该在一个与外部类同名的文件中,Deck.java.

于 2013-04-20T17:58:11.693 回答
0

您的类的名称必须与其文件的名称相匹配。

但是,从 Bill K 的回答中,我可以编译一个名称与类不同的 java 文件

只要它们不是公共的,您就可以在同一个文件中包含辅助类。但是它们仍然可以是“默认”的,因此它们仍然可以被同一个包中的其他类使用。

大多数情况下不应该这样做。Java 关于类和包的命名模式是它最大的优势之一——让程序员的生活更轻松,无需任何成本。

于 2013-04-20T17:54:33.730 回答