2013-07-27 3 views
-5
class Clasa {...} 

class Test { 

    public static void main(String[] args){ 

     Clasa x = new Clasa(); 
     System.out.println(x.getNo());//displays 1 
     Clasa[] y = new Clasa[10]; 
     for(int i = 0; i<4; i++) 
      y[i]=new Clasa(); 
     System.out.println(y[0].getNo()); //displays 5 
    } 
} 

GetNo() 메서드를 호출하여 Clasa 클래스의 인스턴스화 된 객체 수를 반환하도록 이러한 3 개의 점을 어떻게 대체 할 수 있습니까? 테스트 클래스는 변경하면 안됩니다.Java에서 인스턴스화 된 객체 수 얻기

+0

@ hexafraction : 지구상에서 왜 이것을 반영하겠습니까? (그리고 그 문제에 대해 - 지구상의 * 어떻게 * 이것을 반영 할 것인가?) – ruakh

+0

어떤 논리를 시도해보고 작동하지 않으면 도움을 요청하십시오. 논리 또는 코드를 직접 요구하지 마십시오. – JNL

+0

@hexafraction 그는 모든 자바 인스턴스가'Clasa 클래스의 인스턴스화 된 객체 수 '만 원하진 않는다. –

답변

0

의 모든 인스턴스에 걸쳐 유지합니다. 그래서 난 그냥 main 메소드 아래에 위의 코드를 넣어 아래 코드

package com.instance.main; 
import com.instance.target.Clasa; 

    public class Test{ 

     public static void main(String[] args) { 

     Clasa targetClass; 
     Object[] object=new Object[10]; 
     for(int i=0;i<object.length;i++){ 
      object[i]=new Clasa(); 
     } 

     System.out.println("Number of Instantiate Object {Before Calling GC}: "+Clasa .getNumberOfInstatiateObj()); 

     /* Here I am trying to deallocate the memory of Object at index no 9, so that GC called this unused object to deallocate it from memory*/ 
     for(int i=0;i<object.length;i++){ 
      if(i==8){ 
       object[i]=object[i+1]; 
       object[i+1]=null; 
       System.runFinalization(); 
       System.gc(); 
      } 
     } 

     } 
    } 

으로 코드를 대체하려는 또한 당신은 아래의 코드

패키지 com.instance에서 Clasa 코드를 수정해야 .목표;

클래스 Clasa {

private static int nbInstances = 0; 

    public Clasa() { 
     nbInstances++; 
    } 

    public int getNo() { 
     return nbInstances; 
    } 

    public void finalize(){ 
     nbInstances --; 
     System.out.println("Number of Instantiate Object {After Calling GC}: "+nbInstances); 
    } 

}

위의 단계에 따라 코드를 수정 한 후, 코드는 당신에게 원하는 출력을 제공 할 것입니다.

내가 틀린 부분을 수정 해주세요.

안녕하세요 저는 위 코드에 따라 코드를 수정 했으므로 클래스 코드로 작성된 다른 패키지로 클래스를 만들어야합니다. 그리고 문제가 계속 발생하면 알려주십시오.

+0

나는 당신에게 동의하지 않는다. 그는 분명히 자바 초보자이다. 그는 단계별로 그것을 배워야합니다. 귀하의 코드는 Java의 많은 고급 기능을 가지고 있지만, 그를 놀라게 할 것입니다. –

+0

또한 코드를 사용하는 것을 알기조차하지 않아도 솔루션을 올려 놓는 것이 도움이되지 않습니다. –

+0

@Adel , 네가 맞다. 나는 위의 코드에 대해 많은 정보를주지 않았다. – Ashish

4

카운터 역할을하는 정적 변수를 추가하고 생성자 내에서 증가시키고 getNo은 정적 변수의 값을 반환합니다.

정적 변수는 그 값이 위의 코드가 GC를 고려하고 있지 않은지에 나는, 브라이언 동의 클래스

class Clasa { 

    private static int nbInstances = 0; 

    public Clasa() { 
     nbInstances++; 
    } 

    public int getNo() { 
     return nbInstances; 
    } 
} 
+1

스레드 세이프가 아니며 객체가 GC로 처리 될 때 감소하지 않는다는 점에 유의해야합니다. –

+0

@BrianRoach 그의 코드와 질문에서, 나는 그가 GC에 관심을 갖고 있다고 생각하지 않는다. –

+0

나는 그가 당신을 그를 위해 숙제를하도록하는 것처럼 그는 신경 쓰지 않는다는 것에 동의한다.) 그러나, 다른 누군가는 이 주제에 대한 답은 아마도 나의 의견 일 수도 있습니다. –

관련 문제