第6章 面向对象基本特征

117 篇文章 0 订阅
116 篇文章 0 订阅

6.3 this关键字和对象关系

6.3.1 this关键字含义

1. this代表什么

    this代表对象, 代表的是当前对象, this里保存的是对象的地址.

谁是当前对象? 比如方法调用

t1.say() 在这个方法执行时

执行以下代码 :

public String say() {

       return "姓名:" + name + ",年龄:" + age + ",性别:" + gender;

}

这段代码可以写成

public String say() {

       return "姓名:" + this.name + ",年龄:" + this.age + ",性别:" + this.gender;

}

效果是一样的, 当前对象是哪个对象呢? 就是调用这个方法的对象, t1.say()中的t1就是当前对象,显然这个当前对象在变化, 因为t2.say()调用时,this就是指的是t2了.

 

2.为什么使用this

this强调了使用当前对象, 有的时候属性如果和方法中的局部变量重名时, 为了区别必须使用this,在构造器重载时, 调用别的构造器也需要使用this. 两者的语法不一样.

 

 

public class Teacher {

      

       private String name;

       private int age = 30;

       private String gender = "女";

      

       public Teacher() { // 无参构造器

              this("佟刚", 35, "女"); // 调用其他构造器

       }

      

       public Teacher(String name, int age, String gender) {

              this.name = name; // this表示对象, 右侧的name是形参, 是局部变量

              this.age = age;

              this.gender = gender;

       }

      

       public void setName(String name) {

              this.name = name;

       }

      

       public String getName() {

              return this.name; // 加上this也可以, 但是没有必须, 它暗含了this

       }

      

       public void setAge(int age) {

              this.age = age;

       }

      

       public int getAge() {

              return age;

       }

      

       public void setGender(String gender) {

              this.gender = gender;

       }

      

       public String getGender() {

              return gender;

       }

      

       public String say() {

              return "姓名:" + this.name + ",年龄:" + this.age + ",性别:" + this.gender;

       }

}

 

3.使用this的优点

1.    使用this可以提高代码的可读性, 强调要使用的是当前对象.

2.    在方法中, 如果局部变量和属性重名, 必须使用this, 用以区分属性和局部变量, 并且这样局部变量的含义也更清晰.

3.    this(…)调用可以简化构造器调用, 并有利于维护. 如果有修改的需要, 只要修改被调用的构造器就可以了.

 

6.3.2 对象的传递

1. 为什么要传递对象

在有些方法中, 功能的完成除了需要一些基本数据外, 还需要复杂类型, 比如在Teacher类中方法

public void lesson() {

    // 老师上课的代码, 老师上课时, 需要一台电脑, 这时就可以通过参数传递一个电脑对象

}

 

修改为

public void lesson(Computer computer) {

// 老师上课的代码, 老师上课时, 需要一台电脑, 这时就可以通过参数传递一个电脑对象

// 这样在老师上课的代码中, 就可以直接使用传入的Computer对象.

}

 

2.对象如何传递

在方法调用时, 由调用者传实参时,负责把对象传给方法.

public class Computer {

      

       private double cpu;

       private int memory;

      

       public Computer() {}

      

       public Computer(double cpu, int memory) {

              this.cpu = cpu;

              this.memory = memory;

       }

      

       public void setCpu(double cpu) {

              this.cpu = cpu;

       }

      

       public double getCpu() {

              return cpu;

       }

      

       public void setMemory(int memory) {

              this.memory = memory;

       }

      

       public int getMemory() {

              return memory;

       }

      

       public String say() {

              return "CPU:" + cpu + "GHz, 内存:" + memory + "G";

       }

      

}

 

public class Teacher {

      

       private String name;

       private int age = 30;

       private String gender = "女";

      

       public Teacher() { // 无参构造器

              this("佟刚", 35, "女");  

       }

      

       public Teacher(String name, int age, String gender) {

              this.name = name;

              this.age = age;

              this.gender = gender;

       }

      

       public void setName(String name) {

              this.name = name;

       }

      

       public String getName() {

              return name;

       }

      

       public void setAge(int age) {

              this.age = age;

       }

      

       public int getAge() {

              return age;

       }

      

       public void setGender(String gender) {

              this.gender = gender;

       }

      

       public String getGender() {

              return gender;

       }

      

       public void lesson(Computer com) { // 这个方法应该需要一台电脑才能上课

              System.out.println("[" + this.name + "] 老师使用电脑[" + com.say() + "]在上课");

       }

      

       public String say() {

              return "姓名:" + this.name + ",年龄:" + this.age + ",性别:" + this.gender;

       }

}

 

public class TeacherTest {

      

       public static void main(String[] args) {

              Teacher t = new Teacher("李四", 25, "女");

              Computer com = new Computer(3.5, 4); // 要传递的对象先创建好

              t.lesson(com); // 通过实参传递对象

        // 以上代码打印输出为”[李四] 老师使用电脑[CPU:3.5GHz,内存:4G]在上课"

       }

      

}

 

3.传递的是什么

在方法调用中的实参com是在main方法中声明的引用变量, 但是这个引用指向了在main中创建的新的Computer对象, 所以在lesson方法执行时, 接收到的是对象的引用, 通过引用使用了对象.

4.对象传递的优点

