在java中,嵌套的class对象可以使用封闭的class方法吗?
In java, can nested class object use the enclosing class method?
我创建了一个简单的列表 class。我想做的是在 SLList 中创建一个方法来给大小一个 SLList 对象。我想递归地执行它,但是,我创建的以下 size() 方法不起作用。我知道其他实现它的方法,例如创建辅助方法。但我很好奇的是,为什么我的 size() 不起作用?错误信息是"size() is undefined for SLList.IntNode"。为什么?由于我将嵌套的 IntMode class 设为 public 并且是非静态的,为什么它不能使用 SLList class?
中定义的方法
public class SLList {
public class IntNode {
public int item;
public IntNode next;
public IntNode(int i, IntNode n) {
item = i;
next = n;
}
}
private IntNode first;
public SLList(int x) {
first = new IntNode(x, null);
}
public int size() {
if (first.next == null) {
return 1;
}
return 1 + first.next.size();
}
}
我是 Java 的新手,对私有和静态的东西很困惑,尤其是涉及到 Class 时。谢谢大家回答我。
原因是:您的方法 size()
在 class SLList.
因此nested inner class
IntNode
无法访问它。
您可以 fiddle 通过添加一个额外的私有方法来实现它,但这并不是特别容易推理。除非绝对必要,否则我会避免这样做。
class SLList {
public class IntNode {
public int item;
public IntNode next;
public IntNode(int i, IntNode n) {
item = i;
next = n;
}
private int theSize()
{
return size();
}
}
private IntNode first;
public SLList(int x) {
first = new IntNode(x, null);
}
public int size() {
if (first.next == null) {
return 1;
}
return 1 + first.next.theSize();
}
}
size()
是SLList
的方法,不是IntNode
的方法。可以参考IntNode
里面的外class方法,如下:
public class SLList {
public class IntNode {
...
public int size() {
return SLList.this.size();
}
}
...
public static int size() {
...
}
}
为IntNode 添加一个size 方法class 并从SLList size 方法访问它来计算整个列表的大小。以下代码片段是不言自明的。有关嵌套 classes 的更多信息,请参阅 https://www.programiz.com/java-programming/nested-inner-class
public class SLList {
public class IntNode {
public int item;
public IntNode next;
public IntNode(int i, IntNode n) {
item = i;
next = n;
}
public int size() {
IntNode tmp = next;
if (tmp == null) {
return 1;
}
return 1 + tmp.size();
}
}
private IntNode first;
public SLList(int x) {
first = new IntNode(x, null);
}
public int size() {
if (first == null)
return 0;
return first.size();
}
public static void main(String[] args) {
SLList list = new SLList(10);
list.first.next = list.new IntNode(20, null);
list.first.next.next = list.new IntNode(30, null);
list.first.next.next.next = list.new IntNode(40, null);
System.out.println(list.size());
}
}
我创建了一个简单的列表 class。我想做的是在 SLList 中创建一个方法来给大小一个 SLList 对象。我想递归地执行它,但是,我创建的以下 size() 方法不起作用。我知道其他实现它的方法,例如创建辅助方法。但我很好奇的是,为什么我的 size() 不起作用?错误信息是"size() is undefined for SLList.IntNode"。为什么?由于我将嵌套的 IntMode class 设为 public 并且是非静态的,为什么它不能使用 SLList class?
中定义的方法public class SLList {
public class IntNode {
public int item;
public IntNode next;
public IntNode(int i, IntNode n) {
item = i;
next = n;
}
}
private IntNode first;
public SLList(int x) {
first = new IntNode(x, null);
}
public int size() {
if (first.next == null) {
return 1;
}
return 1 + first.next.size();
}
}
我是 Java 的新手,对私有和静态的东西很困惑,尤其是涉及到 Class 时。谢谢大家回答我。
原因是:您的方法 size()
在 class SLList.
因此nested inner class
IntNode
无法访问它。
您可以 fiddle 通过添加一个额外的私有方法来实现它,但这并不是特别容易推理。除非绝对必要,否则我会避免这样做。
class SLList {
public class IntNode {
public int item;
public IntNode next;
public IntNode(int i, IntNode n) {
item = i;
next = n;
}
private int theSize()
{
return size();
}
}
private IntNode first;
public SLList(int x) {
first = new IntNode(x, null);
}
public int size() {
if (first.next == null) {
return 1;
}
return 1 + first.next.theSize();
}
}
size()
是SLList
的方法,不是IntNode
的方法。可以参考IntNode
里面的外class方法,如下:
public class SLList {
public class IntNode {
...
public int size() {
return SLList.this.size();
}
}
...
public static int size() {
...
}
}
为IntNode 添加一个size 方法class 并从SLList size 方法访问它来计算整个列表的大小。以下代码片段是不言自明的。有关嵌套 classes 的更多信息,请参阅 https://www.programiz.com/java-programming/nested-inner-class
public class SLList {
public class IntNode {
public int item;
public IntNode next;
public IntNode(int i, IntNode n) {
item = i;
next = n;
}
public int size() {
IntNode tmp = next;
if (tmp == null) {
return 1;
}
return 1 + tmp.size();
}
}
private IntNode first;
public SLList(int x) {
first = new IntNode(x, null);
}
public int size() {
if (first == null)
return 0;
return first.size();
}
public static void main(String[] args) {
SLList list = new SLList(10);
list.first.next = list.new IntNode(20, null);
list.first.next.next = list.new IntNode(30, null);
list.first.next.next.next = list.new IntNode(40, null);
System.out.println(list.size());
}
}