当前位置: 首页 > 知识库问答 >
问题:

在Kotlin中访问伴侣对象中的父类变量

东方化
2023-03-14

我试图在其他类中调用一个类的静态函数,但在kotlin中我不能创建一个静态函数,我必须创建一个伴生对象,在其中我必须定义我的函数,但在这样做的时候我不能访问父类变量,有什么方法可以在kotlin中实现这一点。

class One {

    val abcList = ArrayList<String>()

    companion object {

        fun returnString() {
            println(abcList[0]) // not able to access abcList here
        }
    }
}

class Two {

    fun tryPrint() {
        One.returnString()
    }
}
// In Java we can do it like this

class One {

    private static ArrayList<String> abcList = new ArrayList<>();

    public void tryPrint() {
        // assume list is not empty 
        for(String ab : abcList) {
            System.out.println(ab);
        }
    }

    public static void printOnDemand() {
        System.out.println(abcList.get(0));
    }
}

class Two {

    public void tryPrint(){
        One.printOnDemand();
    }
}

我想访问有趣的returnString()类的静态函数,就像我们在java中做的一样,如果有谁已经实现了这一点,请帮助。

共有1个答案

刘胜泫
2023-03-14

在您的例子中abc clist是类的成员变量。类的每个实例都有其成员变量的各自版本,这意味着静态方法不能访问它们。如果你想从你的同伴对象访问它,它也必须是静态的。

class One {
    companion object {
        val abcList = ArrayList<String>()

        fun returnString() {
            println(abcList[0])
        }
    }
}

class Two {
    fun tryPrint() {
        One.returnString()
    }
}

这段代码可以工作,但请记住,在本例中只有一个abclist实例。从静态函数访问成员变量是不可能的(即使在Java中也不可能)。

以下是Java示例的Kotlin版本:

class One {
    companion object {
        val abcList = ArrayList<String>()

        fun printOnDemand() {
            println(abcList[0])
        }
    }

    fun tryPrint() {
        for (ab in abcList) {
            println(ab)
        }
    }
}

class Two {
    fun tryPrint() {
        One.printOnDemand()
    }
}
 类似资料:
  • 带有同伴对象的简单示例类 值测试可以通过访问,但如何从MyClass的实例访问?如果我有,那么我如何从sample访问测试?不正确....有没有办法? Java,C++,python等都有很简单的解决方案...(我将为每个有帮助的is提供代码示例),我认为kotlin会有一个比使用Java更好的解决方案。 对于在没有对象实例(如工厂)的情况下访问类属性,kotlin companion objec

  • 在Kotlin的类中,一个对象和一个同伴对象有什么区别? 它的“静态”(我是java方面的)生命周期可能有区别吗?

  • 问题内容: 问题答案: 你不能 JavaScript中没有向上关系。 举个例子: 现在,单个数组对象具有两个“父级”。 您可以做的是:

  • 问题内容: 看一下这个例子: 如何从子对象中访问随机对象? 问题答案: 让类将自己的实例传递给该类。 经典Occam剃刀。

  • 我想知道是否可以在同伴对象中使用类的属性。例如,以贝娄为例: 我不能通过c1或C2调用changeAge()函数。我可以使用changeAge的唯一地方是通过Person1.changeAge(),当Person1还没有用适当的构造函数实例化时。我想知道这些动作是不是有其他的选择,或者是没有,有同伴对象有什么意义呢