Java 对受保护构造函数的查询

Java 对受保护构造函数的查询,java,apache-poi,Java,Apache Poi,对不起,这个愚蠢的问题。 下面是我使用ApachePOI从电子表格中读取的代码。我感到困惑的是 XSSFWorkbook wb = new XSSFWorkbook(fs); XSSFSheet sheet = wb.getSheetAt(0); 我已经创建了一个XSSFSheet对象,它接受wb.getSheetAt(0),我的问题是为什么要将wb.getSheetAt(0)传递给sheet对象。 当我尝试创建一个对象时,如下所示 XSSFSheet sheet = new XSSFShee

对不起,这个愚蠢的问题。 下面是我使用ApachePOI从电子表格中读取的代码。我感到困惑的是

XSSFWorkbook wb = new XSSFWorkbook(fs);
XSSFSheet sheet = wb.getSheetAt(0);
我已经创建了一个XSSFSheet对象,它接受wb.getSheetAt(0),我的问题是为什么要将wb.getSheetAt(0)传递给sheet对象。 当我尝试创建一个对象时,如下所示

XSSFSheet sheet = new XSSFSheet(wb);
我得到一个错误声明

XSSFSheet(org.apache.poi.openxml4j.opc.PackagePart) has protected access in 'org.apache.poi.xssf.usermodel.XSSFSheet'
我查看了XSSFSheet源代码,它的构造函数被声明为受保护。我的印象是,可以使用new关键字创建对象。我错过了什么

源代码供参考

package ReadAndWrite;

import ReadExcelLibrary.ReadExcelSheet;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;


/**
 * Created by Shravya on 11/5/17.
 */
public class ReadExcel {

    public static void main(String[] args) throws Exception {

        File file = new File("//Development//Selenium//ApachePOI//Apache_wb.xlsx");
        FileInputStream fs = new FileInputStream(file);
        XSSFWorkbook wb = new XSSFWorkbook(fs);
        //XSSFSheet sheet = new XSSFSheet(wb);
        XSSFSheet sheet = wb.getSheetAt(0);
        String value = sheet.getRow(0).getCell(0).getStringCellValue();
        System.out.println("The value of cell is " + value);

        ReadExcelSheet excelSheet = new ReadExcelSheet("//Development//Selenium//ApachePOI//Apache_wb.xlsx");
        System.out.println(excelSheet.getData(0,1,1));



    }
}
让我们假装你能做到。它将创建一个尚不存在的新XSSFSheet对象

XSSFSheet sheet = wb.getSheetAt(0);
这完全不是一回事。这允许获取工作簿中索引为0的现有工作表。所以这是两件完全不同的事情。基本上,从车库买一辆车和制造一辆全新的汽车之间存在着相同的区别

所以当你说

我创建了一个XSSFSheet对象,它接受wb.getSheetAt(0)

那是不对的。你还没有创造任何东西。您已获得对工作簿已为您创建的现有XSSFSheet对象的引用

我的印象是,可以使用new关键字创建对象

是的,这是构造函数允许做的。但是,如果构造函数受到保护,这意味着只有同一包中的子类或类才允许调用构造函数

要在工作簿中创建新工作表,可以使用,要求工作簿为您创建工作表,并提供对已创建工作表的引用。就像,为了得到一辆新车,你通常不会自己造一辆,而是让汽车制造商为你造一辆

让我们假装你能做到。它将创建一个尚不存在的新XSSFSheet对象

XSSFSheet sheet = wb.getSheetAt(0);
这完全不是一回事。这允许获取工作簿中索引为0的现有工作表。所以这是两件完全不同的事情。基本上,从车库买一辆车和制造一辆全新的汽车之间存在着相同的区别

所以当你说

我创建了一个XSSFSheet对象,它接受wb.getSheetAt(0)

那是不对的。你还没有创造任何东西。您已获得对工作簿已为您创建的现有XSSFSheet对象的引用

我的印象是,可以使用new关键字创建对象

是的,这是构造函数允许做的。但是,如果构造函数受到保护,这意味着只有同一包中的子类或类才允许调用构造函数


要在工作簿中创建新工作表,可以使用,要求工作簿为您创建工作表,并提供对已创建工作表的引用。就像,为了获得一辆新车,你通常不会自己造一辆,而是让汽车制造商为你造一辆。

哦,那些排名前1%的家伙。其中一个想法是“嗯,这看起来像是我可以在手机上回答的问题”,然后你找到了这样一个完美的答案,哈哈。除了给答案投票外,没什么可做的了。谢谢@GhostCat,我很荣幸。最高0.01%。更糟糕的是:-)哦,那些排名前1%的家伙。其中一个想法是“嗯,这看起来像是我可以在手机上回答的问题”,然后你找到了这样一个完美的答案,哈哈。除了给答案投票外,没什么可做的了。谢谢@GhostCat,我很荣幸。最高0.01%。更糟糕的是:-)
XSSFSheet sheet = wb.getSheetAt(0);