【问题标题】:Main method and classes, where do declare? [closed]主要方法和类,在哪里声明? [关闭]
【发布时间】:2013-04-13 22:56:39
【问题描述】:

编程新手,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;

}

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

【问题讨论】:

  • 创建一个名为 Card.java 的新文件并将您的 Card 类放入其中。
  • 或者直接在Deck类中创建(不是在方法中!!)。
  • 好的,我想通了。我正在制作卡片,但没有使用它。我应该引用 aceOfSpades.rank,而不是 Card.rank。对于面向对象的编程,它有助于实际制作/使用对象。未来的谷歌人——我最终将 getSuit() 和 getRank() 方法放在卡片中,就在 main 方法的上方。
  • 同样的东西错误非静态访问。

标签: java class methods static


【解决方案1】:

您的第二个代码几乎是正确的。您只需像这样修改 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 对象,它将无法直接读取内容。

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

【讨论】:

  • 谢谢,这真的很有帮助,现在我知道了 2 种方法而不是零。
【解决方案2】:

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

【讨论】:

  • 文件名是Deck.java,但现在我删除了Deck类,称为整个Card.java,只有一个Card类。谢谢
【解决方案3】:

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

但是,根据 Bill K 对can I compile a java file with a different name than the class 的回答:

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

大部分情况下不应该这样做。 Java的命名模式 关于类和包是它的更大优势之一 has--免费让程序员的生活更轻松。

【讨论】:

  • 简单地说,是的,但由于各种原因最终是不真实的。在 this 的情况下,这是我推荐的,但不是因为它是声明类的唯一方法。
  • 所以无效表达式是公开的,如果我将内部类 Card 称为私有,它会起作用吗?
  • @nexus_2006 不,它不能有访问修饰符。以及为什么它不能让生活更轻松。
  • 哦,好的。知道了。我重新阅读了关于内部类的部分,现在更有意义了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2018-10-11
  • 2023-04-09
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多