Java中的类引用

时间:2011-05-30 13:42:36

标签: java

Hello Guys:D 为什么我不能在没有运行时异常的情况下执行以下代码?怎么改写?我正在从C ++迁移,我可以很容易地做到这一点:D。

class MyJavaClass {
    public static void main(String args[]) {
        Dog bushui_RIP = new Dog();
        Dog fellow = null;
        bushui_RIP.bark(fellow);
        fellow.bark();
    }
}
class Dog {
    public void bark(Dog buddy) {
        buddy = this;
    }
    public void bark() {
        System.out.println("I am barking!!!");
    }
}

7 个答案:

答案 0 :(得分:5)

fellownull,因此没有可以bark的对象。

答案 1 :(得分:5)

Dog fellow是一个引用变量,但是它通过值传递给方法。

答案 2 :(得分:2)

  

Dog fellow = null;

你必须先将它初始化,然后才能使你的狗吠。

答案 3 :(得分:2)

Dog fellow = null;更改为Dog fellow = new Dog();

答案 4 :(得分:2)

问题是你的本地变量伙伴。当你试图调用它的bark()时,它为null。

当你调用bushui_RIP.bark(伙伴)时,它确实是一个引用传递,但引用本身作为值传递(如何)。所以你在你的树皮(狗)函数中分配一个局部变量伙伴而不接触原始的参考伙伴。

什么是树皮(狗)应该做什么?克隆这个并返回一个新的Dog实例,或者将它分配给引用?

答案 5 :(得分:2)

在Java中,您无法通过引用传递对象引用,就像在C ++中编写Dog **ppDog一样。您可以将值(this)作为返回值或字段传递给调用者。

或者,您可以使用“单元格模式”。首先,定义您的Cell<T>类,该类包含对类型为T的对象的引用:

class Cell<T> {
    public T item;

    Cell(T item) {
        this.item = item;
    }
}

然后,你可以写:

private void bark(Cell<Dog> buddy) {
    buddy.item = this;
}

...

Dog bushui_RIP = new Dog();
Cell<Dog> fellow = Cell(null);
bushui_RIP.bark(fellow);
fellow.item.bark();

答案 6 :(得分:1)

另一个解决方法是将bark()更改为静态。

public static void bark() {
    System.out.println("I am barking!!!");
}

((Dog) null).bark();
// is the same as
Dog.bark();
  

我正在从C ++迁移,我可以轻松地从那里进行迁移

我认为你不会轻易地取消引用NULL指针而不会导致杀死你的应用程序的分段错误。