【问题标题】: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;
}}
【问题讨论】:
标签:
java
oop
access-modifiers
【解决方案1】:
- 您不能在 a 中声明任何带有访问说明符的变量
方法。
- 可以通过定义内部类并声明私有变量来实现
在里面。
- 是的,可以通过该方法访问。
编辑:阅读更多关于Inner Class here
【解决方案2】:
不,你不能。
方法内的变量被认为是局部的,不能有修饰符。
你可以在一个类中拥有私有字段,但这是不同的:
public class Test {
public String getUserName(){
user="David";
return user;
}
private String user;
}
此外,给类命名GetUser 有点尴尬。
更好的类名是User。 getUser 更适合作为方法名。
【解决方案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 只会是句法噪音。语言不允许。