2015-01-17 1 views
0

링크 된 목록으로 표시된 두 개의 숫자를 합산하려고합니다. 정적 지정자 및 내부 클래스에 문제가 있습니다. 나는 캐리를 추적하기 위해 내부 클래스 SumWrapper을 정의했다. 내 합계 메서드에서이 래퍼를 사용합니다. 먼저 정적 메서드로 선언했지만 Eclipse에서 다음과 같은 오류가 발생했습니다.main에서 비 정적 메서드를 호출 할 수 있습니까?

솔루션의 둘러싼 인스턴스는 액세스 할 수 없습니다. 할당을 Solution 유형의 둘러싸는 인스턴스 (예 : x.new A() , x는 Exo25V2의 인스턴스)로 정규화해야합니다.

나는 다음 정적 지정자를 제거하지만,

는 해결 방법이 있습니까 ... 홈페이지에서 내 메소드를 호출하는 것이 불가능하게?

public class Solution { 

    public class SumWrapper{ 
    public int carry = 0; 
    public Node node; 

    public SumWrapper(int c, Node n){ 
     carry = c; 
     node = n; 
    } 
    } // close sumWrapper class 

    public SumWrapper sum(Node node1, Node node2){ 
    if (node1 == null && node2 == null){ 
     SumWrapper result = new SumWrapper(0, null); 
     return result; 
    } 

    int current = node1.data + node2.data + sum(node1.next, node2.next).carry; 
    int carry = (current >= 10) ? 1 : 0; 
    current = current % 10; 

    Node sumResult = new Node(current); 
    sumResult.next = sum(node1.next, node2.next).node; 

    SumWrapper result = new SumWrapper(carry, sumResult); 

    return result; 
    } // close sumWrapper method 

    public int listSize(Node node){ 
    int result = 0; 

    while (node != null){ 
     result++; 
     node = node.next; 
    } 
    return result; 
    } // close listSize method 

    public Node sumLists(Node node1, Node node2){ 
    int size1 = listSize(node1); 
    int size2 = listSize(node2); 
    int size = (size1 >= size2) ? (size1+1):(size2+1); 

    while (size1 < size){ 
     Node head1 = new Node(0); 
     head1.next = node1; 
     node1 = head1; 
     size1++; 
    } 

    while (size2 < size){ 
     Node head2 = new Node(0); 
     head2.next = node2; 
     node2 = head2; 
     size2++; 
    } 

    SumWrapper wrap = sum(node1, node2); 

    return wrap.node; 

    } // close sumLists method 

    public static void main(String[] args){ 
    Node head1 = new Node(6); 
    head1.appendToTail(1); 
    head1.appendToTail(1); 
    head1.appendToTail(7); 

    Node head2 = new Node(2); 
    head2.appendToTail(9); 
    head2.appendToTail(5); 

    Node result = sumLists(head1, head2); 
    Node.printLinkedList(result); 

    } // close main method 
} 
+0

이 문제가 있습니까? – Sashwat

답변

5

main 메서드에서 비 정적 메서드 (sumLists)를 호출하는 것이 문제입니다. main 메서드는 정적이므로 동일한 클래스 내의 다른 정적 메서드에만 액세스 할 수 있습니다.

제외 ... 예를 들어 Solution는 :

public static void main(String... args) { 
    Solution s = new Solution(); 
    s.sumLists(...); // now you invoke it using an instance method (i.e. a non-static method) 
} 

그래서, 당신의 옵션은 다음과 같습니다

  1. 이 방법은 정적합니다.
  2. 클래스의 인스턴스를 만들고 비 정적 메서드를 호출하십시오.

이것에 대해 좋은 독서를 들어이이 문제를 해결하기위한 나의 일반적인 시나리오입니다 Oracle tutorial

1

간단히 말해서 정적 메서드 내에서 비 ​​정적 메서드를 호출 할 수 없습니다. 정적 메소드는 비 정적 메소드가 객체에 속하는 클래스에 속합니다.

SumWrapper을 static으로 선언하고 main에서 호출하는 모든 메소드를 선언해야합니다.

0

당신이 다른 객체의 인스턴스를 만들 때 허용하고 당신은 모두 main() 메소드를 제외한 다른 클래스에 전체 코드를 이동할 수 있습니다

1

이 클래스에서 일부 메소드를 호출합니다. 그런 다음 main() 내부에서 클래스의 객체를 만들고 sumLists 메소드에 액세스합니다.

1

문제는 SumWrapper 클래스가 static이 아니라는 것입니다. 비 정적 인 내부 클래스는 외부 클래스의 인스턴스에서 초기화 되어야만 인스턴스에 액세스 할 수 있습니다. 이것은 당신이받은 오류가 말하는 것입니다.

하지만 당신의 SumWrapper 클래스는 "부모"Solution 객체를 사용하지 않기 때문에 그냥 정적합니다

public static class SumWrapper 
1

왜 정적으로 SumWrapper 클래스를 선언하지?

엔클로저 인스턴스의 상태에 대한 액세스가 필요하지 않은 것으로 보입니다.

0

Solution을 인스턴스화 한 다음 결과 개체에서 sumLists를 호출하거나 sumLists 및 listSize를 정적으로 선언해야합니다.

0

를보십시오. 정적으로`sumLists`를 선언하는 경우

public class Customer { 
public static void main(String[] args) { 
Customer customer=new Customer(); 
customer.Business(); 

}

public static void Business(){ 
System.out.println("Hi Harry"); 

} }

관련 문제