`
raozhiyong11
  • 浏览: 138527 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

对static 修饰符之静态变量和静态方法的理解

    博客分类:
  • J2SE
阅读更多

我们知道,只要是类,无论什么类(包括抽象类),里面只有方法和变量,而要使用这个类我们一般分两步走,如,一个员工类Employee

Employee s;//定义了一个Employee的引用
s=new Employee("Aaron",1980,3,1,1500);//这样才真正建立了一个对象s,也就是说s指向了内存中的一块连续的区域.

—这里注意什么是真正的对象,什么是引用—

如果我们要改变这块区域,需调用其中的方法,如
s.raiseSalary(25);//raiseSalary(double)为Employee 中的方法

这样,我们通过方法(类方法)改变了类中的变量(类数据或类变量).

所谓静态方法,就是通过类名来调用(当然通过类对象来调用一样是可以的,就像core java里说的一样,容易让人混淆!)的方法,
静态变量它是一种共享变量(VB.net里面如此称呼,比较容易理解).,任何通过类名来调用,都可以改变其值.

关于静态方法(通过类产生的对象)调用静态方法,调用非静态方法(通过类名或都是对象调用)都是可以的,但是,静态方法可以调用静态变量而不可以调用非静态变量(Error(12,30): non-static variable a cannot be referenced from a static context)

以下是thinking in java 里面的关于static 的描述:

2.6.3 static关键字
通常,我们创建类时会指出那个类的对象的外观与行为。除非用new创建那个类的一个对象,否则实际上并未得到任何东西。(注意,这里其实就是说的引用和真正的对象创建问题)只有执行了new后,才会正式生成数据存储空间,并可使用相应的方法。
但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用static(静态)关键字。一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。而在这之前,对于非static数据和方法,我们必须创建一个对象,并用那个对象访问数据或方法。这是由于非static数据和方法必须知道它们操作的具体对象。当然,在正式使用前,由于static方法不需要创建任何对象,所以它们不可简单地调用其他那些成员,同时不引用一个已命名的对象,从而直接访问非static成员或方法(因为非static成员和方法必须同一个特定的对象关联到一起)。
有些面向对象的语言使用了"类数据"和"类方法"这两个术语。它们意味着数据和方法只是为作为一个整体的类而存在的,并不是为那个类的任何特定对象。有时,您会在其他一些Java书刊里发现这样的称呼。
为了将数据成员或方法设为static,只需在定义前置和这个关键字即可。例如,下述代码能生成一个static数据成员,并对其初始化:

class StaticTest {
Static int i = 47;
}

现在,尽管我们制作了两个StaticTest对象,但它们仍然只占据StaticTest.i的一个存储空间。这两个对象都共享同样的i。请考察下述代码:
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
此时,无论st1.i还是st2.i都有同样的值47,因为它们引用的是同样的内存区域。
有两个办法可引用一个static变量。正如上面展示的那样,可通过一个对象命名它,如st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用static变量,因为它强调了那个变量的"静态"本质)。
StaticTest.i++;
其中,++运算符会使变量增值。此时,无论st1.i还是st2.i的值都是48。
类似的逻辑也适用于静态方法。既可象对其他任何方法那样通过一个对象引用静态方法,亦可用特殊的语法格式"类名.方法()"加以引用。静态方法的定义是类似的:
class StaticFun {
static void incr() { StaticTest.i++; }
}
从中可看出,StaticFun的方法incr()使静态数据i增值。通过对象,可用典型的方法调用incr():
StaticFun sf = new StaticFun();
sf.incr();
或者,由于incr()是一种静态方法,所以可通过它的类直接调用:
StaticFun.incr();
尽管是"静态"的,但只要应用于一个数据成员,就会明确改变数据的创建方式(一个类一个成员,以及每个对象一个非静态成员)。若应用于一个方法,就没有那么戏剧化了。对方法来说,static一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法。正如以后会看到的那样,这一点是至关重要的——特别是在定义程序运行入口方法main()的时候。
和其他任何方法一样,static方法也能创建自己类型的命名对象。所以经常把static方法作为一个"领头羊"使用,用它生成一系列自己类型的"实例"。

以下是我的测试程序:

<pre>

package moonsoft.test.testDataStructure;

public class TestDriver
{
public TestDriver()
{
}
public static void main(String []args)
{
TestDriver td=new TestDriver();
String month=td.monthName(3);//通过对象调用static method,不建议使用
month=TestDriver.monthName(4);//标准的调用static method
String month1=td.monthName1(3);//通过对象调用非static method
month1=TestDriver.monthName1(4);
/*不通过对象调用非static method:
* Error(14,23): non-static method monthName1(int) cannot be referenced from a static context*/
System.out.println(month+a);//静态方法调用静态变量
System.out.println(month1+a);//静态方法调用静态变量
System.out.println(month+a1);
/*静态方法调用非静态变量
*Error(17,30): non-static variable a1 cannot be referenced from a static context*/


}
public static String monthName(int month)//static method
{
switch ( month)
{
case 1: return "Jan";
case 2: return "Feb";
case 3: return "Mar";
case 4: return "Apr";
case 5: return "May";
case 6: return "Jun";
default: return "others";

}
}
public String monthName1(int month)//not a static method
{
switch ( month)
{
case 1: return "Jan";
case 2: return "Feb";
case 3: return "Mar";
case 4: return "Apr";
case 5: return "May";
case 6: return "Jun";
default: return "others";

}
}
public static int add(int t)
{
int s=t;
s++;
return s;
}
public static double a;
public double a1;

}
其实很简单,随遍写出一个程序测试一下就好了,头脑里一定要清楚地知道静态究竟是怎么回事.

分享到:
评论

相关推荐

    C# 公有变量 私有变量 静态变量

    以上内容涵盖了C#中公有变量、私有变量和静态变量的基本用法和原理,希望对你理解和应用这些知识有所帮助。在实践中,你可能会遇到更多复杂的场景,如属性(Properties)的使用,以及如何通过getter和setter方法来...

    Java修饰符使用整理(含实例)

    非访问修饰符包括 final、static 和 abstract 三种,用于控制类、成员变量和方法的继承关系和行为。 一、访问修饰符 访问修饰符是 Java 中最基本的修饰符,用于控制类、成员变量和方法的访问权限。访问修饰符有四...

    Java访问修饰符

    static 访问修饰符表示静态变量或静态方法。静态变量和静态方法可以被类的所有实例共享,不需要创建类的实例就可以访问。 transient 访问修饰符 transient 访问修饰符告诉编译器,在类对象序列化时,此变量不需要...

    C#中静态变量的使用

    C# 中静态变量的使用是指在 C# 语言中使用静态变量的方法和技术。本文将详细介绍静态变量与非静态变量的区别、静态变量的使用方式、静态构造函数的使用等方面的知识点。 一、静态变量与非静态变量的区别 静态变量...

    Java static修饰方法

    在Java编程语言中,`static`关键字是一个非常重要的修饰符,它有多种用途,但最常见的是用来修饰类的方法和变量。在这个主题中,我们将深入探讨`static`修饰方法的概念、作用以及它如何影响Java程序的执行。 首先,...

    C#中static静态变量的用法实例

    使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型   静态全局变量 定义:在全局变量...

    【独家高薪面试题库】与【实战配套练习演练】6.静态变量访问修饰符1

    在Java编程语言中,了解和熟练掌握访问修饰符和变量的使用是至关重要的,特别是对于进行高薪面试和实际项目开发。以下是对标题、描述和标签中涉及知识点的详细解释: 1. **静态变量**: 静态变量,也被称为类变量...

    java修饰符介绍

    以下是对标题和描述中提及的Java修饰符及其相关知识点的详细介绍: 1. 类的访问控制修饰符: - **public**:公共访问修饰符,允许任何地方的代码访问该类或成员。这意味着类或方法可以在任何包中被调用。 - **...

    理解java中的类的各种权限修饰符

    ### 理解Java中的类的各种权限修饰符 在Java编程语言中,权限修饰符用于控制类、方法、变量等成员的访问级别。这有助于提高代码的安全性和封装性。本文将详细探讨Java中的五种权限修饰符:`public`、`protected`、`...

    Java软件开发实战 Java基础与案例开发详解 6-5 static修饰符 共13页.pdf

    ### Java软件开发实战:Java基础与案例开发详解之Static修饰符 #### 6.5 Static修饰符 在Java中,`static`关键字用于声明与类而不是与实例相关的变量、方法或代码块。这一特性使得静态成员能够被类本身直接访问,...

    全局变量、局部变量、静态变量即内存管理

    3. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。 4. 文字常量...

    针对Java中的修饰符总结

    Java中的修饰符总结 Java中的修饰符可以分为两大类:访问修饰限定符和...通过对Java中的修饰符的总结,我们可以更好地理解和使用Java中的访问修饰限定符和非访问修饰限定符,从而编写更加安全、灵活和高效的Java程序。

    第6章 Java语言中的修饰符.ppt

    Java语言中的修饰符是编程语法中的重要组成部分,它们用于定义类、接口、变量和方法的特性,从而控制访问权限、实现抽象概念、确保不可变性以及优化代码结构。本章将详细阐述Java中的主要修饰符。 首先,我们讨论...

    java常用的修饰符

    Java修饰符是编程中至关重要的概念,它们用于定义类、接口、变量和方法的访问权限、行为和特性。本文将详细介绍Java中常见的修饰符及其用途。 1. **类的修饰符** - **public**: 公共访问控制符,允许任何地方的...

    extern_volatile等修饰符的用法

    static修饰符用于声明静态变量或静态成员函数。 1. 静态变量 静态变量的作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,可以被修改。 2. 函数内部的静态变量 函数内部的静态变量...

    JS中的public和private对象,即static修饰符

    在C#等静态类型语言中,public、private和static是访问修饰符,用于控制类成员的可见性和作用域。而在JavaScript中,由于其原型继承的特性,我们通常使用函数作用域和闭包来模拟这些行为。 下面我们将基于提供的...

    java修饰符的使用.pdf

    3. 静态类(static):static 修饰符修饰的类称为静态类,静态类可以在定义时初始化成员变量和方法。 在 Java 中,修饰符的使用是非常重要的,合理地使用修饰符可以提高程序的安全性和可维护性。但是,过多地使用 ...

    C语言中的类型修饰符

    C语言作为一种静态类型的编程语言,提供了多种类型修饰符来帮助开发者更好地控制变量的行为和特性。本文将详细介绍C语言中的三种重要类型修饰符:`const`、`static` 和 `volatile`。 #### 二、`const`修饰符详解 `...

    浅析php变量修饰符static的使用

    总的来说,PHP中的static修饰符用于声明静态变量,具有在函数调用间保持状态信息的能力,但在声明时需要注意不能使用动态表达式作为初始值,同时也要注意静态变量的生命周期和内存占用问题。静态变量是PHP编程中一个...

    Java修饰符总结

    其中,访问控制符用于控制类、方法和变量的可访问性范围,而非访问控制符则用于提供额外的功能,如抽象、静态、同步等。 #### 访问控制符 访问控制符包括`public`、`protected`、`private`和默认(无修饰符)。...

Global site tag (gtag.js) - Google Analytics