JAVA中类中的实例方法可以操作类变量(static变量)吗?类方法(static方法)可以操作实例变量吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中类中的实例方法可以操作类变量(static变量)吗?类方法(static方法)可以操作实例变量吗?相关的知识,希望对你有一定的参考价值。

实例方法可以操作类变量
类方法(static方法)不可以操作实例变量

静态方法

通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:

class Simple
static void go()
System.out.println("Go...");


public class Cal
public static void main(String[] args)
Simple.go();



调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。

静态变量

静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。看下面这段代码:

class Value
static int c=0;
static void inc()
c++;


class Count
public static void prt(String s)
System.out.println(s);

public static void main(String[] args)
Value v1,v2;
v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);



结果如下:

v1.c=0 v2.c=0
v1.c=1 v2.c=1

由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。值得探讨的是静态变量的初始化问题。我们修改上面的程序:

class Value
static int c=0;
Value()
c=15;

Value(int i)
c=i;

static void inc()
c++;


class Count
public static void prt(String s)
System.out.println(s);

Value v=new Value(10);
static Value v1,v2;
static
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1=new Value(27);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(15);
prt("v1.c="+v1.c+" v2.c="+v2.c);


public static void main(String[] args)
Count ct=new Count();
prt("ct.c="+ct.v.c);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
prt("ct.c="+ct.v.c);



运行结果如下:

v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
v1.c=11 v2.c=11
ct.c=11

这个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。

通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。如下代码所示:

public class StaticCls
public static void main(String[] args)
OuterCls.InnerCls oi=new OuterCls.InnerCls();


class OuterCls
public static class InnerCls
InnerCls()
System.out.println("InnerCls");




输出结果会如你所料:

InnerCls

和普通类
参考技术A 实例方法可以操作类变量(static变量),也叫类的静态变量。
static方法不能操作实例变量。

原因很简单,实例变量(或实例方法)是要有类的实例才能访问的,即先要new一个对象,才能访问。
而static方法或变量,不需要创建对象,直接通过类名访问,所以它不能访问实例变量。本回答被提问者采纳

Java中类方法与实例方法的区别

实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,但类方法不能访问实例变量。实例方法必须由实例对象来调用,而类方法除了可由实例对象调用外,还可以由类名直接调用。

另外,在类方法中不能使用 this 或 super。 关于类方法的使用,有如下一些限制:

1 在类方法中不能引用对象变量。

2 在类方法中不能使用super、this关键字。

3 类方法不能调用类中的对象方法。

与类方法相比,实例方法几乎没有什么限制:

1 实例方法可以引用对象变量(这是显然的),也可以引用类变量。

2 实例方法中可以使用super、this关键字。

3 实例方法中可以调用类方法。

以上是关于JAVA中类中的实例方法可以操作类变量(static变量)吗?类方法(static方法)可以操作实例变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

es6中类中的静态属性实例属性静态方法实例方法的个人理解

同一线程中类的所有实例中的类的共享数据成员

Java类的定义及其实例化

JAVA中类实例与Class对象

java中类变量和实例变量的实质区别?

类方法和实例方法