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

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

这时候,靠的就是static作用。static英文意思为“静止的,静态的”,在OOP中可以作为修饰符,类、字段、属性、方法等被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类(而且不能实例化),直接调用其成员,语法为“类名.成员”。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索实例
, static
, 静态
, 静态 非静态 覆盖
, 方法
, 方法调用
, 调用方法
, 类方法
, public
, 实例化
, 调用非静态方法
, ava类中的构造函数
, 静态成员构造方法
成员
,以便于您获取更多的相关知识。

时间: 2024-10-28 10:14:05

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

何时使用static类(工具类)

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

Java类初始化和实例化中的2个“雷区”_java

在考虑类初始化时,我们都知道进行子类初始化时,如果父类没有初始化要先初始化子类.然而事情并没有一句话这么简单. 首先看看Java中初始化触发的条件: (1)在使用new实例化对象,访问静态数据和方法时,也就是遇到指令:new,getstatic/putstatic和invokestatic时: (2)使用反射对类进行调用时: (3)当初始化一个类时,父类如果没有进行初始化,先触发父类的初始化: (4)执行入口main方法所在的类: (5)JDK1.7动态语言支持中方法句柄所在的类,如果没有初始化

C++中static类成员

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

c++ static 类实例 是否调用折构函数?

问题描述 c++ static 类实例 是否调用折构函数? 比如说static MyClass myclass; myclass的折构函数会不会被调用? 解决方案 会调用,但是可能不会再控制台输出 在VC++中编写如下代码: #include <iostream> using namespace std; class A { public: ~A() { cout << "~A" << endl; } }; static A a; int main(

static 类里的static变量和非static类里static变量生命周期各是多少?

问题描述 比如在ssh里,定义一个static 类的static变量和一个非static类static变量 它们的生命周期各是多长呢? 是到应用程序结束? 还是用户登陆的时候创建用户登出的时候销毁? 还是由垃圾回收器决定,具体时间不确定? 解决方案 类不能定义为static的.只有类的成员才可以是static(包括变量和方法)static成员第一次用的时候创建,之后就一直在了.直道应用程序关闭.解决方案二:static可修饰的东西很多,分别有如下一些: 1. static修饰类中的变量,称这样的

static类为什么不能用sealed关键字修饰

今天在写代码时,顺手把一个static 类前面加上sealed关键字,结果编译时报错:" 类不能既是静态的又是密封的".很是纳闷,sealed字段修饰类不是代表该类不能被继承吗,于是我去掉sealed关键字,生成一个dll.然后用Reflector查看了这个这个类的IL,结果发现如下情况: public static class Utility 被翻译成下面的代码了 .class public abstract auto ansi sealed beforefieldinit Util

JavaScript类继承及实例化的方法_javascript技巧

本文实例讲述了JavaScript类继承及实例化的方法.分享给大家供大家参考.具体如下: (function(){ var Class = { //扩展类 create: function(aBaseClass, aClassDefine){ var $class = function(){ for(var member in aClassDefine){ this[member] = aClassDefine[member]; } if('undefined'===typeof aClassD

A类中直接实例化B类,然后调用B类的方法不行吗?

问题描述 publicclassSuperMarket{//初始化仓库CangKuck=newCangKu();//为什么在下边用ck.不出方法来,但是在SuperMarket的构造函数里就可以???????publicSuperMarket(){ck.DaoRuGoods("Acer",1000);ck.DaoRuGoods("IPhone",1000);ck.DaoRuGoods("Cannoon",1000);ck.DaoRuGoods(&

艾伟_转载:Socket开发探秘--基类及公共类的定义

Socket开发是属于通信底层的开发,.NET也提供了非常丰富的类来实现Socket的开发工作,本篇不是介绍这些基础类的操作,而是从一个大的架构方面阐述Socket的快速开发工作,本篇以TCP模式进行程序的开发介绍,以期达到抛砖引玉的目的. 要掌握或者了解Socket开发,必须了解下面所述的场景及知识. 1.TCP客户端,连接服务器端,进行数据通信 2.TCP服务器端,负责侦听客户端连接 3.连接客户端的管理,如登陆,注销等,使用独立线程处理 4.数据接收管理,负责数据的接受,并处理队列的分发,