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="新值";(为该属性附新值)

 

 

 

http://www.cnblogs.com/yonge/archive/2011/11/25/2263355.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值