2014-12-02 96 views
0

我有一个ArrayClassmergeSortArray扩展它。并且mergeSortArray包含mergeSort()方法。然而,因为我用super来调用超类的构造函数,所以我不知道如何引用mergeSortArray(子类对象/数组),并将其作为mergeSort方法中的参数传递。事实上,这是否可行?我知道我可以以非OOP的方式做到这一点。不过,我很想知道如何以OOP的方式做到这一点。Java OOP:引用子类对象

如果我说的不正确,请纠正我,因为我是Java新手,我想了解更多信息。

// ArrayClass Object 
    import java.util.*; 
    import java.io.*; 
    import java.math.*; 

public class ArrayClass{ 
    public int[] input_array; 
    public int nElems; 

    public ArrayClass(int max){ 
     input_array = new int [max]; 
     nElems = 0; 
    } 

    public void insert(int value){ 
     input_array[nElems++] = value; 
    } 

    public void display(){ 
     for(int j = 0; j < nElems; j++){ 
      System.out.print(input_array[j] + " "); 
     } 
     System.out.println(""); 
    } 

} 



import java.io.*; 
import java.util.*; 
import java.math.*; 

class mergeSortArray extends ArrayClass{ 

    public mergeSortArray(int max){ 
     super(max); 
    } 

    public void methodOne(){ 
     int[] output_array = new int[super.nElems]; 
     mergeSort(// ************* // ,output_array,0, super.nElems -1); 

    } 
     ................ 
} 

我不知道我应该把更换******这样我可以通过mergeSortArray作为参数到mergeSort方法。

回答

1

没有mergeSortArray。你继承input_array像(和不需要super.nElems你继承太),

mergeSort(input_array, output_array, 0, nElems - 1); 

你的子类将继承一切,这是protected或更大的可视性(不private),但是你ArrayClass为您提供了公共领域

public int[] input_array; 
public int nElems; 

它们应该可能是protected并且有访问器方法(getter)。

protected int[] input_array; 
protected int nElems; 
public int size() { 
    return nElems; 
} 
public int[] getInputArray() { 
    return input_array; 
} 
+0

@Elliott_Frisch如果变量'在ArrayClass protected',子类可以访问他们(因为他们不是私人的)。在这种情况下,为什么我仍然要指定'public int size()'和'public int [] getInputArray()'实例方法? – mynameisJEFF 2014-12-02 01:10:30

+0

这些是访问器方法。一般都希望公开这些字段(就像他们在你的问题中一样)。 – 2014-12-02 01:53:28

+0

但如果这些字段是受保护的,我可以在没有访问器方法的情况下访问它们。那么为什么需要访问器方法? – mynameisJEFF 2014-12-02 02:10:51

1

首先,我建议你不要在OO代码上有公共字段。你有两个公有字段(input_array和nElems),你应该把它们改为私有的,如果你需要的话可以创建一个。

然后,要引用子类上的这些字段,如果您希望将acessor从API的其余部分或public之一隐藏(如果它是您的公共API的一部分),则可以使用protected处理器。这样一来,你的ArrayClass:

public class ArrayClass { 
    private int[] input_array; 
    private int nElems; 

    //this may be public 
    protected int[] getInputArray() { 
     return input_array; 
    } 

,当你打电话给你的归并方法,你可以使用getInputArray()