黑马程序员技术交流社区
标题: 什么时候该把方法定义成静态问题 [打印本页]
作者: 潘星 时间: 2012-8-11 05:04
标题: 什么时候该把方法定义成静态问题
class ArrayTool
{
public static int getMax(int[] arr)
{
int max=0;
for (int x=1;x<arr.length ;x++ )
{
if(arr[x]>arr[max])
max=x;
}
return arr[max];
}
}
这是一个通过数组获取最大值的方法,视频中讲到当方法没有特有数据时就定义成静态,
什么叫做特有数据?我该如何判断有没有特有数据呢?有没有什么更好理解一点的方式
来判断一个方法是否要定义成静态呢?
作者: 尤洋 时间: 2012-8-11 07:35
本帖最后由 尤洋 于 2012-8-11 07:55 编辑
“当方法没有特有数据时可以定义成静态” ,这里 没有特有数据是静态的前提,而不是目的
真正要分析 一个方法是否要定义成静态需要根据静态的特点来分析。
我举个例子吧,比如说某个函数定义出来后,发现本类的构造函数私有了,无法new出对象,无法通过对象调用该方法了 怎么办,
那就只能 将其设定为静态,因为静态的特点 中有 类名调用。
再比如说,静态还有个特点:生命周期很长,一旦设为静态的话只要该类还存在,就永远清除不了。这样我们就可以分析出
当一个方法值用很少次时,不要设为静态,这样能节约内存。
你也可以试着用这种方法分析出其他需要用静态的场合,
对应着静态的特点去找 这样比较有成就感。
作者: 王程 时间: 2012-8-11 09:07
个人感觉,一个方法是否应该定义成静态,这也反映了面向对象的思想
一个类为什么会提供静态方法呢?我们知道静态的东西是与类相关的,非静态的东西是与具体的类实例相关的。这两者有什么差别?差别在于非静态方法需要实例对象才能调用,而静态方法只需要类名调用。定义静态方法就一个原则:如果某些操作不依赖于具体实例,那它就应该是静态的,反之,这个方法就应该是非静态的。我举个例子吧
比如有一个学生类,类中有一个属性是学生年龄,学生年龄于学生这个对象关联紧密,类中有一个设置学生年龄的方法,每一个学生对象的年龄都可能不同,所以设置年龄这个方法及必须是非静态的,它需要对象实例来调用。
而有一个类Array,它是一个工具类,其中的方法都是静态的,比如get(Object array, int index);这是个静态方法,返回值是Object,作用是返回指定数组对象中索引组件的值。我们只需要把数组和索引位置传递进去, 它就会给我们返回值,你说它需要实例对象吗?它的实例对象和它提供的方法的关系并不紧密,这个方法和类相关联,所以就定义成静态方法。
作者: 张雪磊 时间: 2012-8-11 09:14
所谓特有数据,就是指这个类中定义的作用于整个类的变量,这些数据可能由构造函数传入,或者在类中定义的,当然数据不能是静态的了,另外也包括不能调用非静态的方法,我觉得也属于特定数据的一种。
当你全面了解了static关键字的概念和功能后,自然就知道该怎么用了。所以全面了解static会对你有很大帮助
static
用来修饰成员变量和成员方法,也可以形成静态static代码块。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
1、static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
作者: 杨彪 时间: 2012-8-11 10:08
static关键字
(1)静态的意思。可以用于修饰成员(成员变量和成员方法)
(2)静态的特点
A:随着类的加载而加载
B:优先于对象存在
C:被该类所有对象共享
D:可以通过类名直接调用
(3)静态的注意事项
A:静态方法只能访问静态成员
为什么:因为静态的内容是随着类的加载而加载,它是先进内存的。
B:静态方法中不能使用this,super关键字
C:主方法是静态的
public static void main(String[] args)
public:公共的意思,是最大权限修饰符。
static:由于jvm调用main方法的时候,没有创建对象。
只能通过类名调用。所以,main必须用static修饰。
void:由于main方法是被jvm调用,不需要返回值。用void修饰。
main:main是主要的意思,所以jvm采用了这个名字。是程序的入口。
String[]:字符串数组
args:数组名
在运行的时候,通过java命令给args数组赋值。
格式:
java MainTest hello world itcast
(4)静态变量和成员变量的区别
A:调用方式
静态变量也称为类变量,可以直接通过类名调用。也可以通过对象名调用。
这个变量属于类。
成员变量也称为实例变量,只能通过对象名调用。这个变量属于对象。
B:存储位置
静态变量存储在方法区长中的静态区。
成员变量存储在堆内存。
C:生命周期
静态变量随着类的加载而存在,随着类的消失而消失。生命周期长。
成员变量随着对象的创建而存在,随着对象的消失而消失。
D:与对象的相关性
静态变量是所有对象共享的数据。
成员变量时每个对象所特有的数据。
(5)什么使用使用静态呢?
A:当所有对象共享某个数据的时候,就把这个成员变量定义为静态修饰的。
B:当某个方法没有访问该类中的非静态成员,就可以把这个方法定义为静态修饰。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |