主要方法和类,在哪里声明?

时间:2013-04-20 17:51:38

标签: java class methods static

编程新手,java新手。我似乎理解类和它们的组件,方法等基本部分,但我无法弄清楚如何将它们组合在一起。例如,我正在按照教程并尝试编写一个类卡,可以根据构造期间传递的args成为任何卡。

我的第一个问题是,如果我声明类卡公开(第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);
        }
}

//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;

}

(请耐心等待,我的格式不完全正确,我会继续处理)

3 个答案:

答案 0 :(得分:0)

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

然而,从Bill K对can I compile a java file with a different name than the class的回答:

  

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

     

大部分内容都不应该这样做。 Java的命名模式   关于课程和套餐是其中一个更大的优势   拥有 - 让程序员的生活更轻松,免费。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你的第二个代码几乎是正确的。您只需修改main中的代码,如下所示:

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

你是对的静态,main是静态的,他只能访问静态的变量。 通过添加aceOfSpades,您可以指定已创建的对象。你有一个参考,你可以阅读内部价值等级和适合。

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

public int rank;
by 
private int rank; 

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

隐藏对象内部值的想法是OO的基础,被称为封装