A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘星 中级黑马   /  2012-8-11 05:04  /  2777 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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];
        }
}
这是一个通过数组获取最大值的方法,视频中讲到当方法没有特有数据时就定义成静态,
什么叫做特有数据?我该如何判断有没有特有数据呢?有没有什么更好理解一点的方式
来判断一个方法是否要定义成静态呢?

4 个回复

倒序浏览
本帖最后由 尤洋 于 2012-8-11 07:55 编辑

“当方法没有特有数据时可以定义成静态” ,这里 没有特有数据是静态的前提,而不是目的
真正要分析 一个方法是否要定义成静态需要根据静态的特点来分析。
我举个例子吧,比如说某个函数定义出来后,发现本类的构造函数私有了,无法new出对象,无法通过对象调用该方法了 怎么办,
那就只能 将其设定为静态,因为静态的特点 中有 类名调用。
        再比如说,静态还有个特点:生命周期很长,一旦设为静态的话只要该类还存在,就永远清除不了。这样我们就可以分析出
当一个方法值用很少次时,不要设为静态,这样能节约内存。
       你也可以试着用这种方法分析出其他需要用静态的场合,
对应着静态的特点去找 这样比较有成就感。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
个人感觉,一个方法是否应该定义成静态,这也反映了面向对象的思想
一个类为什么会提供静态方法呢?我们知道静态的东西是与类相关的,非静态的东西是与具体的类实例相关的。这两者有什么差别?差别在于非静态方法需要实例对象才能调用,而静态方法只需要类名调用。定义静态方法就一个原则:如果某些操作不依赖于具体实例,那它就应该是静态的,反之,这个方法就应该是非静态的。我举个例子吧

比如有一个学生类,类中有一个属性是学生年龄,学生年龄于学生这个对象关联紧密,类中有一个设置学生年龄的方法,每一个学生对象的年龄都可能不同,所以设置年龄这个方法及必须是非静态的,它需要对象实例来调用。

而有一个类Array,它是一个工具类,其中的方法都是静态的,比如get(Object array, int index);这是个静态方法,返回值是Object,作用是返回指定数组对象中索引组件的值。我们只需要把数组和索引位置传递进去, 它就会给我们返回值,你说它需要实例对象吗?它的实例对象和它提供的方法的关系并不紧密,这个方法和类相关联,所以就定义成静态方法。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
所谓特有数据,就是指这个类中定义的作用于整个类的变量,这些数据可能由构造函数传入,或者在类中定义的,当然数据不能是静态的了,另外也包括不能调用非静态的方法,我觉得也属于特定数据的一种。
当你全面了解了static关键字的概念和功能后,自然就知道该怎么用了。所以全面了解static会对你有很大帮助

static

用来修饰成员变量和成员方法,也可以形成静态static代码块。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。  


 static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:

类名.静态方法名(参数列表...)

类名.静态变量名


1、static变量

 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:

 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。

 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。


2、静态方法

 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!

 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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:当某个方法没有访问该类中的非静态成员,就可以把这个方法定义为静态修饰。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马