浅谈this和static

Posted liupiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈this和static相关的知识,希望对你有一定的参考价值。

一.this关键字

一个比较经典的使用:

技术分享图片

输出的结果是:12

1.this关键字只能在方法的内部使用,表示对“调用方法的那个对象”的引用,this的用法和其他对象引用并无不同。注意一点:在方法的内部调用同一个类的其他方法,不必使用this,直接调用即可。

2.当需要返回当前对象的引用的时候,可以借助this。

3.当方法的形参与成员变量重名的时候,可以用this区分

 技术分享图片

从两次显示的结果不同可以知道,当形参和成员变量重名的时候,如果不用this加以区分,虚拟机也无法区分方法中的i到底是指向成员变量还是形参,不过这里有一个原则,当无法确定的时候,取离参数最近的声明,即就近声明原则。

4.使用this,在构造器中调用构造器

 技术分享图片

注意:除构造器之外,编译器禁止在任何其他方法中调用构造器。

二.static关键字

在java中并不存在全局变量的概念,static修饰的变量可以看做是一个伪全局的概念,static表示“全局”或者“静态”的意思,常用用法有如下三种:

1.修饰变量

static修饰的变量,通常我们称之为静态变量,未用static修饰的变量称为实例变量,两者的区别是:静态变量是类的公用变量,在类加载的是时候初始化,并且仅初始化一次,对类的所有对象来说,static成员变量只有一份,对象之间借助静态变量可进行数据共享。实例变量则伴随着对象的实例化,每创建一个对象就会产生一个实例变量,同一个类的不同对象的实例变量的值可能不同。static成员变量的初始化顺序按照定义的顺序进行初始化。

2.修饰方法

static修饰的方法,一般称为静态方法,静态方法不依赖于任何对象就能进行访问,通过类名可以直接访问静态方法和静态变量。静态方法中不能使用thi关键字,同样静态方法中不能访问非静态成员变量和非静态成员方法,但是在非静态成员方法中可以访问静态变量和静态方法。因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

3.修饰代码块

static关键字还能修饰代码块,用来形成静态块以优化程序的性能。static块可以出现在类中的任何地方(除了方法内部,任何方法),类中可以有多个静态块,在类加载的时候,会按照static块的顺序来执行每个static块,并且只执行一次。

static关键字常见误区:

static关键能改变类中成员变量的访问权限?答案是不能,Java中的static关键字不会影响到变量或者方法的作用域,在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字

技术分享图片

static能修饰局部变量?不能,java语法规定,static是不允许用来修饰局部变量。

技术分享图片

static方法中能使用this?不能,很明显,在静态方法中不能使用this关键字,静态方法可以通过类访问,当通过类访问的时候,this指向的对象也许还未产生。

技术分享图片

this能访问静态变量?是可以的,静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

技术分享图片

静态块可以出现在类的任何地方?答案是不能,在方法内部,在任何方法内部都不行。

技术分享图片

以上是关于浅谈this和static的主要内容,如果未能解决你的问题,请参考以下文章

this浅谈

浅谈js中this指向问题

浅谈js中的this,call,apply

浅谈js的this指向问题

浅谈JavaScript的apply和call语句

浅谈this指向问题