我可以在公共方法中声明私有变量吗?

Posted

技术标签:

【中文标题】我可以在公共方法中声明私有变量吗?【英文标题】:Can I Declare private variables inside a public method? 【发布时间】:2018-11-12 04:03:01 【问题描述】:

这个问题是我在一次采访中问到的。 我们可以在公共方法中声明私有变量吗? 如果可以,我们可以通过公共方法访问变量吗?

我尝试使用 java,但它不允许在方法内定义私有变量,为什么会这样?

public class GetUser 

public String getUserName()

    private String user="David"; 

return user;


【问题讨论】:

如果你需要一个不可更改的变量,它可以是“最终的” 【参考方案1】: 您不能在 a 中声明任何带有访问说明符的变量 方法。 可以通过定义内部类并声明私有变量来实现 在里面。 是的,可以通过该方法访问。

编辑:阅读更多关于Inner Class here

【讨论】:

【参考方案2】:

不,你不能。 方法内的变量被认为是局部的,不能有修饰符。 你可以在一个类中拥有私有字段,但这是不同的:

public class Test 
    public String getUserName()

        user="David"; 
        return user;

    
    private String user;

此外,给类命名GetUser 有点尴尬。 更好的类名是UsergetUser 更适合作为方法名。

【讨论】:

【参考方案3】:

不,这是语法错误,您不能在方法中使用访问修饰符。

访问修饰符用于确定类的某些成员(属性、构造函数、方法)的范围。方法变量的作用域只是那个方法,所以你不需要显式指定作用域。

关于访问修饰符的更多信息: https://www.javatpoint.com/access-modifiers

【讨论】:

【参考方案4】:

直接在方法中声明的变量是局部变量。不能将局部变量声明为 private。事实上,您可以在局部变量声明中使用的唯一修饰符是 final

也可以在方法中嵌入一个内部类声明inside;匿名内部类或命名内部类。内部类可以声明字段,并且这些字段可以具有除static 之外的全部修饰符。从某种意义上说,字段是封闭方法“内部”的变量。这是一个例子:

public void myMethod () 

   class Inner() 
       private int field1;
       public int field2;
       /* .... */
   

   Inner inner = new Inner();
   // do stuff with the inner object

如果您使用上面的代码,您会发现myMethod 中的代码可以完全访问Inner 的私有字段。但无论如何,这是一个在方法“内部”声明private 变量的示例。

回到正常情况,访问修饰符的目的是实现封装。封装的主要目的是尽量减少代码库不同部分之间的不良耦合。 (类能够访问另一个类的内部变量是不好的,因为它很难改变第二个类的代码......而不破坏第一个类。)

但是唯一可以访问方法局部变量的代码就在附近;即在同一个源代码文件中,并且在方法的主体中。假设是正文中的任何代码都可能需要访问局部变量,而任何不应访问的代码(例如,为了避免耦合)应该使用不同的方法。

因此,局部变量的“自然”可见性等同于private,其他可见性设置意义不大。因此,鉴于所有局部变量“自然”是私有的,那么将它们明确声明为 private 只会是句法噪音。语言不允许。

【讨论】:

以上是关于我可以在公共方法中声明私有变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在公共标头中而不是在私有标头中将变量声明为const吗?

是否可以在私有方法中定义公共变量?

如何在带有接口的 Typescript 中声明公共和私有变量?

子类真的继承私有成员变量吗?

不是公共或私有的变量-Java

使读取公共写入私有变量的不同方法?