[align=left]上网查了半天,还是对静态方法搞不明白,
静态方法其实就是类方法,类方法就是操作类的静态变量的,这都没有疑问,
可是我还是不明白:有类可以产生类对象,类对象可以访问类的静态成员变量,
并且可以改变类的静态变量,
既然类成员可以改变类的静态变量,那么为什么:要定义静态方法来操作静态变量??
还有:平时我感觉都没怎么用过静态方法,
解释静态方法的可以顺便附带一点代码,让我感受一下静态方法的运用问题!![/align]如果你要回答基础不牢固什么的要求我去看书的话,最不要麻烦你了,等于没说。
正是因为看书没看懂,我才来这里问的!!!
静态方法其实就是类方法,类方法就是操作类的静态变量的,这都没有疑问,
可是我还是不明白:有类可以产生类对象,类对象可以访问类的静态成员变量,
并且可以改变类的静态变量,
既然类成员可以改变类的静态变量,那么为什么:要定义静态方法来操作静态变量??
还有:平时我感觉都没怎么用过静态方法,
解释静态方法的可以顺便附带一点代码,让我感受一下静态方法的运用问题!![/align]如果你要回答基础不牢固什么的要求我去看书的话,最不要麻烦你了,等于没说。
正是因为看书没看懂,我才来这里问的!!!
静态变量
Static int data语句说明data为类变量,为一个类的共享变量,属于整个类。
例:
Class M{
static int data;
}
M m1=new M(); M m2=new M();
m1.data=0;
m1.data++的结果为1,此时m2.data的结果也为1。
Static定义的是一块为整个类共有的一块存储区域。
其变量可以通过类名去访问:类名.变量名。与通过对象引用访问变量是等价的。
2) 静态方法
Public static void printData(){}
表明此类方法为类方法(静态方法)
静态方法不需要有对象,可以使用类名调用。
静态方法中不允许访问类的非静态成员,包括成员的变量和方法,因为此时是通过类调用的,没有对象的概念。方法中this.data和super.data是不可用的。
原因:从根本来说,是静态变量不管类是否实例化都会存在,而实例变量只有类实例化了才存在。直接调用静态方法时并不确定实例变量是否存在。一般情况下,主方法是静态方法,所以JVM可以直接调用它,主方法为静态方法是因为它是整个软件系统的入口,而进入入口时系统中没有任何对象,只能使用类调用。
猜想:JVM在代码中有这样的语句:
ClassName.main(arg); ClassName 通过命令行的”java 类名”取得,所以类名不用加.class 扩展名*覆盖不适用于静态方法。
静态方法不可被覆盖。
如果子类中有和父类重名的静态方法,虽然编译通过,但它并不能实现多态,所以不能称作覆盖。public class Test {
public static void main(String[] arg) {
Super s = new Sub();
s.show();
}
}
class Super
{
static public void show(){System.out.println("in Super");}
}
class Sub extends Super
{
static public void show(){System.out.println("in Sub");}
}执行结果是: in Super3) 静态内部类----只能是成员内部类
class Out{
public static class Inner{}
}
4) 初始化块
1. 只被执行一次;
2. 初始化块在类被加载后首先被运行,不管类是否实例化
3.一般用来初始化静态变量
Public static void main(String[] args){
System.out.println(Car.name);//这时加载Car Class进入JVM并执行静态代//码块
}
静态的可以通过类名调用
不是静态的是要new类名之后调用
上面不是有例子说的很明白了哦
//静态调用
System.out.println(Test.a);
//非
System.out.println(new Test().b)
}
}
主方法是静态方法,所以JVM可以直接调用它
1、楼主已经清楚静态变量是怎么回事儿,
2、楼主只是不明便什么时候,为什么要使用静态变量。如果是这两个问题,我的回答如下:静态变量实际上是java中提供全局变量的一种机制,这样的变量,只要知道类名和变量名,就可以直接访问,
只是由于java的面向对象特性,这些静态变量才不得不属于某个类。静态变量和方法不宜过度使用,它最主要的用途:
1、使用public static final 定义常量
2、单例模式中public static Class getInstance()
3、public static void main(String[] args)其它情况,如果能够不用静态的,就别用。
Static通常用于Singleton模式开发:
Singleton是一种设计模式,高于语法,可以保证一个类在整个系统中仅有一个对象。
特点:
1. 有一个静态属性
2. 私有的构造―――singleton不能new
3. 公共的静态方法来得到静态属性
实现单例模式的原理:
利用类属性(静态变量)在系统中唯一的特性,建立这样一个唯一的引用并控制这个引用所指的空间是不变的。
public class ConnectionFactory{
private static Connection conn;
private Connection(){
if(conn==null)
conn = new Connction();
}
public Connection getInstance(){
return conn;
}
}
实现2
public class ConnectionFactory{
private static Connection conn;
static{
conn = new Connection();
}
public static Connection getInstance(){
return conn;
}
}
上面的代码我没写详细注释
应用:调用获得系统唯一的一个Connection类型的对象实列
每次获得的都是相同的对象,也就是在内存里只有这一个
其他的类new了一个内存就多了一个
获得:
ConnectionFactory.getInstance()
比如Math类max(int a, int b) :我们不会先Math m=new Math();再m.max(1,2);这样,而是Math.max(1,2);
因为这样设计的话,代码的可读性会变差,自己想想应该明白吧一般在设计工具类的方法时就应该用静态方法了觉得回答的好的话就加点分
静态方法可以不是很建议使用,静态方法虽然方便,但是有的时候可能会引起一些多线程的问题..
我们要算一个sin,cos等值,只需要Math.sin(x),Math.cos(x)这样就能计算出结果了,这些方法都是以类方法的方式提供的。想一下,这些运算需要专门的创建一个对象来调用方法吗?
注意2点:如果能定义为static方法,说明这个方法和该类的任何对象没有关系;调用static方法不需要创建对象,要知道创建对象可是需要耗时的。 开始做设计的时候从面向对象的角度考虑是否需要设计static方法即可。涉及到性能相关的问题时,static方法就有很大的优势了。比如jpc这个项目中,性能是第一位的,它的一个设计原则就是,只要能把一个方法设计为static的,那绝对不会将它实现为非static的,这样就可以避免大量的无用对象的创建。而且,static方法是静态绑定的,不会涉及到多态,这也有性能上的优势。
只要有个对象改变了这个值 其他所有用到的地方都变成了这个修改以后的值 至于静态方法修改静态属性 那是因为这个方法是没办法才必须写成静态的 因为static修饰的属性在类加载的时候就要存在 比如编译的时候 但是呢 你这个\方法竟然不用static修饰 那么就会出现矛盾 一个要加载 一个不加载 倒置方法不能处理变量
http://www.rainsts.net/article.asp?id=261
http://www.rainsts.net/article.asp?id=261
http://www.rainsts.net/article.asp?id=261