java:在java中为啥静态变量没有this引用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java:在java中为啥静态变量没有this引用?相关的知识,希望对你有一定的参考价值。

java:在java中为什么静态变量没有this引用?能否详细说一说this用法?

this指当前对象的实例。而静态变量无需实例化就可以构建,使用。而且无论是否有实例,有多少个实例,静态对象都指向同一个。所以不会有this的引用。
不仅如此。在静态方法中也不能使用this。
有一个理解方式。所有非静态函数都有一个隐藏的参数,this,把对象传了过去。静态方法没有这个隐藏参数,所以不能用this。
参考技术A 1、静态变量是可以用this引用的,这个在Java语法上应该是没有错的。如果你的静态变量不能引用,可以看看是不是访问权限的问题。如果是在类内部的方法中,是可以的。
2、由于静态变量是属于整个类的,所有类实例共享的。在虚拟机加载类的时候就已经分配了内存空间和初始值。所以,不建议用this变量去访问,因为this是类的一个实例变量,用类名去访问静态变量更加直观的表示出静态变量是整个类的。
参考技术B 1.
this是指当前对象自己。
当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用。如下面这个例子中:
public
class
Hello

String
s
=
"Hello";
public
Hello(String
s)

System.out.println("s
=
"
+
s);
System.out.println("1
->
this.s
=
"
+
this.s);
this.s
=
s;
System.out.println("2
->
this.s
=
"
+
this.s);

public
static
void
main(String[]
args)

Hello
x=new
Hello("HelloWorld!");


运行结果:
s
=
HelloWorld!
1
->
this.s
=
Hello
2
->
this.s
=
HelloWorld!
在这个例子中,构造函数Hello中,参数s与类Hello的变量s同名,这时如果直接对s进行操作则是对参数s进行操作。若要对类Hello的成员变量s进行操作就应该用this进行引用。运行结果的第一行就是直接对构造函数中传递过来的参数s进行打印结果;
第二行是对成员变量s的打印;第三行是先对成员变量s赋传过来的参数s值后再打印,所以结果是HelloWorld!
2.
把this作为参数传递
当你要把自己作为参数传递给别的对象时,也可以用this。如:
public
class
A

public
A()

new
B(this).print();

public
void
print()

System.out.println("Hello
from
A!");


public
class
B

A
a;
public
B(A
a)

this.a
=
a;

public
void
print()

a.print();
System.out.println("Hello
from
B!");


运行结果:
Hello
from
A!
Hello
from
B!
在这个例子中,对象A的构造函数中,用new
B(this)把对象A自己作为参数传递给了对象B的构造函数。
3.
注意匿名类和内部类中的中的this。
有时候,我们会用到一些内部类和匿名类,如事件处理。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如下面这个例子:
public
class
A

int
i
=
1;
public
A()

Thread
thread
=
new
Thread()

public
void
run()

for(;;)

A.this.run();
try

sleep(1000);

catch(InterruptedException
ie)




;
//注意这里有;
thread.start();

public
void
run()

System.out.println("i
=
"
+
i);
i++;

public
static
void
main(String[]
args)
throws
Exception

new
A();


在上面这个例子中,
thread
是一个匿名类对象,在它的定义中,它的
run
函数里用到了外部类的
run
函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的
run
函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上
this
引用来说明要调用的是外部类的方法
run。
4。在构造函数中,通过this可以调用同一class中别的构造函数,如
public
class
Flower
Flower
(int
petals)
Flower(String
ss)
Flower(int
petals,
Sting
ss)
//petals++;调用另一个构造函数的语句必须在最起始的位置
this(petals);
//this(ss);会产生错误,因为在一个构造函数中只能调用一个构造函数


值得注意的是:
1:在构造调用另一个构造函数,调用动作必须置于最起始的位置。
2:不能在构造函数以外的任何函数内调用构造函数。
3:在一个构造函数内只能调用一个构造函数。

JAVA中this的三种用法的详解

this关键字必须放在非静态方法里面

this关键字代表自身,在程序中主要的使用用途有以下几个方面:

? 使用this关键字引用成员变量

? 使用this关键字在自身构造方法内部引用其它构造方法

? 使用this关键字代表自身类的对象

? 使用this关键字引用成员方法

8.8.1.1 引用成员变量

在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,有些时候可以省略,有些时候不能省略。首先看一下下面的代码:

/**

* 使用this引用成员变量

*/

public class ReferenceVariable {

private int a;

 

public ReferenceVariable(int a){

this.a = a;

}

 

public int getA(){

return a;

}

 

public void setA(int a){

this.a = a;

}

}

在该代码的构造方法和setA方法内部,都是用this.a引用类的成员变量。因为无论在构造方法还是setA方法内部,都包含2个变量名为a的变量,一个是参数a,另外一个是成员变量a。按照Java语言的变量作用范围规定,参数a的作用范围为构造方法或方法内部,成员变量a的作用范围是类的内部,这样在构造方法和setA方法内部就存在了变量a的冲突,Java语言规定当变量作用范围重叠时,作用域小的变量覆盖作用域大的变量。所以在构造方法和setA方法内部,参数a起作用。

这样需要访问成员变量a则必须使用this进行引用。当然,如果变量名不发生重叠,则this可以省略。

但是为了增强代码的可读性,一般将参数的名称和成员变量的名称保持一致,所以this的使用频率在规范的代码内部应该很多。

8.8.1.2 引用构造方法

在一个类的构造方法内部,也可以使用this关键字引用其它的构造方法,这样可以降低代码的重复,也可以使所有的构造方法保持统一,这样方便以后的代码修改和维护,也方便代码的阅读。

下面是一个简单的示例:

/**

* 使用this关键字引用构造方法

*/

public class ReferenceConstructor {

int a;

 

public ReferenceConstructor(){

this(0);

}

 

public ReferenceConstructor(int a){

this.a = a;

}

}

这里在不带参数的构造方法内部,使用this调用了另外一个构造方法,其中0是根据需要传递的参数的值,当一个类内部的构造方法比较多时,可以只书写一个构造方法的内部功能代码,然后其它的构造方法都通过调用该构造方法实现,这样既保证了所有的构造是统一的,也降低了代码的重复。

在实际使用时,需要注意的是,在构造方法内部使用this关键字调用其它的构造方法时,调用的代码只能出现在构造方法内部的第一行可执行代码。这样,在构造方法内部使用this关键字调用构造方法最多会出现一次。

8.8.1.3 代表自身对象

在一个类的内部,也可以使用this代表自身类的对象,或者换句话说,每个类内部都有一个隐含的成员变量,该成员变量的类型是该类的类型,该成员变量的名称是this,实际使用this代表自身类的对象的示例代码如下:

/**

* 使用this代表自身类的对象

*/

public class ReferenceObject {

ReferenceObject instance;

 

public ReferenceObject(){

instance = this;

}

 

public void test(){

System.out.println(this);

}

}

在构造方法内部,将对象this的值赋值给instance,在test方法内部,输出对象this的内容,这里的this都代表自身类型的对象。

8.8.1.4 引用成员方法

在一个类的内部,成员方法之间的互相调用时也可以使用“this.方法名(参数)”来进行引用,只是所有这样的引用中this都可以省略,所以这里就不详细介绍了。

以上是关于java:在java中为啥静态变量没有this引用?的主要内容,如果未能解决你的问题,请参考以下文章

java中为啥要把main方法定义为一个static方法

无法从静态上下文中引用非静态 变量 this

JAVA中this的三种用法的详解

JAVA中this的三种用法的详解

java学习static静态变量 和this

java中静态变量和静态方法的优缺点