(注:静态变量修改为静态成员变量,静态方法改为静态成员方法)

静态成员变量又称类变量,静态成员方法又称类方法,它们统称为静态成员或类成员。静态成员由static修饰,是属于整个类的,所有的对象共享这些静态成员。不需要创建任何对象,静态成员在类装载时就已初始化了,整个运行期间其内存位置不变,直到类卸载。鉴于静态成员的这些特性,访问静态成员变量以及定义或调用静态成员方法时与非静态成员也有不同之处。下面分别做出说明。

1.静态成员变量

  • 类的非静态成员方法、静态成员方法都可以直接访问静态成员变量
  • 其他类要访问某个类的静态成员变量,既可以通过实例名访问,也可以直接用类名来访问,推荐用类名访问的方式,这样能更直观的说明访问的变量是静态成员变量

2.静态方法

  • 不能直接访问非静态成员变量,也不能直接调用非静态成员方法,需要实例化一个对象,再通过该对象来访问要访问的非静态成员变量或要调用的非静态成员方法。也就是说,静态成员方法不能直接使用非静态成员。个人理解是,非静态成员变量是依托对象而存在的,当没有实例一个对象时,非静态成员变量是没有分配内存空间的,静态方法要使用非静态成员变量不知道要到哪里去找,当然就不能直接使用非静态成员变量了。而非静态成员方法有有可能访问非静态成员变量,所以也不能直接调用非静态成员方法了。
  • 其他类要调用某个类的静态成员方法,既可以通过实例名调用,也可以直接用类名来调用,推荐用类名调用的方式,这样能更直观的说明调用的方法是静态成员方法

3.下面以简单的代码验证上面的结论

定义了一个Person类,类的代码见最后面。

(1).类的静态成员方法和非静态成员方法都可以直接访问静态成员变量

  • 静态成员方法staticMethod访问了静态成员变量citizenship
  • 定义并使用了局部变量testY
  • 非静态成员方法informationPrint访问了静态成员变量citizenship

staticMethod()方法如下:

public static void staticMethod() {
int testY = 20; System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
}

informationPrint()方法如下:

	public void informationPrint() {
System.out.println("My name is " + getName());
System.out.println("I am " + getAge() + " years old"); if(getGender() == "female")
System.out.println("I am a girl");
else
if(getGender() == "male")
System.out.println("I am a boy");
else
System.out.println("Something is wrong!");
System.out.println("My hobby is " + hobby); if(citizenship == "Chinese")
System.out.println("I am a chinese");
else
if(citizenship == "US")
System.out.println("I am an American");
else
System.out.println("Oh,something is wrong");
} 

main()方法如下:

public static void main(String[] args) {
Person xiaoxi = new Person("xiaoxi",29,"female","piano"); xiaoxi.informationPrint(); staticMethod();
}

输出结果如下:

My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
She has applied for Chinese citizenship
She's now 20 years old

结果分析:

  • 静态成员方法可以直接访问静态成员变量
  • 静态成员方法可以自定义局部变量
  • 非静态成员方法可以直接访问静态成员变量

(2),静态成员方法不可以直接访问非静态成员变量

 [1].staticMethod直接访问静态成员变量citizenship,出现错误

  • 静态成员方法staticMethod访问了静态成员变量citizenship
  • 定义并使用了局部变量testY
  • 访问了非静态成员变量hobby

staticMethod()方法如下:

public static void staticMethod() {
int testY = 20; System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
System.out.println("She doesn't like " + hobby); //nonstatic variable access
}

main方法同上。

输出结果如下:

My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non-static field hobby at human.Person.staticMethod(Person.java:99)
at human.Person.main(Person.java:107)

结果分析:

  • 静态成员方法不能直接访问非静态成员变量,否则会出现“Cannot make a static reference to the non-static field hobby” 的错误。

 [2].staticMethod()创建一个对象testP,由testP访问非静态成员变量hobby,成功执行

  • 静态成员方法staticMethod使用了静态成员变量citizenship
  • 定义并使用了局部变量testY
  • 创建一个Person实例testP,并使用了testP的变量hobby

staticMethod()方法如下:

public static void staticMethod() {
int testY = 20;
Person testP = new Person(); System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
System.out.println("She doesn't like " + testP.hobby); // nonstatic variable access via object instance testP
}

main方法同上。

输出结果如下:

