编程新手,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;
}
(请耐心等待,我的格式不完全正确,我会继续处理)
答案 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的基础,被称为封装