this关键字:
Person p1 = new Person("张三",20,65);
Person p2 = new Person(10,54);
p1.introduce();
p2.introduce();
这里我们创建了两个对象,且均调用了其方法。但是如何知道它是被p1还是p2调用的呢?
其底层原理是编译器暗自把“所操作对象的引用”作为第一个参数传递给了introduce(),其内部表现形式为:
Person.introduce(p1)
person.introduce(p2)
我们也许会发现这样的形式会更有利于我们理解代码实际发生的事,但我们并不能这样子写代码。
故Java中显式引入了this关键字来获得当前对象的引用。
有些人执意将this放在每一个方法调用和字段引用前,认为这样“更清楚更明确”。但是,千万别这么做。我们使用高级语言的原因之一就是它们能帮我们做一些事情。要是你把this放在一些没必要的地方,就会使读你程序的人不知所措,因为别人写的代码不会到处使用this。人们期望只在必要处使用this。遵循一种一致而直观的编程风格能节省时间和金钱。
public class Draft_08 {
public static void main(String[] args) {
Person p1 = new Person("张三",20,65);
Person p2 = new Person(10,54);
p1.introduce();
p2.introduce();
}
}
class Person{
public String name;
public int age;
public double height;
public Person(String name){
this.name = name;
}
public Person(int age,double height){
this("李四"); //调用(String name)构造方法
//!this(20); this不能调用两次构造,
this.age=age;
this.height=height;
}
public Person(String name,int age,double height){
this.name = name;
this.age=age;
//!this("李四"); this构造只能放在第一行
this.height=height;
}
public void greet(){
//!this("赵六"); //this构造器不能用于方法中
System.out.println("大家好");
}
public void introduce(){
greet(); //其实这里可以用 this.greet()但是这样是无益反而有害的。
System.out.println("我叫"+name+",今年"+age+"岁,体重"+height);
}
}
结果为:
总结
this关键字作用于我们想在方法内部获取当前对象自身引用的时候,只能用在方法内部使用,表示对“调用方法的那个对象的引用”。
从上我们得知this引用可用于成员变量,成员方法,构造器。但是下面还有一些细节我们需要知道
1.this仅能在一个构造器内调用唯一一次外构造器,且必须将其置于最起始处,否则编译器会报错
public Person(int age,double height){
this("李四"); //调用(String name)构造方法
//!this(20); this不能调用两次构造,
this.age=age;
this.height=height;
}
public Person(String name,int age,double height){
this.name = name;
this.age=age;
//!this("李四"); this构造只能放在第一行
this.height=height;
}
2.除构造器外,编译器禁止在其他任何方法中调用构造器。
public void greet(){
//!this("赵六"); //this构造器不能用于方法中
System.out.println("大家好");
}
了解this关键字之后,就能更全面地理解static(静态)方法的含义。static方法就是没有thi的方法。有些人认为static方法不是“面向对象”的,因为它们的确具有全局函数的语义;使用static方法时,由于不存在this,所以不是“向对象发送消息”的方式来完成的
static关键字
在static方法的内部不能调用非静态方法(下面将进行解释),反过来倒是可以的。而且可以在没有创意任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。它很像全局方法。Java中禁止使用全局方法,但你在类中置入static方法就可以访问其他static方法和static域。
解释:这是完全不可能。如果你传递一个对象的引用到静态方法里(静态方法可以创建其自身的对象),然后通过这个引用(和this效果相同),你就可以调用非静态方法和访问非静态数据成员了。但通常要达到这样的效果。你只需写一个非静态方法即可,而不必如此大费周章。