My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
She has applied for Chinese citizenship
She's now 20 years old
She doesn't like null

结果分析:

  • 静态成员方法要访问非静态成员变量,可以先实例化一个对象,再通过对象访问。

(3),静态成员方法不可以直接调用非静态成员方法

 [1].staticMethod()直接访问非静态成员方法informationPrint(),出现错误

  • 静态成员方法staticMethod使用了静态成员变量citizenship
  • 定义并使用了局部变量testY
  • 创建一个Person实例testP,并使用了testP的hoppy变量
  • 直接调用非静态成员方法informationPrint()

staticMethod()方法如下:

	public static void staticMethod() {
int testY = 20;
Person testP = new Person(); System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
//System.out.println("She doesn't like " + testP.hobby); //nonstatic variable access
System.out.println("She doesn't like " + testP.hobby); // nonstatic variable access via object instance testP
System.out.println("Her personal information is as follows:");
informationPrint();
}

main()方法同上。

输出结果如下:

My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non-static method informationPrint() from the type Person at human.Person.staticMethod(Person.java:103)
at human.Person.main(Person.java:111)

结果分析:

  • 静态成员方法不能直接调用非静态成员方法,否则会出现与直接访问非静态成员变量类似的错误,Cannot make a static reference to the non-static method informationPrint() from the type Person。

 [2].通过已有对象testP来调用informationPrint()方法,成功执行

  • 静态成员方法staticMethod使用了静态成员变量citizenship
  • 定义并使用了局部变量testY
  • 创建一个Person实例testP,并使用了testP的hoppy变量
  • 通过testP调用非静态成员方法informationPrint()

staticMethod()方法如下:

	public static void staticMethod() {
int testY = 20;
Person testP = new Person(); System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
System.out.println("She doesn't like " + testP.hobby); // nonstatic variable access via object instance testP
System.out.println("Her personal information is as follows:");
//informationPrint();
testP.informationPrint();
}

main()方法同上。

输出结果如下:

My name is xiaoxi
I am 29 years old
I am a girl
My hobby is piano
I am a chinese
She has applied for Chinese citizenship
She's now 20 years old
She doesn't like null
Her personal information is as follows:
My name is null
I am 0 years old
Something is wrong!
My hobby is null
I am a chinese

结果分析:

  • 静态成员方法要调用非静态成员方法,可以先实例化一个对象,再通过该对象来调用。

(4).其他类通过类名直接调用类的静态成员变量和静态成员方法

  • 类TestMain通过类名Person直接调用了静态成员方法staticMethod()和静态成员变量citizenship

TestMain如下:

package human;

public class TestMain {

	public static void main(String[] args) {
Person.staticMethod();
System.out.println("static variable \"citizenship\":" + Person.citizenship); } }

输出结果如下:

She has applied for Chinese citizenship
She's now 20 years old
She doesn't like null
Her personal information is as follows:
My name is null
I am 0 years old
Something is wrong!
My hobby is null
I am a chinese
static variable "citizenship":Chinese

  

附Person类:

package human;

public class Person {
String name;
int age;
String gender; private String hobby;
protected String residence; static String citizenship = "Chinese"; public Person() { } public Person(String n, String g) {
this.name = n;
this.gender = g;
} public Person(String n, int a, String g, String h) {
this.name = n;
this.age = a;
this.gender = g;
this.hobby = h; //test:静态变量初始化的时机是否在构造方法之前
// System.out.println("constructor:");
// System.out.println("change value of the static variable citizenship " + "\"" + citizenship + "\"");
// citizenship = "US";
// System.out.println(" to " + "\"" + citizenship + "\"");
} public Person(String n, int a, String g, String h, String r) {
this.name = n;
this.age = a;
this.gender = g;
this.hobby = h;
this.residence = r;
} public void setName(String n) {
this.name = n;
} public void setAge(int a) {
this.age = a;
} public void setGender(String g) {
this.gender = g;
} public void setHobby(String h) {
this.hobby = h;
} public void setResidence(String r) {
this.residence = r;
} public String getName() {
return this.name;
} public int getAge() {
return this.age;
} public String getGender() {
return this.gender;
} public String getHobby() {
return this.hobby;
} public String getResidence() {
return this.residence;
} public void informationPrint() {
System.out.println("My name is " + getName());
System.out.println("I am " + getAge() + " years old"); if(getGender() == "female")
System.out.println("I am a girl");
else
if(getGender() == "male")
System.out.println("I am a boy");
else
System.out.println("Something is wrong!");
System.out.println("My hobby is " + hobby); if(citizenship == "Chinese")
System.out.println("I am a chinese");
else
if(citizenship == "US")
System.out.println("I am an American");
else
System.out.println("Oh,something is wrong");
} public static void staticMethod() {
int testY = 20;
Person testP = new Person(); System.out.println("She has applied for " + citizenship + " citizenship"); //static variable access
System.out.println("She's now " + testY + " years old"); //local variable access
System.out.println("She doesn't like " + testP.hobby); // nonstatic variable access via object instance testP
System.out.println("Her personal information is as follows:");
//informationPrint();
testP.informationPrint();
} public static void main(String[] args) {
Person xiaoxi = new Person("xiaoxi",29,"female","piano"); xiaoxi.informationPrint(); staticMethod();
}
}

  

