get与set方法的两个小问题

问:

public String getPassword() { return password; } public void setPassword(String password) { this.password = password; 第一步的return返回什么 第二步的 this怎么解释



答:

你前面应该定义了password这个字段并且为String 类型的,类似这样:
private String password;
其实getPassword()和setPassword()是对你定义的password进行取值和赋值,
这两个方法执行的顺序是这样的:首先执行
setPassword();//对password进行赋值;
当你要用到password中的值的时候调用
getPassword();
return 返回的是当前password的值,而this指的是本类中的password(因为其他的类也可能定义了password如果其他类中有password并且是public的,此时你调用setPassword()这个方法时,那可能同时改了其他类的password)。这样解释您应该明白了吧。




一般说后台变量是相对于前台的,举个例子,Web程序表现用html,但逻辑用代码写出来的,所以代码里的变量我们通常叫后台变量,只是一个说法而已,不用太在意,你知道是变量就可以了。面向对象通常包含 封装、继承、多态,get set就是封装。举个简单例子,如果你类里有个公共变量name,那么外面就可以直接给这个变量赋值,如果我在赋值时候需要加逻辑,那么就没办法处理了,但我用get set封装的话,那么就可以做一些逻辑东西,如:
public class test
{
string Name
{
set
{
if(value=="")
{
throw ......
}
}
}
}
这样我外面给变量赋值时候我就可以做判断,加逻辑了。当然这只是一个例子。不知道你可懂了。



第一步的return返回的是该类中password的值
this表示当前类。由于在第二个函数定义了一个与当前类中字段password相同的形式参数,所以用 this来表明此处是类中字段password。


get 表示获取某个变量值
set 表示设置某个变量值
get set 后面家变量名
比如:
public String getFlag() {
    return flag;
}

public void setFlag(String flag) {
this.flag=flag;
} 



get用于取得属性的值,set用于给属性赋值
例如:
class Aa {
 private String a1;

public setA1(String a1) {
 this.a1 = a1;
}
public getA1() {
  return this.a1;
}
}

class Amain {
  public static void main(String[] args) {
       Aa aa = new Aa();
       aa.setA1("为aa赋一个值");    //用于赋值
    
    String a1 = aa.getA1();  // 取得属性的值
    System.out.println(a1);
 }
} 




get和set 方法用于private数据中,如果一个类中的数据已经设为private,那么在其他类中已经不能调用他,只能通过get和set方法。
这是我和你设计的例子:
package baidu;

public class Test1 {//get和set方法

 
 private String s;
 
 public void setStr(String s){
  
  this.s=s;
 }
 public String  getStr(){
  
  return this.s;
 }
}
//在另外一个类中使用
class Yong{
 
 public static void main(String[] args) {
  Test1 t=new Test1();
  t.setStr("guo");
  System.out.println(t.getStr());
 }




set/get方法一般是bean类里的函数,实体bean里一般就有private权限的变量,但是要访问他们就要有函数了,就是public权限的set/get方法分别修改和读取变量的值
用这种方式的好处是提高安全性,你可能想这样还是能修改怎么就提高安全性了呢。。是这样的,如果直接把变量设成public权限的,这样不用set/get,这样也在其它类中可以直接使用这些变量,完全没有安全性。我觉得还能避免多个bean中变量名相同的问题 





问:

据说推荐用GET 和SET 来访问/修改FIELD 那么,像我这段代码,该如何改成GET SET的形式?
class whotogetset { public int a; public int b; } (我这里当然以c#为例,你们当然可以用你们擅长的C/C++/VB/JAVA等语言来回答我的疑问)



答:

你说的在C#里面叫做属性,也是C#所特有的。 下面是C#属性的解释。 C# 提供一种对称为属性的声明标记进行定义的机制。可以将属性置于源代码的某些实体上以指定附加信息。可以在运行时通过反射检索属性包含的信息。您可以使用预定义属性或者定义自己的自定义属性。 属性提供功能强大的方法以将声明信息与 C# 代码(类型、方法、属性等)相关联。与程序实体关联后,属性可在运行时查询,并可以以任意多种方式使用。 声明属性类 在 C# 中声明属性很简单:它采取从 System.Attribute 继承的类声明的形式,并已用 AttributeUsage 属性标记,如下所示: using System; [AttributeUsage(AttributeTargets.All)] public class HelpAttribute : System.Attribute { public readonly string Url; public string Topic // Topic is a named parameter { get { return topic; } set { topic = value; } } public HelpAttribute(string url) // url is a positional parameter { this.Url = url; } private string topic; } 代码讨论 属性 AttributeUsage 指定该属性可以应用于的语言元素。 属性类是从 System.Attribute 派生的公共类,至少有一个公共构造函数。 属性类有两种类型的参数: “定位参数”,每次使用属性时都必须指定这些参数。定位参数被指定为属性类的构造函数参数。在上面的示例中,url 便是一个定位参数。 “命名参数”,可选。如果使用属性时指定了命名参数,则必须使用参数的名称。通过包含非静态字段或属性来定义命名参数。在上面的示例中,Topic 便是一个命名参数。 属性参数限制为下列类型的常数值: 简单类型(bool、byte、char、short、int、long、float 和 double) string System.Type enums 对象(对象类型的属性参数的参数必须是属于上述类型之一的常数值。) 以上任意类型的一维数组



 class whotogetset
{
private int a;
private int b;

public int _a
{
get { return a; }
set { a = value; }
}

public int _b
{
get { return b; }
set { b = value; }
}

} 

用的时候whotogetset objTest = new () whotogetset ();生成实例后objTest.a
 objTest.b就行了,
属性,如果你有VS环境的话,可以看一下,属性和字段是不一定的图形()
你可用set get来控制读写属性 



C#代码

class whotogetset 
{ 
private int a; 
private int b; 

 public int _a
 {
      get { return a; }
      set { a = value; }
 }

 public int _b
 {
      get { return b; }
      set { b = value; }
 }

}

其他地方引用_a,_b 




class whotogetset 
{ 
private int a; 
private int b; 
public int A
{
  get{return a;}
  set{a=value;}
}
public int B
{
  get{return b;}
  set{b=value;}
}
} 

可以只有get没有set那就是只度,不能在外部改变a或b,或者只有set没有get那就是只写 



public class Photo {

 private int _id;
 private int _albumid;
 private string _caption;

 public int PhotoID { get { return _id; }
    set{this._id =value;} }

 public int AlbumID { get { return _albumid; }
        set{this._albumid =value;}}

 public string Caption { get { return _caption; }
    set{this._caption =value;}}

 public Photo(int id, int albumid, string caption) {
  _id = id;
  _albumid = albumid;
  _caption = caption;
 }

}
通俗来讲:get是获取值  set是设置值

比如这句: get { return _id; }
如果调用这个get方法 就能获得方法return的 this._id =value(返回的值)
调用方法:Console.Write(对象 _id);(输出该属性的值)

比如这句:set{this._id =value;} 
如果调用这个set方法 就可以重新设置_id的值 value就是你新设置的值
调用方法:对象._id="新值";(为该属性附新值)




posted @ 2011-11-25 15:40  永哥  阅读(2218)  评论(0编辑  收藏  举报