探秘static——类不需实例化就能用?

一般情况下,需要用到某个类的时候,都必须先实例化这个类,才能对其进行调用。在编程过程中发现,有些类不用实例化就可以直接拿来使用,使用它的字段、方法等等。

这时候,靠的就是static作用。static英文意思为“静止的,静态的”,在编程中可以作为修饰符,类、字段、属性、方法等被static修饰后,变为静态类、静态字段、静态属性、静态方法……

static修饰的类成为静态类,静态类只能包含静态成员(被static修饰的字段、属性、方法),不能被实例化,不能被继承;非静态中可以包含静态成员。

1、被调用时必须先实例化的情况:

       被调用成员为非静态成员(此时它所属的类肯定为非静态类)。如下小例子:

    public class ClassA      //ClassA类(非静态类)
    {
        public ClassA() { }  //构造函数
        public void Fun() { }//ClassA类中的方法(非静态方法)
    }

    public class ClassB     //需要调用ClassA类中方法的ClassB类
    {
        public ClassB() { }  //构造函数
        public void Fun()
        {
            ClassA a = new ClassA();//调用ClassA类中的方法需要先实例化
            a.Fun();
        }
    }

说明:ClassA类为非静态类,其中的方法Fun()也为非静态方法,所以在ClassB中调用时需要先实例化ClassA类。

2、被调用时不需要实例化的情况:

       被调用成员为静态成员(此时它所属的类为静态类或非静态类)。如下小例子:

(1)被调用类为非静态类:

    public class ClassA      //ClassA类(非静态类)
    {
        public ClassA() { }  //构造函数
        public static void Fun() { }//ClassA类中的方法(静态方法)
    }

    public class ClassB     //需要调用ClassA类中方法的ClassB类
    {
        public ClassB() { }  //构造函数
        public void Fun()
        {
            ClassA.Fun();  //调用ClassA类中的方法直接调用:类名.成员
        }
    }

说明:ClassA类为非静态类,但其中的方法Fun()为非静态方法,所以在ClassB中调用时不实例化ClassA类(而且不能实例化),直接调用其成员,语法为“类名.成员”。

(2)被调用类为静态类:

    public static class ClassA      //ClassA类(静态类)
    {
        //当然静态类中不能存在构造函数
        public static void Fun() { }//ClassA类中的方法(静态方法)
    }

    public class ClassB     //需要调用ClassA类中方法的ClassB类
    {
        public ClassB() { }  //构造函数
        public void Fun()
        {
            ClassA.Fun();  //调用ClassA类中的方法直接调用:类名.成员
        }
    }

说明:ClassA类为静态类,其中的方法也Fun()为非静态方法,所以在ClassB中调用时不实例化ClassA类(而且不能实例化),直接调用其成员,语法为“类名.成员”。

3、static修饰符(拓展):

(1) 用来修饰类或类的成员,这时不需要创建实例就能访问(而且不能实例化),在被调用的时候自动实例化,且在内存中产生一个实例。当含有静态成员的非静态类实例化出对象后,这些对象公用这些静态成员,通过类名或对象名都能访问它们。

在网上看到两个有趣的小例子:

人是一个非静态类。人有脑子,这是一个用static修饰的属性。

这个属性是针对所有的人,是人的共同特征。而不是某个特点对象所特有的(比如张三有脑子,李四没脑子),因为只要是个人,他都有脑子(虽然卡洛斯·罗德里格兹只有半个脑子,还有些人比较脑残→_→,那也算是有脑子),既然是人类共有的,那么他就不能被实例化。

另外一个能被实例化的例子,还是人这个类,人的身高,就是一个非static的属性。因为每个人的身高是不同的。比如我身材魁梧,高达1.55米,这个1.55米是描述我的身高,是跟我这个特定的对象有联系的。姚明才2.26米,这是姚明这个对象的数据。不管是1.55还是2.26,这都和特定的对象有联系,而不是人类所共有的特征。所以非static的可以被实例化,而static不能被实例化。

(2) 修饰方法内部的静态变量

方法内部的静态变量,执行完静态变量值不消失,再次执行此对象的方法时,值仍存在,它不是在栈中分配的,是在静态区分析的, 这是与局部变量最大的区别。关于内存分配问题可参考《静态存储区、堆和栈的区别》

探秘static——类不需实例化就能用?,布布扣,bubuko.com

时间: 2024-10-11 05:42:29

探秘static——类不需实例化就能用?的相关文章

如何让一个类不能被实例化