即使对象很大, 属性很多, 在对象传递时, 并不是把对象本身复制了一份, 而是只把对象的引用传递了, 优点就是速度快.

5.对象传递的危险性

危险性就在于因为传递了对象的引用, 这样通过引用一方面可以读取对象的属性或调用对象的方法, 同时如果通过引用直接修改对象的属性, 也会导致对象属性的变化, 所以当把对象传递给方法时, 如果在方法内部有对于对象的修改操作, 对于调用者来说, 这个修改也是同步的.

 

public class Teacher {

 

private String name;

 

public void lesson(Computer com) { // 这个方法应该需要一台电脑才能上课

              System.out.println("[" + this.name + "] 老师使用电脑[" + com.say() + "]在上课");

        com.setMemory(8);

       }

 

}

 

public class TeacherTest {

      

       public static void main(String[] args) {

              Teacher t = new Teacher();

              Computer com = new Computer(3.5, 4); // 要传递的对象先创建好

              t.lesson(com); // 通过实参传递对象

       

        System.out.println(com.getMemory()); // 输出的不是原来的4而是在方法中被修改后的8

       }

      

}

 

6.3.3 对象关联

1. 什么是对象关联

   对象关联就是一个对象关联了另外一个对象, 前者拥有了后者, 是一种包含关系.

2. 为什么要关联对象

public void lesson(Computer com) { // 这个方法应该需要一台电脑才能上课

              System.out.println("[" + this.name + "] 老师使用电脑[" + com.say() + "]在上课");

       }

 

这个方法中老师对象要想上课, 需要通过参数传入一个对象. 方法结束后, 这个对象对于老师对象来说就会消失, 显然老师对象最好是应该完全拥有一个电脑对象, 这样再执行上课方法时,就不需要再传入对象, 而是使用自己拥有的对象, 甚至还可以再添加一些别的方法使用此对象.

 

3. 如何关联对象

  在当前类中把要关联的对象作为属性即可.

  也可以在构造器中添加参数为关联的对象赋值, 也可以添加对应的get/set方法,用以处理这个关联的对象

 

先写被关联的类

public class Computer {

      

       private double cpu;

       private int memory;

      

       public Computer() {}

      

       public Computer(double cpu, int memory) {

              this.cpu = cpu;

              this.memory = memory;

       }

      

       public void setCpu(double cpu) {

              this.cpu = cpu;

       }

      

       public double getCpu() {

              return cpu;

       }

      

       public void setMemory(int memory) {

              this.memory = memory;

       }

      

       public int getMemory() {

              return memory;

       }

      

       public String say() {

              return "CPU:" + cpu + "GHz, 内存:" + memory + "G";

       }

      

}

 

 

在Teacher类中关联Computer类的对象

 

public class Teacher {

      

       private String name;

       private int age = 30;

       private String gender = "女";

    // 对象关联, 把被关联的对象声明成属性

    private Computer computer;

      

    // 可以通过构造器完成对关联对象的初始化

       public Teacher(String name, int age, String gender, Computer computer) {

              this.name = name;

              this.age = age;

              this.gender = gender;

        this.computer = computer;

       }

 

// 同时应该再提供相应的get/set方法

public void setComputer(Computer computer) {

    this.computer = computer;

}

 

public Computer getComputer() {

    return computer;

}

      

       public void setName(String name) {

              this.name = name;

       }

      

       public String getName() {

              return name;

       }

      

       public void setAge(int age) {

              this.age = age;

       }

      

       public int getAge() {

              return age;

       }

      

       public void setGender(String gender) {

              this.gender = gender;

       }

      

       public String getGender() {

              return gender;

       }

      

    // 在上课方法中, 不必再在每次调用时传参了.

       public void lesson() {

              System.out.println("[" + this.name + "] 老师使用电脑[" + computer.say() + "]在上课");

       }

      

       public String say() {

              return "姓名:" + this.name + ",年龄:" + this.age + ",性别:" + this.gender;

       }

}

 

public class TeacherTest {

      

       public static void main(String[] args) {

Computer com = new Computer(3.5, 4); // 要关联的对象先创建好

              Teacher t = new Teacher("李四", 25, "女", com); // 通过构造器完成对象关联

              t.lesson(); // 通过实参传递对象

        // 以上代码打印输出为”[李四] 老师使用电脑[CPU:3.5GHz,内存:4G]在上课"

       }

      

}

 

4. 对象关联的作用

   对象关联的作用非常广泛, 当一个类完成某种功能时, 有的时候如果有现成的其他对象可以直接使用, 并且在本类中要多次多方法中使用同一个功能时, 对象关联更显得必要. 这样使得对象之间的关系更加紧密.

 

6.3.4 javabean

  1. JavaBean是一种Java语言写成的可重用组件。
  2. 所谓javaBean,是指符合如下标准的Java类:
    • 类是公共的
    • 有一个无参的公共的构造器
    • 有属性,且有对应的get、set方法
    • 用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。

 

public class TestJavaBean{

       private String name;  //属性一般定义为private

       private int age;

       public  TestJavaBean(){}

       public int getAge(){

            return age;

       }

       public void setAge(int age){

            this.age = age;

       }

       public String getName(){

           return name;

       }

       public void setName(String name){

           this.name = name;

       }

}

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值