【问题标题】:Static and non static in java? [duplicate]java中的静态和非静态? [复制]
【发布时间】:2014-02-19 09:11:38
【问题描述】:

错误:

无法对非静态方法进行静态引用 setSelectedInfoRole(SelectOption) 从类型 PeopleInfoViewModel.PeopleInfoData

代码如下:

    @Command
    @NotifyChange({ "peopleInfoList", "selectedFolderInfo" })
    public void encryptInfo() {
        Set selectedPeopleInfo=peopleInfoList.getSelection();
        if (selectedPeopleInfo == null) {
            showError(pageResourceBundle.getText("PLS_SELECT_AN_INFO_TO_CRYPT"));
            return;
        } 
        List<PeopleInfoRecord> folderRecord = new ArrayList<PeopleInfoRecord>();


        for (Object selectedObj : selectedPeopleInfo) {
            if (selectedObj instanceof PeopleInfoData) {
                PeopleInfoData peopleInfoData = (PeopleInfoData) selectedObj;
                ValidInfoRow validInfoRow = Services.folderService().findValidInfoByInfoCode(peopleInfoData.getPeopleInfoRecord().getInfoCode());

                if (InfoType.CHOOSE.equals(validInfoRow.getInfoType())) {
                    if (!CsdcStringUtils.isBlank(peopleInfoData.getPeopleInfoRecord().getInfoValue(), true)) {
                        PeopleInfoData.setSelectedInfoRole(new SelectOption<String>(peopleInfoData.getPeopleInfoRecord().getInfoValue()));
                    }
                }

            }
        }
    }

在上面的方法行

   PeopleInfoData.setSelectedInfoRole(new SelectOption<String>(peopleInfoData.getPeopleInfoRecord().getInfoValue()));

给出错误。

这是 Pojo 类:

public class PeopleInfoData {
        private ListModelList<SelectOption<String>> infoobj;

        private PeopleInfoRecord peopleInfoRecord;
        private SelectOption<String> selectedInfoRole;


        public SelectOption<String> getSelectedInfoRole() {
            return selectedInfoRole;
        }

        public void setSelectedInfoRole(SelectOption<String> selectedInfoRole) {
            this.selectedInfoRole = selectedInfoRole;
        }

        public ListModelList<SelectOption<String>> getInfoobj() {
            return infoobj;
        }

        public void setInfoobj(ListModelList<SelectOption<String>> infoobj) {
            this.infoobj = infoobj;
        }

    }

【问题讨论】:

    标签: java static non-static


    【解决方案1】:

    setSelectedInfoRole() 是一个non-static 方法,而您试图以static 的方式调用它PeopleInfoData.setSelectedInfoRole 这是错误的。您需要创建该类的对象,然后调用该方法。

    new PeopleInfoData().setSelectedInfoRole(new SelectOption<String>(peopleInfoData.getPeopleInfoRecord().getInfoValue()));
    

    但看起来您已经为该类创建了一个对象。您需要使用该对象来调用此方法。

    PeopleInfoData peopleInfoData = (PeopleInfoData) selectedObj;
    peopleInfoData.setSelectedInfoRole(new SelectOption<String>(peopleInfoData.getPeopleInfoRecord().getInfoValue()));
    

    【讨论】:

      【解决方案2】:

      您在这一行的问题:PeopleInfoData.setSelectedInfoRole(new SelectOption&lt;String&gt;(peopleInfoData.getPeopleInfoRecord().getInfoValue())) 是大写的“P”。您的变量名为 peopleInfoData 您正在尝试访问该方法,就像它是 PeopleInfoData 的静态方法一样。

      【讨论】:

        【解决方案3】:

        请参阅Java Language Specification, section 8.4.3.2

        static 类方法意味着它是该类的通用实用方法,而不是特定于该类的实际对象。 static 方法不能像您的那样引用 this

        我希望你的意思是在那一行写peopleInfoData 而不是PeopleInfoData,所以你会引用对象本身,而不是它的类。否则,当调用此方法时,Java 将不知道您指的是哪个对象 this

        【讨论】:

          【解决方案4】:

          您使用的是类名而不是变量名。只需使用小写的“p”就可以了。您不能对非静态方法进行静态引用(使用类名)。您需要使用该对象的实例来访问非静态方法。

          【讨论】:

            猜你喜欢
            • 2011-06-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-06
            • 2012-10-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多