1.this关键字
1.1 this 调用本类属性
观察下列代码:
class Person {
private String name;
private Integer age;
public Person(String name, int age){
name = name;
age = age;
}
public String getPersonInfo(){
return "姓名:" + name + "年龄:" + age;
}
}
public class Test{
public static void main(String[] args) {
Person per = new Person("张三",20);
System.out.println(per.getPersonInfo());
}
}
运行结果如下:
我们可以发现:当参数与类属性同名时,类中属性无法被正确赋值。此时就需要加上this关键字来正确的给对象属性赋值。
this.name = name;
this.age = age;
只要在类中方法访问类中属性,一定要加上this关键字。
1.2 this调用本类方法
this调用本类方法有一下俩种情况:
- 调用普通方法:this.方法名称(参数)
- 调用构造方法:this(参数)
eg:
this调用普通方法:
class Person {
private String name;
private Integer age;
public Person(String name, int age){
this.name = name;
this.age = age;
this.print();
}
public String getPersonInfo(){
return "姓名:" + name + "年龄:" + age;
}
public void print(){
System.out.println("***************");
}
}
public class Test{
public static void main(String[] args) {
Person per = new Person("张三",20);
System.out.println(per.getPersonInfo());
}
}
在Java中支持构造方法的相互调用(this)
class Person {
private String name;
private Integer age;
public Person(){
System.out.println("*********产生一个新的Person对象*********");
}
public Person(String name){
this();
}
public Person(String name, int age){
this(name);
}
public String getPersonInfo(){
return "姓名:" + name + "年龄:" + age;
}
}
public class Test{
public static void main(String[] args) {
Person per1 = new Person();
Person per2 = new Person("张三");
Person per3 = new Person("李四",20);
System.out.println(per1.getPersonInfo());
System.out.println(per2.getPersonInfo());
System.out.println(per3.getPersonInfo());
}
}
使用this调用构造方法时还要注意:
- this调用构造方法 的语句必须在构造方法的首行。
- 使用this调用构造方法时,一定要留有出口(不能成环)。
1.3 this 表示当前对象
eg:
通过观察这段代码,我们可以发现this 与代码中的p1指向同一块地址。
结论:只要对象调用了本类中的方法,这个this就表示当前执行的对象。
2. static 关键字
2.1 static 类属性(只需在属性前添加static关键字)
static描述的属性称为共享属性,也称为类属性,保存在全局数据区的内存之中,所有对象都可以进行该数据区得访问。
重点:
- 访问static属性(类属性)应使用类名称.属性名
eg:Person.country = "中国";
- 所有的非static属性(实例变量)必须在对象实例化后使用,而static属性不受对象实例化的控制。
定义类时,如何选择实例变量和类属性呢?
- 在定义类时,99%的情况都不会考虑static属性,以非static属性为主。
- 如果需要描述共享属性的概念,或者不受对象实例化控制时使用static。
2.2 static类方法
class Person {
private static String country;
private String name;
private Integer age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public static void setCountry(String c) {
country = c;
}
public void getPersonInfo() {
System.out.println("姓名:" + this.name + "年龄:" + this.age + "国家:" + this.country);
}
}
public class Test{
public static void main(String[] args) {
Person.setCountry("中国");
Person person = new Person("李四",20);
person.getPersonInfo();
}
}
关于static方法的俩点说明:
- 所有的static方法不允许调用非static 定义的属性或方法。
- 所有的非static 方法允许访问static方法或属性。
使用static 定义方法只有一个目的:某些代码不希望受到对象的控制,即可以在没有实例化对象的时候执行。(广泛存在于工具类中)