
你上面的类名叫Statictest而你下面调用的类名叫StaticTest,名字不对,所以没有找到StaticTest
第二:
static void incr(){StaticTest.i++}这里 i 不是static的,所以你获取不到
如果希望可以StaticTest.i++那么,你可以把上面改成:
class StaticTest
{
static int i=47
}
第三:
所以,你的 sf 是无法调用的
StaticFun.incr()才是正确的调用方法,用类名点出来
有点啰嗦,希望对你有帮助
楼上说过le另外把我原来的笔记——关于static 的送你吧
static的用法(结合类、实例以及静态方法、实例方法学习)
静态方法和静态变量是属于某一个类,而不属于类的对象。静态方法和静态变量的引用直接通过类名引用。在静态的方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以。可以用静态的对象obj去调用静态的方法method()。如:obj.method()。
例一
有两种情况是non-static无法做到的,这时你就要使用statice。
第一种:你希望不论产生了多少个对象,或不存在任何对象的情形下,那些特定数据的存储空间都只有一份;
第二种:你希望某个函数不要和class object绑在一起。即使没有产生任何object,外界还是可以调用其static函数,或是取用其static data。
如何理解呢,看完下面的小例子,就会理解了。
public class StaticTest {
static int i = 47
}
public class Test {
public static void main(String[] args) {
StaticTest t1 = new StaticTest()
StaticTest t2 = new StaticTest()
t1.i = 50
System.out.println(t1.i)
System.out.println(t2.i)
}
}
结果为:
50
50
为什么会有这样的结果呢?这是因为它们都指向同一块内存。
另外,调用static函数或变量,除了利用对象定址外(t1.i = 50),也可以直接使用其class名,即(StaticTest.i = 50)。
例二
有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:
·
它们仅能调用其他的static 方法。
·
它们只能访问static数据。
·
它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。
如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:
// Demonstrate static variables,methods,and blocks.
class UseStatic {
static int a = 3
static int b
static void meth(int x) {
System.out.println("x = " + x)
System.out.println("a = " + a)
System.out.println("b = " + b)
}
static {
System.out.println("Static block initialized.")
b = a * 4
}
public static void main(String args[]) {
meth(42)
}
}
一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。
注意:在一个static 方法中引用任何实例变量都是非法的。
下面是该程序的输出:
Static block initialized.
x = 42
a = 3
b = 12
在定义它们的类的外面,static 方法和变量能独立于任何对象而被使用。这样,你只要在类的名字后面加点号运算符即可。例如,如果你希望从类外面调用一个static方法,你可以使用下面通用的格式:
classname.method( )
这里,classname 是类的名字,在该类中定义static方法。可以看到,这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的格式来访问——类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。
下面是一个例子。在main() 中,static方法callme() 和static 变量b在它们的类之外被访问。
class StaticDemo {
static int a = 42
static int b = 99
static void callme() {
System.out.println("a = " + a)
}
}
class StaticByName {
public static void main(String args[]) {
StaticDemo.callme()
System.out.println("b = " + StaticDemo.b)
}
}
下面是该程序的输出:
a = 42
b = 99
通俗点的解释如下:
1。如果不加static修饰的成员是对象成员,也就是归每个对象所有的。
2。加static修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的
例三
有如下程序:
class Cup
{
Cup(int marker)
{
System.out.println("Cup(" + marker + ")")
}
void f(int marker)
{
System.out.println("f(" + marker + ")")
}
}
class Cups
{
static Cup c1=new Cup(1)
Cup c3=new Cup(3)
static Cup c2= new Cup(2)Cups()
{
System.out.println("Cups()")
}
Cup c4=new Cup(4)
}
public class cc
{Cups c=new Cups()
{
System.out.println("Hello")
}public static void main(String[] args)
{
System.out.println("Inside main()")
Cups.c1.f(99)
cc x=new cc()
}
static Cups x = new Cups()
}
输出结果为:
Cup(1)
Cup(2)
Cup(3)
Cup(4)
Cups()
Inside main()
f(99)
Cup(3)
Cup(4)
Cups()
Hello
你了解static关键字了吗?
以下有4点总结:
1、 如果有static,即静态成员定义,首先初始化static的变量,如,在类Cups中c3在c2前面,可是在输出的结果中,你可以发现,c2是在c3前执行的,这就是因为,所有的static都在第一时间被初始化。
2、 Static只初始化一次,在第二次创建类的对象的时候,就不会去执行static的语句,如,在第二次执行new Cups()的时候,就只输出了Cup(3)和Cup(4),显然,static的两个创建对象的语句没有做。
3、 变量的初始化在方法前。如,在Cups类中,方法Cups()在语句Cup c4=new Cup(4)之前,可是输出结果的时候,打印的Cups()却在Cup(4)之后。
4、 在含有main的类中执行顺序是先做static,然后就是main,而不是像其它类一样,除了static就按顺序做下来。如,在main函数中,如果去掉语句ExplicitStatic x=new ExplicitStatic(),则Cups c=new Cups()和System.out.println("hello")都不会执行。另外,留个小问题,如果去掉了System.out.println("hello")外的括号会怎么样呢?
x是静态变量,当在创建对象的时候 ,程序先是在内存中加载的是类中的静态变量和静态块(如此程序中的static{x++;})所以X输出为2;同理第一个st.y=1;
而在st=new StaticTest()的时候 st 指向的另外的一个新创建的对象 所以此时st.y还是等于1
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)