Java——this关键字(调用本类属性、调用本类方法、表示当前对象)

举报
Winter_world 发表于 2021/09/29 01:06:49 2021/09/29
【摘要】 目录 1、调用本类属性 2、调用本类方法 3、表示当前对象 this是一个非常灵活的关键字,不会明确表示一个固定概念,比如int,它就是表示一个整型。 1、调用本类属性 类中有许多成员,大部分情况下类中直接进行成员调用,但是为了清楚的描述调用是本类属性,会用this.属性表示。 class Person{ ...

目录

1、调用本类属性

2、调用本类方法

3、表示当前对象


this是一个非常灵活的关键字,不会明确表示一个固定概念,比如int,它就是表示一个整型。

1、调用本类属性

类中有许多成员,大部分情况下类中直接进行成员调用,但是为了清楚的描述调用是本类属性,会用this.属性表示。


  
  1. class Person{
  2. String name;
  3. int age;
  4. public Person(){}
  5. public Person(String name, int age) {
  6. name = name;
  7. age = age;
  8. }
  9. }

如上定义的类,构造方法按上述写法,对象中不会保存我们定义的内容,而是默认值,因为程序以{}为界定范围,如果在此范围内有指定的变量名称,则会直接调用,若没有,则会调用类中的相应属性。

当参数与属性名称相同时,则会出现混淆,则需要用户自己手动明确调用的是属性还是方法中的参数,若是属性,则需要加this.属性,标准程序开发中都会以此方式进行:


  
  1. class Person{
  2. String name;
  3. int age;
  4. public Person(){}
  5. public Person(String name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. }

2、调用本类方法

一个类中存在普通方法和构造方法,this调用本类方法时,对应的语法不同:

1)调用本类中的其他方法:this.方法()

一个类中可能存在很多方法,这些方法之间可以直接进行调用,但是不够标准,应用this.方法()调用,标准化风格。

2)调用本类其他构造方法:this()

一个类中可以有多个方法,且可以重载,并且构造方法在实例化对象时只能被调用一次。

若现在需求:Person类中中有三个构造方法,无论调用哪个构造方法,都要求执行语句"**********"。

【举例】:原始实现方式


  
  1. class Person{
  2. String name;
  3. int age;
  4. public Person(){
  5. System.out.println("********");
  6. }
  7. public Person(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. System.out.println("********");
  11. }
  12. }

程序设计的一个重要原则,避免重复代码。按照这个原则,以上的代码并不符合开发要求,这时可以使用this()形式实现,调用本类无参构造。


  
  1. class Person{
  2. String name;
  3. int age;
  4. public Person(){
  5. System.out.println("********");
  6. }
  7. public Person(String name) {
  8. this();
  9. this.name = name;
  10. }
  11. public Person(String name, int age) {
  12. this(name);
  13. this.name = name;
  14. this.age = age;
  15. }
  16. }

需要注意的是,this()形式只能放在构造方法的首行。在使用this()调用本类其他构造方法时,应该避免循环调用。

下面通过实例说明构造方法互调的意义所在。

【举例】:写一个雇员的信息类,类中提供如下四个属性:姓名、职位、部门、工资,还有4个构造方法:

  • 无参构造:姓名未知、职位待定、部门后勤、工资为0;
  • 单参构造(姓名):职位主管、部门技术部、工资10;
  • 双参构造(姓名、部门):职位工程师、工资5;
  • 四参构造。

针对以上要求可以有两种代码实现方法:

第一种:传统实现


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Emp emp = new Emp();
  4. System.out.println(emp.getInfo());
  5. }
  6. class Emp{
  7. private String name;
  8. private String job;
  9. private String dept;
  10. private double sal;
  11. public Emp(){
  12. this.name ="未知";
  13. this.job = "待定";
  14. this.dept = "后勤";
  15. this.sal = 0.0;
  16. }
  17. public Emp(String name){
  18. this.name =name;
  19. this.job = "主管";
  20. this.dept = "技术部";
  21. this.sal = 10.0;
  22. }
  23. public Emp(String name,String dept){
  24. this.name =name;
  25. this.job = "工程师";
  26. this.dept = dept;
  27. this.sal = 5.0;
  28. }
  29. public Emp(String name,String job, String dept, double sal){
  30. this.name =name;
  31. this.job =job;
  32. this.dept = dept;
  33. this.sal = sal;
  34. }
  35. public String getInfo(){
  36. return "姓名:"+this.name+"职位:"+this.job+"部门:"+this.dept+"工资:"+this.sal;
  37. }
  38. }

以上程序重复的代码太多,过于冗余。

第二种:使用this改进


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Emp emp = new Emp();
  4. System.out.println(emp.getInfo());
  5. }
  6. class Emp{
  7. private String name;
  8. private String job;
  9. private String dept;
  10. private double sal;
  11. public Emp(){
  12. this("未知","待定","后勤",0.0);
  13. }
  14. public Emp(String name){
  15. this(name,"主管","技术部",10.0);
  16. }
  17. public Emp(String name,String dept){
  18. this(name,"工程师",dept,5.0);
  19. }
  20. public Emp(String name,String job, String dept, double sal){
  21. this.name =name;
  22. this.job =job;
  23. this.dept = dept;
  24. this.sal = sal;
  25. }
  26. public String getInfo(){
  27. return "姓名:"+this.name+"职位:"+this.job+"部门:"+this.dept+"工资:"+this.sal;
  28. }
  29. }

以上代码消除了很多重复代码,实际开发中应用较多。

3、表示当前对象

一个类,可以生成若干个对象,每个对象都可调用类中的方法,类中实际上很难描述某一个具体的对象,为了能区分出当前正在操作类中的方法是哪一个,可以使用this完成。

【举例】:观察


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Person perA = new Person();
  4. Person perB = new Person();
  5. System.out.println("MainActivity类中对象输出:"+perA);
  6. System.out.println("MainActivity类中对象输出:"+perB);
  7. }
  8. class Person{
  9. }


  
  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. Person perA = new Person();
  4. Person perB = new Person();
  5. System.out.println("MainActivity类中对象输出:"+perA);
  6. perA.print();
  7. System.out.println("--------------------------------");
  8. System.out.println("MainActivity类中对象输出:"+perB);
  9. perB.print();
  10. }
  11. class Person{
  12. void print(){
  13. System.out.println("Person类中的输出,this="+this);
  14. }
  15. }

由以上可知,由perA调用print()方法时,this=perA,由perB调用print()方法时,this=perB, 所以,this的对象引用会随着调用类方法对象的不同而不同,属于相对性的概念。

进一步考虑,this.属性表示的就是当前对象中的属性。

 

作于202004051735,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/105281371

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。