【问题标题】:Access the variable declared inside the private class in java访问java中私有类中声明的变量
【发布时间】:2013-02-14 22:58:19
【问题描述】:

这是我的代码。

private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String username = "";
    String sql = "select * from userinfo where uname=? and pword=?";
    try{
        pst = conn.prepareStatement(sql);
        pst.setString(1, txt_username.getText());
        pst.setString(2, txt_password.getText());

        rs=pst.executeQuery();
        if(rs.next()){
            afterLogin pwcorrect = new afterLogin();
            pwcorrect.setVisible(true);
            this.setVisible(false);
            username = txt_username.getText();
        }
        else{
            JOptionPane.showMessageDialog(null, "Username and Password are Incorrect.");
        }
    }
    catch(Exception e){

        JOptionPane.showMessageDialog(null, e);
    }
}

我需要从另一个类访问用户名的值。有什么办法吗???请帮我写代码。

【问题讨论】:

  • 定义公共访问器方法并使用它们。
  • 我在你的代码中看到 no 私有类,我看到的只是一个带有局部变量用户名的私有方法。
  • @PremGenError:我很抱歉。你能告诉我如何从其他类或同一类中的其他方法访问这个局部变量用户名吗?能否请您也提供代码。
  • @user2068452 忘记其他类的,同一类中的其他方法将无法访问此本地 var 用户名。局部变量只限于声明它们的方法。这里更好的选择是使其成为私有实例变量,并具有公共 setter 和 getter 方法,其他类可以通过该方法访问用户名。

标签: java class private accessor


【解决方案1】:

这不仅仅是在类中定义的,而是在类中的方法中定义的。

这不是“私有”变量(或类),就其他类而言,它是一个不可见 变量。用公共 getter 公开它,或提供一种机制,代码可以将它设置在其他东西上。

由于这是一个动作处理程序,您还需要确保该变量仅在设置后才会被访问,或者无论它被访问如何都能处理它没有有值。


public class WhateverClassThisIs {

    private String username;

    public String getUsername() { return username; }

    private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String sql = "select * from userinfo where uname=? and pword=?";
        try {
            // As before, but:
            if (rs.next()) {
                username = txt_username.getText();
            }
        }
    }
}

public class SomeOtherClass {

    private WhateverClassThisIs theOtherClass;

    public void setTheOtherClass(WhateverClassThisIs theOtherClass) {
        this.theOtherClass = theOtherClass;
    }

    public void whatever() {
        String username = theOtherClass.getUsername();
    }
}

另一种机制将依赖于使用用户名设置器将某些内容传递给WhateverClassThisIs,大致如下:

public class WhateverClassThisIs {

    private SomeOtherClass someOtherClass;

    public WhateverClassThisIs(SomeOtherClass someOtherClass) {
        this.someOtherClass = someOtherClass;
    }

    private void btnloginActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String sql = "select * from userinfo where uname=? and pword=?";
        try {
            // As before, but:
            if (rs.next()) {
                someOtherClass.setUsername(txt_username.getText());
            }
        }
    }
}

public class SomeOtherClass {

    private String username;

    public void setUsername(String username) {
        this.username = username;
    }

    public void whatever() {
        // Do something with username--but either try
        // after you know it's been set, or by being
        // able to handle it being null/empty/whatever
    }
}

此外,您可以使用Observer、多种 Swing 机制中的任何一种,等等。

【讨论】:

  • “用公开的 getter 公开它,或者提供一种机制,代码可以将它设置在其他东西上。”你能用代码解释一下吗?
  • @user2068452 我想,虽然希望事后看来是显而易见的。还有其他几种方法可以处理这种情况,有些是 Swing 特有的,有些不是。
【解决方案2】:

是的,如果变量是字段,则可以使用反射来实现。

但最好的解决方案是更改其他类,使其具有可访问的 getter 和/或 setter 方法……在您考虑完所有含义之后。

打破类封装以访问私有状态是您在不得已的情况下才应该做的事情。


如果变量是局部变量,则其他类或方法无法更新它。如果该类是本地声明的匿名内部类并且变量声明为final,则只能从另一个类访问它。这听起来不像你在这里想要做的......

【讨论】:

  • 如果用户名和密码正确,我正在尝试从文本字段中获取用户名。这样我就可以在其他类或方法中使用用户名。
  • 所以不要放在局部变量中!!!将其放在封闭类的(私有)字段中并实现 getter 方法。 (如果你问错了问题,你就不会得到正确的答案。努力清楚地表达自己是值得的......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 2016-03-08
  • 2012-05-09
相关资源
最近更新 更多