this关键字的作用与构造方法
封装优化1——this关键字
我们发现 setXxx 方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意
了呢?代码如下:
public class Student { private String name; private int age; public void setName(String name) { name = name; } public void setAge(int age) { age = age; } }
经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了 setXxx() 的形参变量名后,方
法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无
法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题。
this的含义
this代表所在类的当前对象的引用(地址值),即对象自己的引用。
记住 :方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。
this使用格式
this.成员变量名;
使用 this 修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:
public class Student { private String name; private int age; public void setName(String name) { //name = name; this.name = name; }public String getName() { return name; }public void setAge(int age) { //age = age; this.age = age; }public int getAge() { return age; } }
封装优化2——构造方法
当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。
小贴士:无论你与否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法,
一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效
构造方法的定义格式
修饰符 构造方法名(参数列表){ // 方法体 }
构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。使用
构造方法后,代码如下:
public class Student { private String name; private int age; // 无参数构造方法 public Student() { } // 有参数构造方法 public Student(String name,int age) { this.name = name; this.age = age; } }
注意事项
1. 如果你不提供构造方法,系统会给出无参数构造方法。
2. 如果你提供了构造方法,系统将不再提供无参数构造方法。
3. 构造方法是可以重载的,既可以定义参数,也可以不定义参数。
Studnet类
/* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对家时,其实就是在调用构造方法。 格式: public 类名称(参数类型参数名称){ 方法体 } 注意事项: 1.构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样 2.构造方法不要写返回值类型,连void都不写 3.构造方法不能return—个具体的返回值 4.如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体什么事情都不做。public Student() 5.一旦编写了至少一个构造方法,那么编译器将不再赠送 6. 构造方法是可以进行重载的 重载:方法名称相同,参数列表不同 */ public class Studnet { private String name; private int age; public Studnet(){ System.out.println("无参构造方法执行啦 "); } public Studnet(String name, int age) { System.out.println("全参构造方法执行啦 "); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
StudentDemo01类
public class StudentDemo01 { public static void main(String[] args) { Studnet studnet = new Studnet(); System.out.println("****************"); Studnet stu2 = new Studnet("赵丽颖",20); System.out.println("姓名"+stu2.getName()+",年龄:"+stu2.getAge()); stu2.setAge(21); System.out.println("姓名"+stu2.getName()+",年龄:"+stu2.getAge()); } }