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

静态成员变量又称类变量,静态成员方法又称类方法,它们统称为静态成员或类成员。静态成员由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. 我的第一个python web开发框架(18)——前台页面与接口整合

    由于我们前后台系统没有分开,所以前台页面调用接口时,可以直接使用后台管理系统已经完成的接口,不过后台管理系统接口的访问加上了登录验证,所以需要将前台要用到的接口进行处理,让它们设置到白名单当中 我们打 ...

  2. Asteroids!-裸的BFS

    G - Asteroids! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Subm ...

  3. NYOJ15-括号匹配(二)-区间DP

    pid=15">http://acm.nyist.net/JudgeOnline/problem.php? pid=15 dp[i][j]表示从i到j至少须要加入多少个括号才干满足匹配 ...

  4. habase单机版安装及基本功能演示

    本文所使用的Linux发行版本为:CentOS Linux release 7.4.1708 (Core) 准备工作 创建用户 useradd -m hadoop passwd hadoop 下载安装 ...

  5. 从0开始做垂直O2O个性化推荐-以58到家美甲为例

    从0开始做垂直O2O个性化推荐 上次以58转转为例,介绍了如何从0开始如何做互联网推荐产品(回复"推荐"阅读),58转转的宝贝为闲置物品,品类多种多样,要做统一的宝贝画像比较难,而 ...

  6. path和classpath细节

    从学习java的最初我们就被要求先设置path变量和classpath变量.但是这两个环境变量到底有什么作用呢? 1.path环境变量 path环境变量的主要作用是告诉操作系统到哪里去寻找某个程序,如 ...

  7. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  8. 百度地图点集文档使用python的re模块处理成json的相关写法

    这个实在不好起名字.写这个还不是因为被渣度坑的不要不要的.为什么说他坑呢.参考一下这两个截图的txt文档: 文档资源下载地址:  http://lbsyun.baidu.com/index.php?t ...

  9. Asp.Net Web API(三)

    Routing Tables路由表 在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action.当Web API接 ...

  10. ERROR: ORA-12560: TNS: 协议适配器错误,解决办法:启动OracleServiceORCL服务