Java—深入解析this,static关键字

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效果相同),你就可以调用非静态方法和访问非静态数据成员了。但通常要达到这样的效果。你只需写一个非静态方法即可,而不必如此大费周章。


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥抱白熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值