类--静态方法

静态属性、方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就有多少个属性)。

(1)、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里,调用方法为"类名::属性名";
(2)、静态方法不需要实例化即可调用。同上
(3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
(4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;

(5)、static方法中不能用this(与实例相关)
(6)、非static方法中可以使用static成员

为什么静态方法中不能调用非静态方法

程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。

类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:

静态方法的内存分配时间与实例方法不同
当程序开始运行时,静态方法已经在内存中被分配了空间,有了入口地址,所以可以通过"类名.方法名"直接调用
而实例方法只有在创建了该类的对象以后才分配内存
也就是说程序开始运行后静态方法已经有了入口地址,而此时实例方法可能并未被分配内存,所以无法通过静态方法调用实例方法
同理也不能用"类名.方法名"的方式调用实例方法

而类又是在什么时候加载的呢?

引导类加载器负责加载的核心类比如 String 类在 JVM 启动时(main 方法开始执行前)就会被加载,其它类在使用前(new 它对象或调用其静态方法访问静态域等等前)会被动态加载,要注意的是子类被加载前它的所有超类要根据由父到子的顺序被逐一加载。

如何在静态方法中使用非静态变量?

<?php
class abc{
    public $count=8;
    function __construct(){
        $this->count++;
    }
    static function getCount(){
        $b=new abc();
        return $b->count;
    }
}
$c=new abc();
$b=new abc();
echo $b->getCount();
?>

在静态方法getCount()中,创建了一个新变量$b=new abc()初始化类,然后再使用类的非静态变量就可以了。

时间: 2024-10-08 14:49:33

类--静态方法的相关文章

Python的类实例方法,类方法,类静态方法

以下面的类定义为例: # coding:utf-8 class A: count = 0 def __init__(self, inst_name): self.inst_name = inst_name self.__class__.count += 1 def inst_method(self): print '实例(%s):%s' % (self.__class__.count, self.inst_name) @classmethod def class_method(cls): pri

Object-C使用类静态方法创建对象时容易内存泄露

1.所谓使用类的静态方法创建对象,就是指使用类名调用一次它的静态方法(非显式调用alloc)便可以得到一个新建的对象,比如下面两个例子: NSString* str1 = [NSString stringWithString:@"hello world"]; NSMutableString* str2 = [NSMutableString stringWithString:@"hello world"]; 2. 第一个例子是使用字符串的字面常量"hello

Swift - 类型属性(类静态属性)和类方法(类静态方法)

1,结构体struct和枚举enum的静态属性,静态方法使用static关键字 1 2 3 4 5 6 7 8 9 10 struct Account {      var amount : Double = 0.0                 //账户金额      var owner : String = ""                   //账户名      static var interestRate : Double = 0.668  //利率     stat

关于工具类静态方法调用@Autowired注入的service类问题

@Component //此处注解不能省却(0) 1 public class NtClient { 2 /** 3 * 日志 4 */ 5 private static String clazzName = NtClient.class.getName(); 6 /** 7 * 此处是要使用的service需要spring注入(1) 8 */ 9 @Autowired 10 private NotifyTimeService notifyTimeService; 11 private stat

XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)

以下是代码: using System;using System.Collections.Generic;using System.Linq;using System.Web; using System.Xml; namespace WebApplication2{ /// <summary>    /// XMLHelper XML文档操作管理器    /// </summary>    public class XMLHelper    {        public XMLH

JAVA NetworkInterface类静态方法

import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; public class networkInterfaceStaticMethod { public static void main(String[] args) { n

python__基础 : 类属性,类方法,静态方法

类属性  定义在类里面,方法外面的属性,一般属于这个类,如下面的 num 就是类属性: class Test: num = 0 类属性用 实例.类属性   或者 类.类属性 都可以访问, 如 a = Test()  用 a.num 可以访问 ,但是如果这个实例有一个实例属性 self.num 那么这样访问的其实是 self.num , 所以一般用 类.属性 即这样 Test.num 访问 类方法, 类方法是属于这个类的方法,定义方式为 前面加上装饰器 @classmethod 且第一个参数传递的

《Unity_API解析》 第一章 Application类

Application类不含实例属性和实例方法,在脚本中通过直接调用Application类的静态属性和静态方法来控制程序的运行时数据. Application静态属性: dataPath属性 : 数据文件路径 public static string dataPath{ get; } Application.dataPath 返回程序的数据文件所在文件夹的路径(只读).返回路径为相对路径,不同游戏平台的数据文件保存路径不同. Application.persistentDataPath 返回一

《Unity_API解析》 第八章 Quaternion类

Quaternion又称四元数,由x.y.z和w这4个分量组成,属于struct类型.在Unity中,用Quaternion来存储和表示对象的旋转角度.对于GameObject一般的旋转及移动,可以用Transform中的相关方法实现. Quaternion类实例属性 eulerAngles属性:欧拉角 功能说明 此属性用来返回和设置Quaternion实例对应的欧拉角,说明如下. 1.对GameObject对象的Transform进行欧拉角的变换次序是,zxy轴依次旋转.不同的旋转次序得到的最