java的一个重要问题

---- Test_TextField01.java

import java.awt.*;
import java.awt.event.*;

public class Test_TextField01 implements ActionListener {

static TextField tf1 = new TextField();//为什么static能获取到值
TextField tf2 = new TextField();//为什么不能获取值

// static TextField tf1=new TextField();
// static TextField tf2=new TextField();

static String s1 = tf1.getText();
String s2 = tf2.getText();

Label l1 = new Label("输入01:");
Label l2 = new Label("输入02:");
Button b1 = new Button("OK");
Button b2 = new Button("cancel");
Frame f = new Frame("Test");

public void TestFrame() {
f.setLayout(new GridLayout(3, 2));
f.add(l1);
f.add(tf1);
f.add(l2);
f.add(tf2);
f.add(b1);
f.add(b2);
f.setSize(200, 100);
f.setVisible(true);
b1.addActionListener(this);
b2.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
(new Test_TextField02()).action_Method();
} else if (e.getSource() == b2) {
System.exit(0);
}
}
}
============================================================

---- Test_TextField02.java

public class Test_TextField02 {

Test_TextField01 t1 = new Test_TextField01();

String s1 = t1.s1;
String s2 = t1.s2;

public void action_Method() {
System.out.println("Text01:" + s1);
System.out.println("Text02:" + s2);
}
}
-------------------------------------------------------------
在另一个单独类中获取textField的值,为什么static能被获取,而动态的不能??!!

楼上说过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")外的括号会怎么样呢?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-09
这就是static和非static的区别了。static是 在类加载的时侯初始化,而非static是在new object的时候初始化
第2个回答  2009-05-09
sd
相似回答