为什么仍然可以访问实例级方法?

时间:2015-11-13 09:42:30

标签: java oop object

困惑而好奇

我对它是如何发生有点好奇吗? getter和setter是实例级方法,除非对象创建完成,否则它们不在内存中。

这里在代码片段中我使用setter来初始化对象状态, 构造函数如何获取对应用setter的对象的引用? 主要的困惑是对象创建完成的确切点是什么?

public class Solution {

    private String name;
    private int age;
    private float weight;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public float getWeight() {
        return weight;
    }

    public void setWeight(float weight) {
        this.weight = weight;
    }

    Solution() {
        setName("Sachin");
        setAge(21);
        setWeight(76);
    }

    public static void main(String[] args) {
        Solution objectReference = new Solution();
        System.out.println(objectReference);
    }

    @Override
    public String toString() {
        return "name= " + name + "\n age= " + age + "\n weight= " + weight;
    }
}

2 个答案:

答案 0 :(得分:10)

getter和setter是实例级方法,除非对象创建完成,否则不在内存中。 - 谁告诉你这个?在加载类时加载方法。因此,当您(构造实例)的构造发生时,setXgetX方法已经可用于JVM的方法区域。

您可以在创建任何实例之前获取class Solution,然后通过 reflection 获取所有方法并调用它们(您可能会遇到异常)来测试,但你可以调用它们:P)

答案 1 :(得分:0)

方法由Java字节代码组成。对于每个类的实例,它都是相同的。无需为每个对象创建单独的字节代码副本。创建新对象时,不需要为方法代码分配内存。堆上的对象由一块内存组成,该内存块足够大以包含对象的非静态成员变量(以及JVM需要跟踪对象的一些内容)。

对于方法中使用的局部变量,在调用方法时使用堆栈。