2016-09-16 100 views
0

我最近才开始学习java,遇到了一个问题。我通过类构造函数创建了一些对象,并且我想在不同的类中使用这些声明的对象。对象的内容通过变量设置。我可以在不声明对象的情况下使用不同类中的声明对象吗?

因此,一个简单的解决办法是通过做(就像一个例子)来设置变量为静态,然后调用他们在其他类

Originalclass.staticVariable 

,并以此作为我的参数。

因此可以说我的原始类是Firstclass,我想要创建的对象叫做superObject,而我想要应用在我的对象中的变量叫做variableIneed。如果我要创造我在其他类对象,我会键入

Firstclass superObject = new Firstclass(Firstclass.variableIneed); 

这个工作,但我想知道,这将有可能在原来的类来创建对象,然后在不同的使用类?这样做有什么好处吗?

对不起,如果这是一个重复的问题或它不够具体,这是我的第一篇文章。 :)

如果我的代码可以帮助回答我的问题,我会很乐意将其解决,但是由于我的代码很好,我觉得它与提问无关。

+0

看到代码不会有什么伤害。 –

+1

曾听说过吸气剂? – Stultuske

回答

0

如果你在一个类中创建一个对象,你通常不希望“共享创建的对象”,只需将其设为static(特别是当你不确定静态方式时)​​。

不要滥用staticstatic成员实际上属于这个类本身,而不是一个特定的对象。所以在你开始声明变量为static之前,你想考虑它是属于这个类的属性吗?或者它属于个人客体?

更多更多static变量在所有对象之间共享。 (你只有它的一个副本)。因此,如果您将它与其他许多类分享,那么它的价值可能会从您“共享”它的类中的任何一个变为可能,从而使您的类紧密耦合(并且您希望防止这种类)。

除非对象属于该类,可能它是一个常量(声明为final),否则您可能不想通过将其声明为static来共享该对象。

这有效,但我想知道,是否有可能在原始类中创建对象,然后在不同的类中使用它?这样做有什么好处吗?

如果我是你,如果我需要与其他类“共享”我的对象,我会通过一个方法(一个getter方法)传递它。

〔实施例:

class Car{ 
    private Engine engine; 

    //Constructor not shown 

    //a getter method 
    public getEngine(){ 
     return engine; 
    } 
} 

class Runner{ 
    public static void main(String[] args){ 
     Car c = new Car(); 
     Engine engine = car.getEngine(); //retrieve engine from car (for whatever use) 
    } 
} 
0

您正在使用与构造函数参数相同的类的静态变量创建Firstclass,这对我没有任何意义。您可以在Firstclass类中使用该变量而不将其作为参数,它已经可以访问它。对于你的主要问题,我认为你想要的是这样的:

class Firstclass{ 
    private String someString = ""; 

    public void createString(String myString){ 
    someString = myString; 
    } 

    public String getSomeString(){ 
    return someString; 
    } 
} 

class Original{ 
    public void sometMethod(Firstclass first){ 
    //using someString from 'first' 
    System.out.println(first.getSomeString()); 
    } 
} 
0

我喜欢这个问题,因为它问“有没有更好的方法来做到这一点?

这听起来像你有一种情况,你有一些价值,让我们假设一个整数,将用于几个对象。 “我应该复制这个值,还是应该使用相同的值?”是一个重要的问题。

让我们假设字符串是多个地方使用的东西,并且不会在应用程序的生命周期中发生变化,但您希望灵活地在一个地方更改字符串的内容。例如,如果您正在构建游戏,则允许用户使用的人数可能是整个应用程序中使用的整数。一个好的模式是constant。例如:

public interface ApplicationConstants { 
    public static Integer PLAYER_LIVES_COUNT = 3; 
} 

然后需要的常量可以简单地实现常量接口的任何类:

public class Application implements ApplicationConstants { 

    public static void main(String[] args) { 
     FirstClass firstClass = new FirstClass(PLAYER_LIVES_COUNT); 
     FirstClass superObject = new FirstClass(PLAYER_LIVES_COUNT); 
    } 
} 

这比硬编码数字3在你的应用程序,因为你有一个地方,一个更好的模式控制这个数字。没有“查找和替换”。

如果FirstClass对象本身是一个将在应用程序中使用的对象,该怎么办?它有多个属性,其他类需要在应用程序中访问。在这种情况下,一个好的模式是singleton pattern

公共final类FirstClassFactory {

private static FirstClass instance = null; 
private FirstClassFactroy() { 
} 

public static synchronized Singleton getInstance() { 
    if (instance == null) { 
     instance = new FirstClass(); 
    } 
    return instance; 
} 

}

然后在你的应用程序,你可以在运行时更改您的Firstclass实例的值,和值将用于正在使用的任何对象更改的Firstclass:

public class Application { 
    public static void main(String[] args) { 
     FirstClass firstClass = FirstClassFactory.getInstance(); 

     firstClass.setPlayerLives(3); 
    } 
} 

如果您的应用程序的另一个类调用FirstClassFactory.getInstance(),就会收到alread实例y将playerLives设置为3.

最后,假设您有一个用例,需要向FirstClass对象添加更多数据和功能。一个好的模式可能是扩展或wrapper or decorator pattern。例如:

public class LivesManager { 

    private FirstClass firstClass; 
    private String statusMessage = "Number of lives remaining: "; 

    public LivesManager(FirstClass firstClass) { 
     this.firstClass = firstClass; 
    } 

    public void decrementRemainingLives() { 
     --firstClass.getLives(); 
    } 

    public String getLivesMessage() { 
     return statusMessage + firstClass.getLives(); 
    } 
} 

最后要注意的:如在评论中提到的,这是很好的做法,使类变量私有和使用getter和setter方法来访问的变量。例如:

public class FirstClass { 

    private Integer lives; 

    public FirstClass(Integer lives) { 
     this.lives = lives; 
    } 

    public Integer getLives() { 
     return lives; 
    } 

    public void setLives(Integer lives) { 
     this.lives = lives; 
    } 
} 

希望这会有所帮助,祝你好运!

0

“这个工作,但我想知道,这将有可能在原来的类来创建对象,然后在不同的类中使用它是否有一个有利于做到这一点?“

是的,这是可能的。我将说明它的一个简单的例子:

A类:

具有在其内定义一个随机对象(随机兰特=新的随机())。 而且通常getter方法称为getRandomizer();

public Random getRandomizer(){ 
    return rand; 
} 

B类:

B类可以实例化类A.

A _object = new A(); 

随机对象是在类A创建的,但是之后在B类,我们有 实例化类甲现在可以访问一般的公共方法。

现在,我们可以简单地通过访问随机对象:

_object.getRandomizer(); 

(_object就是我定义一个变量名)。