我正在关注多个方法和实例的一系列教程。作者没有详细说明某些要素的细节。
为什么你认为他会将方法setName放在“public void”中,然后使用“public String getName”获取返回值。为什么他不将return randomName放在public void中并在public void中声明方法声明字符串g?
public class voidvoid {
private String randomName;
public void setName(String name){
randomName = name;
}
public String getName () {
return randomName;
}
public void saying () {
System.out.printf("you are %s", getName());
}
}
答案 0 :(得分:3)
它被称为封装。
隐藏对象的内部保护其完整性 阻止用户将组件的内部数据设置为 无效或不一致的状态。封装的好处是 它可以降低系统复杂性,从而提高稳健性 允许开发人员限制软件之间的相互依赖性 组件。
更多信息:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
答案 1 :(得分:1)
使用public void设置变量的值,使用public来获取变量的值是“正确”的方法。您可以搜索“java中的getter和setter”以获取有关该主题的更多信息。基本上,这提供了对获取和设置变量值的存储名称的公共访问。说()的方法显示了getter方法的使用,在本例中是getName()。请注意,变量本身被声明为私有。这意味着除非您扩展此类,否则除了通过getter和setter之外,您无法访问此类外部的变量。比如说你不喜欢弗雷德这个名字。在你的setName(String name)方法中,你可以说:
if(name.equals("Fred") {
randomName = "Jon Doe";
}
任何时候有人试图设置名称“Fred”,它将被保存为“Jon Doe”。如果他们可以直接访问变量,他们可以随时将值设置为“Fred”。 这意味着您可以通过您的方法最终控制变量中的内容。
答案 2 :(得分:1)
当一个方法设置一个类的属性时,它被称为setter
方法:
public void setName(String name)
由于您只能使用此方法设置类的randomename
属性,因此通常不需要返回类型。但是如果你愿意,你肯定可以添加一个返回类型。如:
//this method will return true if the `randomname` was not set previously
//otherwise false
public boolean setName(String name) {
if (null == randomname ) {
randomname = name;
return true;
}
else return false;
}
和setter方法类似,如果你可以使用一个方法得到一个属性,它通常被称为getter
方法:
public String getName(String name)
Saying方法用于打印randomname
属性。这是必要的,因为您无法在类范围之外打印randomname
,因为它是私有的:
//this will print the value of randomname
public void saying ()
//another scenario
voidvoid foo = new voidvoid () ;
foo.setName("Hello world") ;
//this line will generate an erro
System.out.println (foo.randomname) ;
//this will compile fine
foo.saying () ;
//you can also achieve the same result using getName
System.out.println (foo.getName() ) ;
private
属性的setter / getter方法是mandatory
,如果你想要retrieve/set
属性,optional
属于public
属性,但是我认为这是一个good practice
。
答案 3 :(得分:0)
除了向最终用户展示封装内容的价值之外,还有更多内容。在许多程序中,输出到stdout(System.out输出的位置)是从不最终用户看到的。您的对象可能需要String
以供日后参考,因此将其拉出而不是将其输出到stdout将会更有益。
至于getName
和setName
- 分别是访问者和 mutators 。
访问者需要检索有关特定变量的信息,因此预期的返回类型是您需要的变量类型。由于您返回String
,因此getName
会返回String
,因为变量randomName
是String
。
mutator只需要改变内部变量的值,通常在某些条件下。这里真的不需要返回任何内容,因此返回值为void
。通常你会看到返回boolean
的mutator指示成功或失败,但在我看过它使用的例子中,返回值在很大程度上被忽略了。
答案 4 :(得分:0)
为什么他不将return randomName放在public void
中
我不明白这个问题。他把它放在public static String getName()
方法中。他还能把它放在哪里呢?
在public void中说方法声明字符串g?
因为这会使它成为局部变量而不是实例成员,所以你不能用另一种方法设置它。