在Java类中重新分配`this`的含义是什么?

4

我现在只是在Java中瞎搞,试图使用链表实现类似于堆栈的东西。

class ListStack {

    int value;
    int size;
    ListStack next;

    public ListStack (int add) {
        this.size = 1;
        this.value = add;
        this.next = null;
    }

    public void push (int add) {
        this.next = this;
        this.value = add;
        this.size++;
    }

    public int pop() {
        if (this.size == 0) { throw new EmptyListStackException(); }
        int i = this.value;
        this = this.next;
        this.size--;
        return i;
    }

    public int size() {
        return this.size;
    }

    public int peek() {
        return this.value;
    }
}

基本上它是一个在前面插入的链表,同时也可以从前面删除。当我尝试运行this = this.next;时,NetBeans弹出一个错误,它说我不能重新分配最终值this

我希望我的最终实现能够像下面这样做:

ListStack var = new ListStack(5); //var is now 5 -> null
var.push(3); //var is now 3 -> 5 -> null
int val = varr.pop(); //var is now 5 -> null, val == 3

对于这段代码,只需注释掉this = this.next部分即可,其他部分似乎都可以工作。

ListStack a = new ListStack(5);
System.out.println(a.size()); //prints 1
System.out.println(a.peek()); //prints 5
a.push(4);
System.out.println(a.size()); //prints 2
System.out.println(a.peek()); //prints 4
a.push(6);
System.out.println(a.size()); //prints 3
System.out.println(a.peek()); //prints 6
a.push(1);
System.out.println(a.size()); //prints 4
System.out.println(a.peek()); //prints 1
//a is 1 -> 6 -> 4 -> 5 -> null

9
"this" 指的是当前对象。这就像说:“我是”或“我的名字是”。你无法改变自己是谁。 - Sotirios Delimanolis
8
@SotiriosDelimanolis 的人生经验和 Java 课程 - Joseph Helfert
3
这是因为你不能重新分配this。你需要做的是为列表设置一个锚定对象,否则你就无法添加/删除列表的头部。 - Hot Licks
1
基本上,你写了一个类,它说它应该是一个“堆栈”,也就是一组元素,但你的实现看起来像是一个堆栈的一个元素的实现。(单个元素将有一个“下一个”,但整个堆栈不会。)考虑将其拆分为两个类。 - ajb
1
如果所有的push都应该存储一个数字并增加另一个数字,那么是的,它按照预期工作。按照这个标准,当pop甚至无法编译时,它也是按照预期工作的。 - Hot Licks
显示剩余6条评论
2个回答

5
您的代码存在一个概念性错误:基本上,您没有使用push方法创建任何新的堆栈元素。
但问题在于,调用类listStack会产生误导,因为实际上您要创建的是堆栈的新元素,所以您可能需要创建一个类node。 此外,您无法覆盖"this",因为它是Java关键字,并且它始终引用当前对象。
为了给您一些提示,以便将堆栈实现为链表,您应该创建一个具有值字段value和对先前Node的引用的class Node(第一个节点只需具有空指针)。
在类中,您应该有对最后一个节点的引用,其push()方法应创建一个新的Node并将其设置为新的last node。

谢谢,虽然我能够在没有单独的节点类的情况下实现它。http://pastebin.com/ySRp0nZA - gator
@riista - 我曾经看到过使用“入口”作为“头部”的堆栈方案,而不是为“头部”单独创建一个类,但这要求特殊的“入口”不能用于包含堆栈数据。 - Hot Licks

2

让我指你朝正确的方向。正如其他人所评论的那样,这个堆栈并不能正常工作。考虑做类似于这样的事情:

public class ListStack {

private class Node {
    private int value;
    private Node next;

            //inner class which holds your each element and reference to next
            //fill all details required     
}

private Node head;
private int size;

public ListStack() {
    head = null;
    size = 0;
}

public void push(int value) {
    Node temp = new Node(value);
    if(head == null)
        head = temp;
    else {
        temp.setNext(head); // provide link to already existing stack
        head = temp;       // bring new element on top
    }
}

public int pop() {
    if(head==null);
        //throw exception
    int temp = head.getValue();
    head = head.getNext(); //remove element and bring down the stack
    return temp;
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接