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

静态成员变量又称类变量,静态成员方法又称类方法,它们统称为静态成员或类成员。静态成员由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. 用shell制作IP脚本

    vim  ip.sh #!/bin/bashread -p "eth:" eread -p "ip:" ip1read -p "netmask:&qu ...

  2. OpenXml读取word内容(一)

    OpenXml读取word内容注意事项 1.使用OpenXml读取word内容,word后缀必须是".docx":如果word后缀是".doc"需要转成&quo ...

  3. [Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度

    多值字段(Multivalue Fields) 在多值字段上使用短语匹配会产生古怪的行为: PUT /my_index/groups/1 { "names": [ "Jo ...

  4. telematics product and company in China

    持续更新中. 总的来看后装OBD市场日渐繁荣,可是应用深度不够:前装infotainment受限于产量和商业模式,举步维艰. 车联网作为汽车信息化的起点,会有泡沫,也会在大数据和物联网的浪潮中逐步积淀 ...

  5. 知乎APP---案例分析

    产品: 这次我选择用来做案例分析的是--知乎. 知乎可以说是中文互联网最大的知识社交平台,拥有认真.专业和友善的独特气氛,分享用户间彼此的专业知识.经验和见解.因而在日常生活中,我用知乎搜索答案的概率 ...

  6. Intellij IDEA 4种配置热部署的方法

    热部署可以使的修改代码后,无须重启服务器,就可以加载更改的代码. 第1种:修改服务器配置,使得IDEA窗口失去焦点时,更新类和资源 菜单Run -> EditConfiguration , 然后 ...

  7. 《程序设计实践》【PDF】下载

    <程序设计实践>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196319 内容简介 本书从排错.测试.性能.可移植性.设计.界面. ...

  8. 图片验证码(Struts2中使用)

    写在前面: 最近在项目中做了一个登录页面,用到了图片验证码的功能,所以记录一下.方便之后再有用到,直接拿来用即可.其实图片验证码的生成都是有固定步骤的,网上也有很多的例子,有的时候,如果不想深究,都是 ...

  9. COM_第四讲_保存GUID_优化使用代码

    优化以前的代码,让使用者更方便 一丶 优化思路 1.我们可以将我们写的GUID(类工厂的ID)保存到注册表中,并且保存一下DLL的文件路径,遍历注册表去DLL路径即可. 2.每个类工厂我们就要使用一个 ...

  10. lesson - 9 Linux系统软件包管理

    1. rpm工具rpm Redhat Package Manager, 设计理念是开放的,不仅仅是在RedHat平台上,在SUSE上也是可以使用的. rpm包名字构成由-和.分成了若干部分,如abrt ...