Java 在Android Studio应用程序中创建对象的全局实例

Java 在Android Studio应用程序中创建对象的全局实例,java,android-studio,Java,Android Studio,我正在安卓工作室设计一款游戏。我有一个活动,上面有多个片段。我还有一个玩家对象,我想创建一个实例 Player player1 = new Player(); “我的活动”中的所有这些Fragmenet都将对player1进行更改。 而不是通过以下方式将此对象传递给每个片段和后续活动: intent.putExtra("Player",player1); 有没有一种方法可以从其他片段和活动中访问player1,而不用使用putExtra()方法传递它 我尝试使player1成为静态: sta

我正在安卓工作室设计一款游戏。我有一个活动,上面有多个片段。我还有一个玩家对象,我想创建一个实例

Player player1 = new Player();
“我的活动”中的所有这些Fragmenet都将对
player1进行更改。
而不是通过以下方式将此对象传递给每个片段和后续活动:

intent.putExtra("Player",player1);
有没有一种方法可以从其他片段和活动中访问player1,而不用使用
putExtra()
方法传递它

我尝试使player1成为静态:

static Player player1 = new Player();
但是,我无法从其他
.java
活动文件访问
player1

所以,基本上,我想要一个策略,使
player1
成为一个全局对象,我可以随时随地引用它。我不想让Player类中的所有方法都是静态的,因为我想在我的游戏中有
player1
player2
player3
文件,所以我需要能够创建一个
Player
的实例,如果每个方法都是静态的,我认为这是不可能的(对吧?)

我刚刚开始OOP,所以我确信有一些简单的东西我忽略了,或者,也许有一种更好的方法来实现我想要的东西,而不是与修饰符混为一谈。也许通过使用接口?接口将如何工作


如何通过创建扩展应用程序的类将信息存储在应用程序对象中

如果你想在任何地方访问它,并且不关心隐私,你需要将它公开

public static Player player1 = new Player();
默认值为仅包级访问

您可以在其他类中使用此语法来访问它:

Activity1.player1; // do something...
注意:可能有更好的设计方案,只需将字段
公开
,就可以在任何地方访问它,但这是所需的最低限度。不建议以这种方式进行,因为您正在学习,您可能希望阅读其中一些设计概念

例如,使用公共getter/setter通常是访问类/实例字段的更常见的方法之一

private static Player player1 = new Player();

public static Player getPlayer1() { return player1; }
public static void setPlayer1(Player p) { player1 = p; }

// ...
所以,基本上,我想要一个策略,使player1成为一个全局对象,我可以随时随地引用它。我不想让Player类中的所有方法都是静态的,因为我想在我的游戏中有player1、player2和player3文件,所以我需要能够创建一个Player实例,如果每个方法都是静态的,我认为这是不可能的(对吗?

不,那不是真的。只要有一个公共构造函数和/或它不是抽象的,就可以实例化带有
静态
方法的类
static
只是意味着它是在类级别访问的,不需要实例,尽管您仍然可以从对象引用访问
static
方法<但是,代码>静态也意味着所有实例共享相同的字段,因此在类的所有实例中只有一个字段、方法等

一个你可以考虑使用的设计模式是模式,它允许你在需要时获得一个类的单个实例,这样就不需要干扰静态属性和方法(如果你不需要使用它,它可能会有缺陷)。 如何通过创建扩展应用程序的类将信息存储在应用程序对象中

根据,这是一种可以接受的方法,尽管您可能仍然希望考虑一些总体设计选择,并确定这是否真的是您想要走的路线

用于需要维护全局应用程序状态的基类。您可以通过在AndroidManifest.xml的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的流程时为您实例化该类


如果其他人想知道,另一个解决方案是让你的类(
MyClass.java
)添加
扩展应用程序
,然后转到你的android清单并添加
android:name
参考:

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name="companyname.projectname.MyClass">
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

这将在应用程序的整个生命周期中保持对象实例。它可以工作,但我喜欢上面解释的静态方法。另外,我不确定这是否是一种理想的方法…

出于测试目的:在Activity1中,我有一行:
publicstaticplayer1=newplayer()。我还有一个指向Activity2的按钮。按下按钮时,Activity2出现,在
onCreate
覆盖方法中,我有一行
player1。setName(“mike”)
其中
setName(String name)
Player
类中的
public
方法。然而,我在这一行得到一个“无法解决”错误,这意味着声明
player1
public static
不起作用-或者我遗漏了一些东西@瑞安_J@MikeJamesJohnson您不能简单地在任何类中使用
player1
,并对其进行解析,因为该语法默认为方法/类范围(仅在该类中声明的字段)。您需要通过定义它的类来访问它<代码>活动1.player1.setName(“mike”)相当于…@Ryan_J ahhh!!是的,我完全忘记了。谢谢。可能不是最好的方法,因为
播放器
不是一个应用程序,但是在上下文中看到它的使用是很好的。
Player player = (Player)getApplication();