Duvida com implementaçao de AbstractTableModel

E ae pessoal…

peguei esse exemplo de implementação de tablemodel ness site http://devsv.wordpress.com/2012/07/08/como-implementar-um-tablemodel/

Fiz e rodou direitinho.

Minha duvida é :

No construtor com parametros não teria que ser passado tambem as colunas ??? Pq não foi preciso ???

public class SocioTableModel extends AbstractTableModel {  

    // Lista de Sócios a serem exibidos na tabela  
    private static final int NOME = 0;  
    private static final int ENDERECO = 1; 
    private List<Socio> linhas;  
    private String[] colunas = new String[] { "Nome", "Endereço" };
    // Cria um SocioTableModel sem nenhuma linha  

    public SocioTableModel() {  
    linhas = new ArrayList<Socio>();  
    }  

    // Cria um SocioTableModel contendo a lista recebida por parâmetro  

    public SocioTableModel(List<Socio> listaDeSocios) {  

        linhas = new ArrayList<Socio>(listaDeSocios);  
    }

     @Override
    public int getRowCount() {
        return linhas.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override 

    public String getColumnName(int columnIndex) {  

        return colunas[columnIndex];  

    }; 
    @Override 
    public Class<?> getColumnClass(int columnIndex) {  

        switch (columnIndex) {  

        case NOME:  

            return String.class;  

        case ENDERECO:  

            return String.class;  

        default:  

            // Não deve ocorrer, pois só existem 2 colunas  

            throw new IndexOutOfBoundsException("columnIndex out of bounds");  

        }  

    } 

   @Override 
    public boolean isCellEditable(int rowIndex, int columnIndex) {  

    return false;  
   }  

    
    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) {  

    // Pega o sócio referente a linha especificada.  

    Socio socio = linhas.get(rowIndex);  

    switch (columnIndex) {  

    case NOME:  

        return socio.getNome();  

    case ENDERECO:  

        return socio.getEndereco();  

    default:  

        // Não deve ocorrer, pois só existem 2 colunas  

        throw new IndexOutOfBoundsException("columnIndex out of bounds");  

    }  

    }  

    @Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  

    // Pega o sócio referente a linha especificada.  

    Socio socio = linhas.get(rowIndex);  

    switch (columnIndex) {  

    case NOME:  

        socio.setNome((String) aValue);  

        break;  

    case ENDERECO:  

        socio.setEndereco((String) aValue);  

        break;  

    default:  

        // Não deve ocorrer, pois só existem 2 colunas  

        throw new IndexOutOfBoundsException("columnIndex out of bounds");  

    }  

       

    fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualização da célula  

} 
    // Retorna o sócio referente a linha especificada  
    public Socio getSocio(int indiceLinha) {  

    return linhas.get(indiceLinha);  
}  

// Adiciona o sócio especificado ao modelo  

public void addSocio(Socio socio) {  

    // Adiciona o registro.  

    linhas.add(socio);  

    // Pega a quantidade de registros e subtrai 1 para  

    // achar o último índice. A subtração é necessária  

    // porque os índices começam em zero.  

    int ultimoIndice = getRowCount() - 1;  

    // Notifica a mudança.  

    fireTableRowsInserted(ultimoIndice, ultimoIndice);  

}  

// Remove o sócio da linha especificada.  

public void removeSocio(int indiceLinha) {  

    // Remove o registro.  

    linhas.remove(indiceLinha);  

    // Notifica a mudança.  

    fireTableRowsDeleted(indiceLinha, indiceLinha);  

}  

// Adiciona uma lista de sócios no final da lista.  

public void addListaDeSocios(List<Socio> socios) {  

    // Pega o tamanho antigo da tabela, que servirá  

    // como índice para o primeiro dos novos registros  

    int indice = getRowCount();  

    // Adiciona os registros.  

    linhas.addAll(socios);  

    // Notifica a mudança.  

    fireTableRowsInserted(indice, indice + socios.size());  

}  

// Remove todos os registros.  

public void limpar() {  

    // Remove todos os elementos da lista de sócios.  

    linhas.clear();  

    // Notifica a mudança.  

    fireTableDataChanged();  
} 

Basta observar a linha

private String[] colunas = new String[] { "Nome", "Endereço" };

Que se entende por que não foi preciso dizer as colunas…

Mas nao teria que estar tambem dentro do construtor ?