初学java,做一个扑克牌的作业。创建了三个类:Bridge/Cardmain/Piece。代码分别如下:
public class Bridge {
private Piece[] pieces;
private String[] numbers;
private String[] images;public Bridge(){ Piece[] pieces = new Piece[52];
String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
String[] images={"Diamonds","Clubs","Hearts","Spades"};
}
public void setorder(){
for(int j=0;j<images.length;j++){
for(int i=0;i<numbers.length;i++){
pieces[12*j+i].setimage(images[j]);
pieces[12*j+i].setnumber(numbers[i]);
}
}
}
public void getpieces(int j,int k){
System.out.println(pieces[12*j+k].getnumber()+" Of "+pieces[12*j+k].getimage());
}}
public class Piece{
private String number;
private String image;
private boolean t;public Piece(){
number="Ace";
image="Diamonds";
t=false;
}public String getnumber(){
return number;
}
public String getimage(){
return image;
}
public void setnumber(String x){
number=x;
}
public void setimage(String y){
image=y;
}
}
public class Cardmain {
public static void main(String args[]){
Scanner s = new Scanner(System.in);
Bridge nbridge =new Bridge();
nbridge.setorder(); System.out.println("Please input your to-distribute cardnumber: ");
int num = s.nextInt();
System.out.println("Please input your to-distribute cardimage: ");
System.out.println("***************Option******************");
System.out.println("0:Diamond 1:Clubs 2:Hearts 3:Spades ");
System.out.println("***************************************");
int im = s.nextInt();
nbridge.getpieces(im, num);
}
}但在执行到这一步时有问题: Bridge nbridge =new Bridge();
nbridge.setorder();
新建的nbridge对象在构造时numbers数组和images数据都有赋值,调用setorder方法时调试是就发现nbridge中数组的引用都为空了,这究竟是怎么回事呢?
public class Bridge {
private Piece[] pieces;
private String[] numbers;
private String[] images;public Bridge(){ Piece[] pieces = new Piece[52];
String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
String[] images={"Diamonds","Clubs","Hearts","Spades"};
}
public void setorder(){
for(int j=0;j<images.length;j++){
for(int i=0;i<numbers.length;i++){
pieces[12*j+i].setimage(images[j]);
pieces[12*j+i].setnumber(numbers[i]);
}
}
}
public void getpieces(int j,int k){
System.out.println(pieces[12*j+k].getnumber()+" Of "+pieces[12*j+k].getimage());
}}
public class Piece{
private String number;
private String image;
private boolean t;public Piece(){
number="Ace";
image="Diamonds";
t=false;
}public String getnumber(){
return number;
}
public String getimage(){
return image;
}
public void setnumber(String x){
number=x;
}
public void setimage(String y){
image=y;
}
}
public class Cardmain {
public static void main(String args[]){
Scanner s = new Scanner(System.in);
Bridge nbridge =new Bridge();
nbridge.setorder(); System.out.println("Please input your to-distribute cardnumber: ");
int num = s.nextInt();
System.out.println("Please input your to-distribute cardimage: ");
System.out.println("***************Option******************");
System.out.println("0:Diamond 1:Clubs 2:Hearts 3:Spades ");
System.out.println("***************************************");
int im = s.nextInt();
nbridge.getpieces(im, num);
}
}但在执行到这一步时有问题: Bridge nbridge =new Bridge();
nbridge.setorder();
新建的nbridge对象在构造时numbers数组和images数据都有赋值,调用setorder方法时调试是就发现nbridge中数组的引用都为空了,这究竟是怎么回事呢?
private String[] numbers;
private String[] images;public Bridge(){ Piece[] pieces = new Piece[52];
String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
String[] images={"Diamonds","Clubs","Hearts","Spades"};
}这个是2个对象 所以等于没有初始化
String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
String[] images={"Diamonds","Clubs","Hearts","Spades"};
}==〉
public Bridge(){ pieces = new Piece[52];
numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
images={"Diamonds","Clubs","Hearts","Spades"};
}
// 你原来的写法,是局部变量
pieces = new Piece[52];
for (int i = 0; i < pieces.length; i++) {
// 初始化了数组,还要初始化每个元素
pieces[i] = new Piece();
}
numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
images={"Diamonds","Clubs","Hearts","Spades"};
}
只是声明了一个对象数组,但并未初始化
如果在构造方法里初始化,用new String[] {"Diamonds","Clubs","Hearts","Spades"}
private String[] images = {"Diamonds","Clubs","Hearts","Spades"};直接初始化
或者在构造方法里
images = new String[] {"Diamonds","Clubs","Hearts","Spades"};
private Piece[] pieces;
private String[] numbers;
private String[] images;public Bridge(){ Piece[] pieces = new Piece[52];
String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
String[] images={"Diamonds","Clubs","Hearts","Spades"};
}之前有朋友提出了这个错误,你在constructor中使用的String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
String[] images={"Diamonds","Clubs","Hearts","Spades"};
和你在class里的private String [] number;
private String[] images;并不是相同的对象。等于是你在constructor中申明了两个同你的private members无关的对象,所以你的constructor并没有初始化其中两个private members。正确的应该是
private Piece[] pieces;
private String[] numbers;
private String[] images;public Bridge(){ Piece[] pieces = new Piece[52];//array可以在用的时候再初始化,不过用时小心NullPointerException
this.numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
this.images={"Diamonds","Clubs","Hearts","Spades"};
}
没有new对象
下边也是一个扑克牌的例子,你参考一下。
-----------------PuKe.java-------------------
import java.util.*;/**
* 扑克
* http://www.juheit.com
*/
public class PuKe{
/**
* 花色
*/
private int pukeColor;
/**
* 大小
*/
private int pukeNum;
/**
* 构造器
*/
public PuKe(int pukeColor, int pukeNum){
this.pukeColor = pukeColor;
this.pukeNum = pukeNum;
}
/**
* Setter Getter
*/
public int getPukeColorInt(){
return this.pukeColor;
}
/**
* 构建一幅扑克牌
*/
public List createPukeList(){
List<PuKe> pukeList = new ArrayList<PuKe>();
//四种花色,每种花色13张牌
for(int i = IPuKeConstant.PUKE_COLOR_B; i <= IPuKeConstant.PUKE_COLOR_P; i ++){
for(int j = IPuKeConstant.PUKE_NUM_A; j <= IPuKeConstant.PUKE_NUM_K; j ++){
pukeList.add(new PuKe(i, j));
}
}
//添加大小王
pukeList.add(new PuKe(IPuKeConstant.PUKE_COLOR_K, IPuKeConstant.PUKE_NUM_L));
pukeList.add(new PuKe(IPuKeConstant.PUKE_COLOR_K, IPuKeConstant.PUKE_NUM_G));
return pukeList;
}
/**
* 分堆
*/
public List createPukeGroupList(List pukeList){
//扑克堆集合
List<PuKeGroup> pukeGroupList = new Vector<PuKeGroup>();//同时取放,防止并发异常
////////进行分组
//迭代每张扑克牌
Iterator pukeIterator = pukeList.iterator();
while(pukeIterator.hasNext()){
PuKe currentPuke = (PuKe)pukeIterator.next();
//取得扑克花色
int pukeColor = currentPuke.getPukeColorInt();
//定义查找标识
boolean findFlag = false;
//对堆进行迭代
Iterator pukeGroupIterator = pukeGroupList.iterator();
while(pukeGroupIterator.hasNext()){
//取得当前的堆
PuKeGroup currentPkeGroup = (PuKeGroup)pukeGroupIterator.next();
//取得堆的扑克花色
int pukeGroupColor = currentPkeGroup.getPukeColor();
if(pukeColor == pukeGroupColor){
currentPkeGroup.getPukeSubList().add(currentPuke);
findFlag = true;//找到,反转标识
break;
}
}
//如果没有找到
if(!findFlag){
List<PuKe> pukeSubList = new ArrayList<PuKe>();//床架扑克子集合
pukeSubList.add(currentPuke);//将扑克放到子集合中
pukeGroupList.add(new PuKeGroup(pukeColor, pukeSubList));
}
}
return pukeGroupList;
}
}/**
* 扑克堆
* http://www.juheit.com
*/
class PuKeGroup{ /**
* 花色
*/
private int pukeColor;
/**
* 扑克集合
*/
private List<PuKe> pukeSubList;
/**
* 构造器
*/
public PuKeGroup(int pukeColor, List pukeSubList){
this.pukeColor = pukeColor;
this.pukeSubList = pukeSubList;
}
/**
* 取得扑克花色
*/
public int getPukeColor(){
return this.pukeColor;
}
/**
* 取得扑克分组的扑克集合
*/
public List getPukeSubList(){
return this.pukeSubList;
}
} /**
* 扑克常量接口
* http://www.juheit.com
*/
interface IPuKeConstant{
/**
* 扑克A
*/
public static final int PUKE_NUM_A = 1; /**
* 扑克K
*/
public static final int PUKE_NUM_K = 13; /**
* 扑克小王
*/
public static final int PUKE_NUM_L = 14;
/**
* 扑克大王
*/
public static final int PUKE_NUM_G = 15;
/**
* 扑克花色黑桃
*/
public static final int PUKE_COLOR_B = 1;
/**
* 扑克花色红桃
*/
public static final int PUKE_COLOR_R = 2;
/**
* 扑克花色草花
*/
public static final int PUKE_COLOR_F = 3;
/**
* 扑克花色方片
*/
public static final int PUKE_COLOR_P = 4; /**
* 扑克花色王
*/
public static final int PUKE_COLOR_K = 5;
}