【问题标题】:Java constructor and modify the object properties at runtimeJava 构造函数并在运行时修改对象属性
【发布时间】:2010-05-20 07:21:54
【问题描述】:

注意:这是一个作业

嗨,

我有以下类/构造函数。

import java.io.*;

class Set {

       public int numberOfElements = 0;
       public String[] setElements = new String[5]; 
       public int maxNumberOfElements = 5;

       // constructor for our Set class   

       public Set(int numberOfE, int setE, int maxNumberOfE) {
          int numberOfElements    = numberOfE;
          String[] setElements    = new String[setE];
          int maxNumberOfElements = maxNumberOfE;
       }

       // Helper method to shorten/remove element of array since we're using basic array instead of ArrayList or HashSet from collection interface :(

       static String[] removeAt(int k, String[] arr) {
           final int L = arr.length;
           String[] ret = new String[L - 1];
           System.arraycopy(arr, 0, ret, 0, k);
           System.arraycopy(arr, k + 1, ret, k, L - k - 1);
           return ret; 
       }

       int findElement(String element) {
          int retval = 0;

            for ( int i = 0; i < setElements.length; i++) {

               if ( setElements[i] != null && setElements[i].equals(element) ) {
                  return retval = i;

               }
            retval = -1; 
           }

          return retval;
       }

       void add(String newValue) {
            int elem = findElement(newValue);
            if( numberOfElements < maxNumberOfElements && elem == -1 ) {
               setElements[numberOfElements] = newValue;
               numberOfElements++;
            } 
       }

       int getLength() {
           if ( setElements != null ) {
                return setElements.length;
           }
           else {
                return 0;
           }
       }

       String[] emptySet() {
          setElements = new String[0];
          return setElements;
       }


      Boolean isFull() {
           Boolean True = new Boolean(true);
           Boolean False = new Boolean(false);
          if ( setElements.length == maxNumberOfElements ){
                return True; 
          } else { return False; }
       }

      Boolean isEmpty() {
            Boolean True  = new Boolean(true);
            Boolean False = new Boolean(false);

            if ( setElements.length == 0 ) {
                return True;
            } else {  return False; }
       }

       void remove(String newValue) {

            for ( int i = 0; i < setElements.length; i++) {
               if ( setElements[i].equals(newValue) ) {
                    setElements = removeAt(i,setElements);

               }
            }

       }   

        int isAMember(String element) {
           int retval = -1;

           for ( int i = 0; i < setElements.length; i++ ) {
                if (setElements[i] != null && setElements[i].equals(element)) {
                     return retval  = i;
                }   
           }
           return retval;
       }

       void printSet() {
            for ( int i = 0; i < setElements.length; i++) {
               System.out.println("Member elements on index: "+ i +" " + setElements[i]);
            }
       }

       String[] getMember() {
            String[] tempArray = new String[setElements.length];
            for ( int i = 0; i < setElements.length; i++) {
               if(setElements[i] != null) {
                    tempArray[i] = setElements[i];
               }
            }
            return tempArray;
       }

       Set union(Set x, Set y) {
          String[] newXtemparray = new String[x.getLength()];
          String[] newYtemparray = new String[y.getLength()];
          Set temp = new Set(1,20,20);
          newXtemparray = x.getMember();
          newYtemparray = x.getMember();
          for(int i = 0; i < newXtemparray.length; i++) {
               temp.add(newYtemparray[i]);
          }

          for(int j = 0; j < newYtemparray.length; j++) {
               temp.add(newYtemparray[j]);
          }
          return temp;
       }

}

// This is the SetDemo class that will make use of  our Set class

