Java-如何使用字符串调用类?

时间:2012-05-19 18:15:29

标签: java string class bluej

我是初学者程序员,这是我在这个论坛上的第一个问题。

我正在编写一个简单的文本冒险游戏,使用BlueJ作为编译器,我在Mac上。我遇到的问题是我想让我的代码更加自动化,但我不能用字符串调用类。我想要调用类的原因并没有在if函数中使用它是因为我可以包含更多的方法。

以下是目前的运行方式:

public class textadventure {
public method(String room){
if(room==street){street.enterRoom();}
}
}
public class street{
public enterRoom(){
//do stuff and call other methods
}
}

if语句测试我创建的每个类/房间。我希望代码能够自动将字符串空间变成可以调用的类名。所以它可能会这样:

Public method(string room){
Class Room = room;
Room.enterRoom();
}

我已经研究过使用Class.forName,但是所有的例子对我来说都太过笼统,无法理解如何使用该函数。任何帮助将不胜感激,如果有任何其他必要的信息(如更多示例代码),我很乐意提供它。

-Sebastien

以下是完整代码:

import java.awt.*;
import javax.swing.*;

public class Player extends JApplet{
public String textOnScreen;

public void start(){
room("street1");
}

public void room(String room){
    if(room=="street1"){
    textOnScreen=street1.enterRoom();
    repaint();
    }
    if(room=="street2"){
    textOnScreen=street2.enterRoom();
    repaint();
    }
}
public void paint(Graphics g){
    g.drawString(textOnScreen,5,15);
}
}

public abstract class street1
{
private static String textToScreen;
public static String enterRoom(){
    textToScreen = "You are on a street running from North to South.";
    return textToScreen;
}
}

public abstract class street2
{
private static String textToScreen;
public static String enterRoom(){
    textToScreen = "You are on another street.";
    return textToScreen;
}
}

4 个答案:

答案 0 :(得分:3)

看到你对编程很新,我建议从一些比完整的冒险游戏更简单的程序开始。您还没有完全掌握Java语法的一些基础知识。以HelloWorld计划为例:

public class HelloWorld {
  public static void main(String[] args) {
    String output = "Hello World!"
    System.out.println(output);
  }   
}

请注意public是小写的。资本Public的{​​{1}}与P不同。

另请注意,public类的资本为String。*同样,大写也很重要,因此Sstring不同。

此外,请注意我不必使用String。您可以使用String string = new String("string")。此语法运行速度更快,更易于阅读。

在测试字符串相等性时,您需要使用String string = "string"而不是String.equals。这是因为==检查对象相等性(即a == ba占用内存中的相同位置)并b检查stringOne.equals(stringTwo)是否具有相同的位置字符与stringOne的顺序相同,无论它们在内存中的位置如何。

现在,关于您的问题,我建议您使用stringTwoEnum来跟踪要使用的对象。

例如:

Map

*这是格式化Java代码的标准方法。类名称为public class Tester { public enum Location { ROOM_A("Room A", "You are going into Room A"), ROOM_B("Room B", "You are going into Room B"), OUTSIDE("Outside", "You are going outside"); private final String name; private final String actionText; private Location(String name, String actionText) { this.name = name; this.actionText = actionText; } public String getActionText() { return this.actionText; } public String getName() { return this.name; } public static Location findByName(String name) { name = name.toUpperCase().replaceAll("\\s+", "_"); try { return Enum.valueOf(Location.class, name); } catch (IllegalArgumentException e) { return null; } } } private Location currentLocation; public void changeLocation(String locationName) { Location location = Location.findByName(locationName); if (location == null) { System.out.println("Unknown room: " + locationName); } else if (currentLocation != null && currentLocation.equals(location)) { System.out.println("Already in room " + location.getName()); } else { System.out.println(location.getActionText()); currentLocation = location; } } public static void main(String[] args) { Tester tester = new Tester(); tester.changeLocation("room a"); tester.changeLocation("room b"); tester.changeLocation("room c"); tester.changeLocation("room b"); tester.changeLocation("outside"); } } ,而变量名称为PascalCased

答案 1 :(得分:0)

String className=getClassName();//Get class name from user here
String fnName=getMethodName();//Get function name from user here

Class params[] = {};
Object paramsObj[] = {};

Class thisClass = Class.forName(className);// get the Class

Object inst = thisClass.newInstance();// get an instance
// get the method
Method fn = thisClass.getDeclaredMethod(fnName, params);
// call the method
fn.invoke(inst, paramsObj);

答案 2 :(得分:0)

您的问题下面的评论是真实的 - 您的代码非常粗糙。

无论如何,如果你有像

这样的方法
public void doSomething(String str) {
  if (str.equals("whatever")) {
    // do something
  }
}

然后将其称为

doSomething("whatever");

答案 3 :(得分:0)

在Java中,许多类都有属性,您可以并且经常会有来自同一个类的多个实例。

你如何确定哪个是名字?

例如

class Room {
    List<Monster> monsters = new ArrayList <Monster> ();
    public Room (int monstercount) {
         for (int i = 0; i < monstercount; ++i)
            monsters.add (new Monster ());
    }
    // ...
}

怪物可以拥有属性,如果其中一个已经死亡,如果你不处理Strings中的所有内容,你可以更容易识别它。