重学Java(014)—— Java基础知识(封装的优化:this关键字、构造方法;定义一个标准的类:Java Bean)

一、this关键字

我们在setter方法中定义的形参的名称,常常不能达到有特定含义的效果,也就是“见名知意”,那么我们将其修改为与成员变量一致的名字,就可以达到“见名知意”的效果。但此时又产生了新的问题:成员变量的值无法传递了。也就是说,在修改了 setXxx() 的形参变量名后,方法并没有给成员变量赋值。这是因为当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。此时,我们需要使用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;
	}
}

举个例子:写一个sayHello方法,输出两个人打招呼的语句。

先写一个Person类,定义成员变量name;定义方法sayHello,设置形参name,输出打招呼的语句:

public class Person {

    String name; //我自己的名字

    //成员变量name是自己的名字
    //局部变量(形参)是对方的名字
    public void sayHello(String name) {
        System.out.println(name + ",你好。我是" + this.name); //此处用到了this关键字
    	//this就是下面创建的对象,可以访问到成员变量中的name
    }

}

然后通过一个对象来给成员变量和形参赋值,并调用sayHello方法:

public class Demo01Person {

    public static void main(String[] args) {
        Person person = new Person();
        //设置我自己的名字
        person.name = "nxy";
        person.sayHello("rxz");
    }

}

二、构造方法

当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。当我们通过关键字new来创建对象时,其实就是在调用构造方法。

无论你与否自定义构造方法,所有的类都有构造方法,因为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. 构造方法不要写返回值类型,连void都不写
  3. 构造方法不能return一个具体的返回值
  4. 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体,什么事情都不做。
    public Student() {}
  5. 一旦编写了至少一个构造方法,那么编译器将不再赠送。
  6. 构造方法也是可以重载的。
    重载:方法名称相同,参数列表不同。

在一个类中,就算是定义了全参构造方法,也仍然需要setter/getter方法,代码如下:

public class Student {

    //成员变量
    private String name;
    private int age;

    //无参数的构造方法
    public Student() {
        System.out.println("无参构造方法执行了!");
    }

    //有参数的构造方法
    public Student(String name, int age){
        System.out.println("全参构造方法执行了!");
        this.name = name;
        this.age = age;
    }

    //成员变量的setter/getter方法
    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;
    }

}

如果定义了全参构造方法,那么对象在访问成员变量时不需要setXxx()方法,可以直接通过调用getXxx()方法来访问,但是如果需要改变对象当中的成员变量数据内容,仍然还需要setXxx()方法。代码示例如下:

public class Demo02Student {

    public static void main(String[] args) {
        Student stu1 = new Student(); //无参构造
        System.out.println("----------------");
        Student stu2 = new Student("nxy",20); //全参构造

        System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
        //如果需要改变对象当中的成员变量数据内容,仍然还需要setXxx方法
        stu2.setAge(21);
        System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
    }

}

三、定义一个标准的类

一个标准的类通常要拥有下面四个部分:

  1. 所有成员变量都要使用private关键字修饰
  2. 为每一个成员变量编写一对儿Getter/Setter方法
  3. 编写一个无参数的构造方法
  4. 编写一个全参数的构造方法

这样的标准类也叫做Java Bean

在 IntelliJ IDEA 当中我们可以使用软件自带的功能来自动填入代码,步骤如下:

首先我们写好一个类,并定义成员方法:

public class Student {

    private String name; //姓名
    private int age; //年龄
}

然后我们依次点击上方菜单栏中的Code —> Generate,也可以使用快捷键Alt + Insert
在这里插入图片描述
点击之后,会出现如下所示的界面:
在这里插入图片描述
我们先将鼠标光标移到合适的位置,再点击其中的Getter and Setter即可完成Getter/Setter方法的自动填入。接下来我们再次将鼠标光标移到合适的位置,然后点击其中的Constructor,会出现如图所示的界面:
在这里插入图片描述
我们先点击下方的Select None,来填入无参构造方法的代码;然后按住Shift键,将成员变量都选中,接着点击OK,即可完成全参构造方法的代码的自动填入。

完整代码示例如下:

public class Student {

    private String name; //姓名
    private int age; //年龄

    public Student() {
    }

    public Student(String name, int age) {
        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;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值