class SetDemo {
     public static void main(String[] args) {
          //get input from keyboard
          BufferedReader keyboard;
          InputStreamReader reader;
          String temp = "";

          reader =   new InputStreamReader(System.in);
          keyboard = new BufferedReader(reader);


      try 
          {
               System.out.println("Enter string element to be added" );
               temp = keyboard.readLine( );
               System.out.println("You entered " + temp );
          }
     catch (IOException IOerr)
          {
               System.out.println("There was an error during input");
          }

     /* 
      **************************************************************************
      * Test cases for our new created Set class.
      *
      **************************************************************************
     */
     Set setA = new Set(1,10,10);
     setA.add(temp);
     setA.add("b");
     setA.add("b");
     setA.add("hello");
     setA.add("world");
     setA.add("six");
     setA.add("seven");
     setA.add("b");
     int size = setA.getLength();
     System.out.println("Set size is: " + size );
     Boolean isempty = setA.isEmpty();
     System.out.println("Set is empty? " + isempty );
     int ismember = setA.isAMember("sixb");
     System.out.println("Element six is member of setA? " + ismember );
     Boolean output = setA.isFull();
     System.out.println("Set is full? " + output );
     setA.printSet();
     int index   = setA.findElement("world");
     System.out.println("Element b located on index: " + index );
     setA.remove("b");
     setA.emptySet();
     int resize = setA.getLength();
     System.out.println("Set size is: " + resize );
     setA.printSet();
     Set setB = new Set(0,10,10);
     Set SetA = setA.union(setB,setA);
     SetA.printSet();
     }
}

我在这里有两个问题,为什么当我将类属性声明更改为:

class Set {

       public int numberOfElements;
       public String[] setElements; 
       public int maxNumberOfElements;

       // constructor for our Set class   

       public Set(int numberOfE, int setE, int maxNumberOfE) {
          int numberOfElements    = numberOfE;
          String[] setElements    = new String[setE];
          int maxNumberOfElements = maxNumberOfE;
       }

我收到了这个错误:

\

javaprojects>java SetDemo
Enter string element to be added
a
You entered a
Exception in thread "main" java.lang.NullPointerException
        at Set.findElement(Set.java:30)
        at Set.add(Set.java:43)
        at SetDemo.main(Set.java:169)

第二,关于union方法,为什么SetA.printSet的结果还是打印null,是不是从union方法中取回了返回值?

提前感谢您的任何解释。

羽扇豆

【问题讨论】:

    标签: java arrays constructor union set


    【解决方案1】:

    你在构造函数中隐藏了你的实例变量:

    当你写作时:

       public Set(int numberOfE, int setE, int maxNumberOfE) {
          int numberOfElements    = numberOfE;
          String[] setElements    = new String[setE];
          int maxNumberOfElements = maxNumberOfE;
       }
    

    这会创建三个新变量,所有这些变量都只持续构造函数的持续时间。应该是:

       public Set(int numberOfE, int setE, int maxNumberOfE) {
          this.numberOfElements    = numberOfE;
          this.setElements    = new String[setE];
          this.maxNumberOfElements = maxNumberOfE;
       }
    

    您可以在第二个版本中删除this.,但我发现它更清晰(它还允许您重用变量名)。

    另外,你不需要这样做:

          String[] newXtemparray = new String[x.getLength()];
          String[] newYtemparray = new String[y.getLength()];
          Set temp = new Set(1,20,20);
          newXtemparray = x.getMember();
          newYtemparray = x.getMember();
    

    只是:

          Set temp = new Set(1,20,20);
          String[] newXtemparray = x.getMember();
          String[] newYtemparray = y.getMember();
    

    很好(请注意,您的 newYtemparray 也有错字;它是 x.getMember)

    这些是参考变量。目前,您正在初始化它们以指向一个新数组。然后立即将它们分配为指向不同的数组。所以你在不必要地分配和破坏内存。

    【讨论】:

      【解决方案2】:

      也许是因为你忘记了隐藏?您不会在构造函数中为类变量分配任何值,您只需创建新对象,这些对象在构造函数结束后被垃圾收集。查找“范围”或“可见性”以获取更多信息。

      【讨论】:

        猜你喜欢
        • 2018-06-11
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        相关资源
        最近更新 更多