多级包 - Java
Multilevel package - Java
我只是 java 的新手,而且我是第一次使用包。
我正在尝试在此层次结构中制作包:
/chess/game/Pieces.class
/chess/Board.class imports Pieces
/Game.java imports Board
我只使用 javac filename.java
编译得到 class 个文件。
Game.java 没有使用 Pieces.class 的任何方法和变量只是为了确定。
所有 类、函数和变量都是 public。
我用 main 测试了 board.java 并且它完美地工作 fine.But 当我将它用作一个包时它不起作用并且我找不到 class 。
Exception in thread "main" java.lang.NoClassDefFoundError: game/Pieces
at chess.Board.initializeboard(Board.java:31)
at Game.main(Game.java:14)
Caused by: java.lang.ClassNotFoundException: game.Pieces
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at chess.Board.initializeboard(Board.java:31)
at Game.main(Game.java:14)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:415)
at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
我无法在 Game.java 中导入两个 classes,因为我制作了一个 // 打包游戏;在 Pieces.class
所以我不能将其导入为 // import chess.game.Pieces;在 Game.java 中。
如果这是 illegal.Is 还有其他 OOP 方法吗?
编辑-
我使用的代码-
Pieces.java -(将其编译为 .class 文件)
package game;
import javax.swing.JButton;
public class Pieces{
public enum Type {ROOKE,KNIGHT,BISHOP,KING,QUEEN,PAWN};
public boolean alive = true;
public boolean white = false;
public boolean firstmove = false;
public int mx;
public int my;
public Type types;
public JButton button=new JButton();
public void setButton(JButton b){
this.button=b;}
}
Board.java -(将其编译为 .class 文件)
package chess;
import game.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
public class Board{
public void initializeboard(JButton [][] spots){
JFrame f = new JFrame("CHESS");
f.setVisible(true);
f.setSize(800,800);
GridLayout layout =new GridLayout(8,8,1,1);
f.setLayout(layout);
for(int ver=0;ver<8;ver++){
for(int hor=0;hor<8;hor++){
JButton button = new JButton();
if((ver+hor)%2==0){
button.setBackground(Color.WHITE); }
else{
button.setBackground(new Color(255,205,51)); }
Pieces p =new Pieces();
spots[ver][hor] = button;
p.setButton(button);
f.add(button);
} //close for loop
} // close for loop
f.revalidate();
} // close initializeboard
}// close board
Game.java -
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import chess.Board;
public class Game{
public static void main(String [] args){
JButton [][] spots =new JButton [8][8];
Board b =new Board();
b.initializeboard(spots);
}
}
- 转到包含文件的目录
Game.java
- 输入此命令
javac chess/game/Pieces.java
- 之后,输入此命令
javac -cp . game/Board.java
- 之后,输入此命令
javac -cp . Game.java
我只是 java 的新手,而且我是第一次使用包。 我正在尝试在此层次结构中制作包:
/chess/game/Pieces.class
/chess/Board.class imports Pieces
/Game.java imports Board
我只使用 javac filename.java
编译得到 class 个文件。
Game.java 没有使用 Pieces.class 的任何方法和变量只是为了确定。 所有 类、函数和变量都是 public。 我用 main 测试了 board.java 并且它完美地工作 fine.But 当我将它用作一个包时它不起作用并且我找不到 class 。
Exception in thread "main" java.lang.NoClassDefFoundError: game/Pieces
at chess.Board.initializeboard(Board.java:31)
at Game.main(Game.java:14)
Caused by: java.lang.ClassNotFoundException: game.Pieces
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at chess.Board.initializeboard(Board.java:31)
at Game.main(Game.java:14)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:415)
at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
我无法在 Game.java 中导入两个 classes,因为我制作了一个 // 打包游戏;在 Pieces.class 所以我不能将其导入为 // import chess.game.Pieces;在 Game.java 中。
如果这是 illegal.Is 还有其他 OOP 方法吗?
编辑- 我使用的代码- Pieces.java -(将其编译为 .class 文件)
package game;
import javax.swing.JButton;
public class Pieces{
public enum Type {ROOKE,KNIGHT,BISHOP,KING,QUEEN,PAWN};
public boolean alive = true;
public boolean white = false;
public boolean firstmove = false;
public int mx;
public int my;
public Type types;
public JButton button=new JButton();
public void setButton(JButton b){
this.button=b;}
}
Board.java -(将其编译为 .class 文件)
package chess;
import game.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
public class Board{
public void initializeboard(JButton [][] spots){
JFrame f = new JFrame("CHESS");
f.setVisible(true);
f.setSize(800,800);
GridLayout layout =new GridLayout(8,8,1,1);
f.setLayout(layout);
for(int ver=0;ver<8;ver++){
for(int hor=0;hor<8;hor++){
JButton button = new JButton();
if((ver+hor)%2==0){
button.setBackground(Color.WHITE); }
else{
button.setBackground(new Color(255,205,51)); }
Pieces p =new Pieces();
spots[ver][hor] = button;
p.setButton(button);
f.add(button);
} //close for loop
} // close for loop
f.revalidate();
} // close initializeboard
}// close board
Game.java -
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import chess.Board;
public class Game{
public static void main(String [] args){
JButton [][] spots =new JButton [8][8];
Board b =new Board();
b.initializeboard(spots);
}
}
- 转到包含文件的目录
Game.java
- 输入此命令
javac chess/game/Pieces.java
- 之后,输入此命令
javac -cp . game/Board.java
- 之后,输入此命令
javac -cp . Game.java