android 访问扩展内的对象 class

android accessing object inside extended class

我在使用 this 关键字时遇到一些问题。如果我有几个 classes 实现另一个 class,我如何在不调用 class 本身的情况下使用它们的值?我解释一下。

//this is my first class
public class Foo extends FooHelper{
    public int fooInt;
    public String fooString;
    //getter/setter below
}

//this is my second class
public class Foo2 extends FooHelper{
    public double fooDouble;
    public float fooFloat;
}

//this is my main method, i'm using it for calling the value.
//I omit all the thrash code before. 
//This is how i want to call the method:
//imagine before there are onCreate, activity,...
Foo foo = new Foo().GetFooInt();

//this is the class extended from the firsts
public class FooHelper{
    public void GetFooInt(){
        //here is my problem, i need to call the Foo class and the fooInt value.
        //I want also to be able to edit the Foo object, for example:
        if(((Foo)this).getFooInt() == 0){
            (Foo) this.setFooInt(5);
        }
    }
}

这是我想要实现的,访问一个 class,它使用扩展 class 中唯一的 this 关键字扩展另一个 class。我该怎么做?

编辑:

我认为我解释得不好。 我的问题是我想访问 FooHelper 中的 Foo 对象,而不是 Foo 对象中的 FooHelper 方法。

示例:

使用此代码后:

Foo foo = new Foo();
foo.HelperClassMethod();

我需要(在 HelperClass 中)访问调用它的 Foo 对象。

public HelperClass<Foo> {
    public void HelperClassMethod(){
        //HERE i need to use the "foo" object which invoked this method
    }
}

我添加了 <Foo>,可能是我遗漏了它,这是正确的吗?我如何在助手 class 的方法中使用这个 foo 对象?谢谢大家

EDIT2:我的问题完全失败了我认为让我们忽略上面的代码并检查下面的内容:

我必须访问扩展 class 方法中的一个对象。

我有这个 class:

public class Foo extends FooToExtend{
    public int fooInt;
}

扩展的class是这样的:

public class FooToExtend{
    public void MethodOne(){
        //HERE i need to access the calling object
    }
}

现在,在我的主要 activity 中,我想这样做:

Foo foo = new Foo();
foo.MethodOne();

我的疑问是如何访问我在 MethodOne.

中的 main 中创建的 foo 对象

我必须在

中更改我的 FooToExtend
public class<Foo> FooToExtend{
    ...
}

但我仍然不知道如何访问其中的 foo 对象。

我不确定我是否完全理解。但看起来您希望 GetFooInt 根据扩展它的 class 执行不同的操作。所以我觉得这里最好查一下instanceof.

public class FooHelper{
    public void GetFooInt(){
        if(this instanceof Foo)
        {
            ((Foo) this).fooInt = 5;
        }
    }
}

根据你想命名的情况 class “Helper” 我假设你会把它用作 helper-class

public class Helper {
  public static int screenHeight = 500;
}

public class AnyOtherClass {
  testSomething() {
  System.out.println(Helper.screenHeight);
  Helper.screenHeight = 510;
  System.out.println(Helper.screenHeight);
 }
}

我在这里看到 2 个问题,理解 this 关键字和 extending

this 关键字有问题

假设您有一个 class 并且正在执行一些代码:关键字 this 指的是 class 本身,如果您将对象 this 设为相当于me。检查 here and here 更长的解释、示例和教程。

问题 extend

您还必须从顶部(接口或抽象 classes)扩展到底部(扩展)classes 并在底部实现:

//this is the PARENT (FIRST) class extended from the CHILDREN (SECOND)
public abstract class FooHelper{
    public abstract void GetFooInt();
}

//this is the CHILD (SECOND!!!) class
public class Foo extends FooHelper{
    public int fooInt;
    public String fooString;

    @Override
    public void GetFooInt() {
       // are you sure you getFooInt method can return a null???
       if(this.getFooInt() == null){  
           this.setFooInt(5);
    }

    //getter/setter below
}

编辑 1

Oh ok, this was useful. one more question, a way is to use abstract, as you said, but is there a way to do the same without implementing it all times? just for info, my objective is to use Foo.FooHelperMethod() and be able in "FooHelperMethod()" to access Foo class. I hope i explained it, i don't know how to do it.. if it's impossible i will use abstract as you suggested :)

当然,这就是继承,只要不声明抽象父类,并在那里实现方法和属性,所有子类都将通过扩展父类来拥有这些方法和属性class。

让我们看这个例子:

//this is the PARENT (FIRST) class extended from the CHILDREN (SECOND)
class FooHelper {
    int theIntCommonValue;

    public int getTheIntCommonValue() {
        return theIntCommonValue;
    }

    public void setTheIntCommonValue(int theIntCommonValue) {
        this.theIntCommonValue = theIntCommonValue;
    }
}

// CHILDREN CLASS, look how calling this.getTheIntCommonValue() (the parent method)
// doesn't throw any error because is taking parent method implementation
class Foo extends FooHelper {
    public void getFooInt() {
        if (this.getTheIntCommonValue() == 0)
            this.setTheIntCommonValue(5);
    }
}
class Foo2 extends FooHelper {
    public void getFooInt() {
        if (this.getTheIntCommonValue() == 3)
            this.setTheIntCommonValue(8);
    }
}

编辑2:

My doubt is how i can access foo object i created in main inside my MethodOne.

答案:

正在将对象作为参数传递。但是,你需要静态 class,而不是扩展的,让我们看看

示例:

Foo.java

public class Foo {
    public int fooInt;
}

FooHelper.java

public static class FooHelper {
    public static void methodOne(Foo foo){
        //HERE i need to access the calling object

        // for example, this?
        if (foo.fooInt == 2)
    }
}

现在,你如何执行它?

Main.java

public static void main(String[] args) throws Exception {
    Foo foo = new Foo();
    FooHelper.methodOne(foo);
}

注释

  • 惯例说,java 中的方法从 LOWECASE 开始,class 名称从 [=23= 开始].
  • 您必须将两个 class 都放在单独的文件中,以便 static public class

对于一些基本的理解:this 是您在非静态上下文中使用的关键字,用于访问您当前所在对象的变量和方法。正确使用 this 示例:

public class SomeClass {
    private int someInt;

    public void setSomeInt(int someInt) {
        this.someInt = someInt;
    }
}

在此示例中,this 是必需的,因为局部变量(/参数)someInt 与全局 class 变量 someInt 同名。使用 this 您可以访问对象的 class 变量 "in"。


不必要使用的示例:

public class SomeClass {
    private int someInt;

    public int squareSomeInt() {
        return this.someInt * this.someInt;
    }
}

这里不需要关键字 this 因为没有局部变量 someInt.


另一方面,super 是一个关键字,它访问父 class 的变量和方法(class,您的 class 派生自)。示例:

public class SomeClass {
    private int someInt;
    public int squareSomeInt() {
        return someInt * someInt;
    }
}

推导class:

public class Other extends SomeClass {
    public int squarePlusSquare() {
        return super.squareSomeInt() + super.squareSomeInt();
    }
}