本文涉及的概念: 1.在面向对象编程中,在什么场景下会需要做到让一个类不能被实例化 2.让一个类不能被实例化的方法 什么样的场景会需要让一个类不能被实例化 工具类(utility class),实例化对它们没有意义的工具类.这时候,就要做到不让该类被实例化 java.lang.Math: 把与Math相关的基本类型的值和相关的方法组合到该Math类中.Math类不需要实例化,使用了私有构造器.不过,它可以在Math类中内部被实例化. 使用私有构造器,没有子类;使用final修饰,没有子类. pa

何时使用static类(工具类)

一个static类,指全部成员都是static方法构成的,而没有任何成员变量, 也称为Utility class 或者Utility Pattern [参考: Utility Pattern].它可以在程序中直接使用该类的方法,而不用实例化.static class相对单例有更好的性能,原因是它的方法不需要实例方法的动态绑定 (static方法本身不能被复写). static类可以看作某一组方法的集合,也能够更好的复用代码.static类各个方法应当是无状态的(stateless),即没有成员变

Java语言中的static类和类与类之间的总结

一.static类 1.static类的定义  static被称为静态,可以用来修饰类的属性或方法.  如果类的某个属性,不管创建多少个对象,属性的存储空间只有唯一的一个,那么这个属性就应该用static修饰,被static修饰的属性称为静态属性.  static属性可以使用对象调用,也可以直接用类名调用.  静态属性的类的所以对象共享的,即不管创建了多少个对象,静态属性在内存中只有一个. public class Employee{ private String name;----------

c++ static 类成员

一.什么是static类成员 对于特定类类型的全体对象而言, 访问一个全局对象有时是必要的. 然后,全局对象会破坏封装: 对象需要支持特定类抽象的实现. 如果对象是全局的, 一般的用户代码就可以修改这个值. 类可以定义类静态成员,而不是定义一个可普遍访问的全局对象. 通常, 非static数据成员存在于类类型的每个对象中. 不像普通的数据成员, static数据成员独立于该类的任意对象而存在, 每个static数据成员是与类关联的对象, 并不与该类的对象相关联. 类也可以定义static成员函数

C++中static类成员

static局部变量 static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化 这种对象一旦被创建,在程序结束前不会被撤销.在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值. #include<iostream> #include<string> #include<assert.h> using namespace std; size_t count_calls() { static size_t ctr=0; return ++

OC类与对象实例化,类之间的方法调用小题目

两个OC类与对象实例化题目 要求: * 类名.属性名.属性类型.方法名.方法参数.方法返回值自拟 * 自己写main函数测试设计是否合理 /* 1.设计一个"狗"类 1> 属性 * 颜色 * 速度(单位是m/s) * 性别 * 体重(单位是kg) 2> 行为 * 吃:每吃一次,体重增加0.5kg,输出吃完后的体重 * 吠(叫):输出所有的属性 * 跑:每跑一次,体重减少0.5kg,输出速度和跑完后的体重 * 比较颜色:跟别的狗比较颜色,如果一样,返回YES,不一样,返回NO

C++:static类

static自我理解 static使得数据成员或者函数生命周期为整个文件所在程序的生命周期, 在C中还可以用它避免被其它文件使用为外部成员 static类 明确:类的静态数据成员它被所有类对象共享,但它是属于类的,而不是类的对象的 定义静态成员:static只出现在类内部的声明语句中 静态成员函数在类的内部与外部均可以定义(只需要在函数声明前加上static) class a1{ .... static void func1(); }; void a1::func1(){...} 因为静态数据成

类实例 及 实例化对象 对象引用

类实例及成员引用 当我们创建完一个类,如果要使用这个类,必须在程序里创建类的实例对象,通过这个实例来引用类中所定义的方法成员,完成所需的工作.创建实例对象时,必须使用new关键字,这个关键字我们在集合和哈希表对象的创建时用到过,基本方法一致,就是用new关键字产生一个指向类实例对象所在位置的引用.实例化类对象的基本语法为: ClassName ObjName=new ClassName([参数]): 类的名字       对象名                           是否有参数.多

类的初始化&amp;实例化顺序

讲到类的初始化和实例化(见我的<Class的生命周期>),不得不提提初始化和实例化的顺序,我想这也是一直困扰了很大一部分人. 从大流程来说,类肯定是先初始化,再实例化的,这里得出第一个顺序: 静态域 --> 实例域 --> 构造函数.另外要符合任何子类的动作都会触发父类:父类 --> 子类.所以得出原则:[先静态后实例:先父类后子类] 而且同一个域的顺序可以分成两步: 创建-->赋值 对于静态域,其先经过链接创建静态变量,赋default值:再到初始化阶段给静态变量赋a