六. this关键字
在方法调用、参数传递过程中,极有可能出现参数名称与实例变量名同时的情况。在一个方法内,可以定义和成员变量同名的局部变量或参数,此时成员变量被屏蔽。
参考例子:Student.java。
作用1:区别成员变量和局部变量
public class Student{
private String name;
public void setName(String name){
this.name = name;
System.out.print(name);
String name;
name = "tom";
}
}
作用2:
public class Student{
private String name;
public void setName(String name){
this.name = name;
}
public void print(){
//表示调用当前类中的setName方法
this.setName("tom");
//setName("tom");
//在类中可以表示当前类的对象
System.out.println("this:"+this);
}
public static void main(String[] args){
Student s = new Student();
s.setName("tom");
System.out.println("s:"+s);
}
}
作用3: 在类的构造器中用this关键字可以调用类的其他的构造器
1.this只能出现在构造函数代码块中的第一句(前提是this这个时候代表的是调用其他构造器)
2.由this调用的构造器不会再创建新的对象
例如:
public class Car{
private String name;
private double price;
public Car(){
//无参构造器中调用了一个参数的构造器
this("tom");
}
public Car(String name){
//一个参数的构造器中调用了俩个参数的构造器
this(name,100000);
}
public Car(String name,double price){
this.name = name;
this.price = price;
}
}
七.构造方法
(构造器/构造函数/构造方法)
1. 定义:
. 构造方法的名字和类的名字相同
. 没有返回类型,有返回类型的构造器就变成了普通方法。
2. 调用时刻:
在创建对象的时候调用;
注意:是先创建对象,然后初始化对象中的属性值,最后在调用构造器
3. 作用:
可以让我们在创建对象的时候做一些对象中数据的初始化工作.(因为在new的后面就是写的构造器)
new Student();
new Student("tom",age);
4. 构造方法的调用:
构造方法只能通过以下方式被调用:
. 当前类的其他构造方法通过this语句调用它;
. 当前类的子类的构造方法通过super语句调用它;
. 在程序中通过new语句调用它;
八.默认的构造方法
构造方法可分为两种:
1) 隐含的默认构造方法(无参构造器);
2) 程序显示定义的构造方法;
在Java语言中,每个类至少有一个构造方法。为了保证这一点,如果用户定义类中没有提供任何构造方法,那么在运行的时候JVM将自动提供一个隐含的默认构造方法。该构造方法没有参数,用public修饰,而且方法体为空,格式如下:
public ClassName(){} //隐含的默认构造方法
在程序中也可以显示地定义默认构造方法。
如果类中显式定义了一个或多个构造方法,那么Java语言便不再分配隐含的默认构造方法。举例:
public class Sample{
public Sample(int a) {
System.out.println("My Constructor");
}
}
创建Sample类对象的语句:
Sample s1 = new Sample(); //编译出错
Sample s2 = new Sample(1); //合法的
九.创建和初始化对象
按照前面讲述的定义类的形式、定义方法的形式,构建好类了之后,程序要真实的运行,还是得通过对象的交互来完成。
创建好了类,只是创建了构建对象的模板。接下来,我们可以通过new操作符,快速地构建出对象。使用new有以下作用有以下几步:
1.为对象分配内存空间,将对象的实例变量自动初始化默认值;
2.如实例变量显示初始化,将初始化值赋给实例变量(把默认值覆盖掉);
3.调用构造方法;
4.返回对象的地址值;
(注意:之后我们会把这个步骤再细分)
十.构造方法重载
当通过new语句创建一个对象时,在不同的条件下,对象可能会有不同的初始化行为。
例如对于公司新来的一个雇员,在一开始的时侯,有可能他的姓名和年龄是未知的,也有可能仅仅他的姓名是已知的,也
有可能姓名和年龄都是已知的。如果姓名是未知的,就暂且把姓名设为“无名氏”,如果年龄是未知的,就暂且把年龄设为-1.
可通过重载构造方法来表达对象的多种初始化行为。在一个类的多个构造方法中,可能会出现一些重复操作。
为了 提高代码的可重用性,Java语言允许在一个构造方法中,用this语句来调用另一个构造方法。
使用this语句来调用其他构造方法时,必须遵守以下语法规则:
1.假如在一个构造方法中使用了this语句,那么它必须作为构造方法的第一条要执行的语句(不考虑注释语句)。
public Employee() {
String name="无名氏";
this(name); //编译错误,this语句必须作为第一条语句
}
public Employee(String name) {
String name=name;
}
2.只能在一个构造方法中用this语句来调用类的其他构造方法,
而不能在实例方法中用this语句来调用类的其他构造方法;
3.只能用this语句来调用其他构造方法,而不能通过方法名来直接调用构造方法。
public Employee() {
Employee(name); //编译错误,要使用this关键字来调用
String name="无名氏";
}
public Employee(String name) {
String name=name;
}