Java学习笔记8---类的静态成员变量与静态成员方法的访问与调用方式的更多相关文章

  1. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  2. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  3. 0018 Java学习笔记-面向对象-类的基本要素

    类与对象 大街上一个个的人,就是一个个对象 类是对一群对象的抽象,比如人都有性别.年龄.姓名,都会吃饭.睡觉等.姓名性别可以抽象为变量,吃饭睡觉可以抽象为方法,像下面一样定义个类来形容人 public ...

  4. java学习笔记(六):变量类型

    java一共三种变量: 局部变量(本地变量):方法调用时创建,方法结束时销毁 实例变量(全局变量):类创建时创建,类销毁时销毁 类变量(静态变量):程序启动是创建,程序销毁时销毁 public cla ...

  5. Java学习笔记-枚举类

    实例有限且固定的类成为枚举类 枚举类的实现 早期时候的实现形式: public static final int SEASON_SPRING = 1; public static final int ...

  6. Java基础笔记(七)—— 成员变量、静态变量、局部变量

    public class Test { int c; //成员变量(实例变量) static int s1; //静态变量(类变量)(全局变量) public static void main(Str ...

  7. Java学习笔记 04 类和对象

    一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...

  8. Java学习笔记-File类的基本方法

    要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...

  9. Java学习笔记-嵌套类

    嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...

随机推荐

  1. springMVC(1)---获取前段数据

    springMVC(1)---获取前段数据 首先说明,如果你学过Struts2,那么在学springMVC就会简单很多,我也不最基础的开始写了,我前篇文章搭建了个ssm框架,算是springmvc入门 ...

  2. Struts框架的国际化

    本文将通过一个详细的实例来展示Struts框架的国际化,使用的版本号是struts1.1. 案例:在一个页面上有一个下拉框,下拉框中有3个国家的语言选项,各自是"中文简体".&qu ...

  3. 一、OpenStack入门 之 初步认识

    OpenStack入门 之 初步认识 写在前面 从 OpenStack 基础知识開始学起,剖析 OpenStack 架构.分析 OpenStack 的各个组件的功能.原理和用法,通过实战演练来掌握 O ...

  4. linux命令的排列、替换与别名

    命令的排列; 1.使用";" 命令语法: 命令1;命令2 当运行该命令时,无论命令1是否出错.接下来就运行命令2 2.使用"&&" 命令语法:命 ...

  5. C语言之——文件操作模式

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47450667 "rt" 仅仅读打开一个文本文件.仅仅同意读数据 ...

  6. Zend_Json 简介 --(手冊)

    1.  简单介绍 Zend_Json 提供一个方便的方式来串联(native的)PHP(的变量)和JSON,并将JSON(对象)解码到PHP中. 2.  基本使用方法 Zend_Json的使用包含使用 ...

  7. kafka入门样例 for java

    1,生产者 import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.Key ...

  8. Git(二)Git几个区的关系与Git和GitHub的关联

    前言 前面只是大概的介绍了一点基础的东西,接下来会更加深入的去了解一下Git. 一.Git的工作区.暂存区和版本库之间的区别和联系 1)工作区 在PC中能看得到的创建的一个管理仓库的目录.比如目录下G ...

  9. 自学Python4.2 迭代器、生成器

    迭代器.生成器一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后退.另外 ...

  10. 自学Python3.2-函数分类

    函数的分类 内置函数,自定义函数,匿名函数 一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html ...