我仍然对getter和setter方法感到困惑。我有这个代码;
public class MethodsInstances {
public MethodsInstances(String name){
girlName = name;
}
private String girlName;
public String getName(){
return girlName;
}
public void sayName(){
System.out.printf("Your first gf was %s", getName());
}
}
但对于“sayName”,为什么你不能使用getName(),只需输入girlName?它将是相同的,因为getName()返回girlName,如代码中所示。此外,这些方法是否必须从get和set开始,或者可以命名为任何你想要的名称?
来自新手编码员丹·B的巨大感谢
答案 0 :(得分:4)
getter和setter的意思是只有它们才能被用来访问它们正在获取或设置的私有变量。通过这种方式,您可以提供封装,以后可以更轻松地重构或修改代码。
想象一下,您使用girlName
代替其getter。然后,如果你想添加类似默认的东西(比如默认名称是'Guest',如果之前没有设置的话),那么你必须同时修改getter和sayName
函数。
不要求getter和setter以get和set开头 - 它们只是普通的成员函数。然而,这是一个惯例。 (特别是如果你使用Java Beans)
答案 1 :(得分:3)
你绝对可以在你的例子中直接使用变量,主要是因为sayName()
在同一个类中。
除此之外,我认为有三个原因可以得到吸气剂和制定者:
1。)面向对象编程的原则是保持值(状态)私有,并提供与其他类交互的公共方法。
2。)具有getter和setter的类通常遵循Java bean设计模式。此模式允许在模板引擎或表达式语言(如JSP或Spring)中使用这些对象。
3.)在某些情况下,它可以防止实际错误。一个例子:
public class DateHolder() {
public Date date;
public static void main(String... args) {
DateHolder holder = new DateHolder();
holder.date = new Date();
System.out.println("date in holder: "+holder.date);
Date outsideDateRef = holder.date;
outsideDateRef.setTime(1l);
//will be different, although we did not change anything in the holder object.
System.out.println("date in holder: "+holder.date);
}
}
用getter和setter包装日期变量只能使用值而不是引用来操作,这会阻止这个:
public class DateHolder() {
private Date date;
public Date getDate() {
return (Date)this.date.clone();
}
public void setDate(Date date) {
this.date = (Date) date.clone();
}
public static void main(String... args) {
DateHolder holder = new DateHolder();
holder.setDate( new Date() );
System.out.println("date in holder: "+holder.getDate());
Date outsideDateRef = holder.getDate();
outsideDateRef.setTime(1l);
//Date in holder will not have changed
System.out.println("date in holder: "+holder.getDate());
}
}
答案 2 :(得分:2)
在方法中封装“获取”和“设置”变量的过程是一种常见的设计模式。如果您想要更改底层实现,这将为您提供更多自由。
举一个例子,假设你有一天想要将参数girlName更改为对象Girl而不是; 如果您直接从外部类访问girlName,则必须更改所有外部代码。
使用setter方法,您只需更改一个方法并执行
public void setGirlname(String name)
{
girlname = new Girl(name, some_other_data);
}
或许你想确保女孩名总是以大写字母返回。
public String getGirlname()
{
return girlName.toUpperCase();
}
从而为您的代码设计提供更多灵活性。
答案 3 :(得分:2)
你可以在这里使用girlName,你真的不必调用getName()。你需要getName()的原因是你想获得这个类之外的名字。例如,如果您创建一个新类,然后在新类中创建上述类对象并为该对象分配一个名称(girlName的值),您将无法从新类访问girlName,因为它是私有的..所以你需要一个能为你获得价值的公共方法。
此外,它不必是getName或setName,但这只是让我们很容易理解正在做什么功能。
答案 4 :(得分:2)
您必须先阅读abstraction,encapsulation和OOP,才能了解访问者,变更者,不变性和数据访问权。
答案 5 :(得分:1)
我们希望阻止对变量的直接访问,我们将变量设为私有变量。 当变量是私有时,其他类无法访问该变量。 如果我们将变量创建为公共变量,则所有人都可以访问它。
要更改实际的私有变量,我们现在需要public getter()或setter()。 基本命名约定表示我们将获取变量的名称,并在其前面加上get和/或set。
在您的特定情况下,getGirlname是正确的。
我们称之为封装
答案 6 :(得分:0)