这一节我们看静态在使用过程中应注意的几个细节。

上一节我们在学习成员变量与静态变量的差别时,对于两种变量的调用方式不同一时候出现了“无法从静态上下文中訪问非静态变量”的错误。这个问题我们在以后会常常遇到。那么这是什么问题呢?我们从样例说起。我们把上一节中的Person类中方法printInfo进行静态修饰:

  1. class Person
  2. {
  3. String name;//姓名。这是一个成员变量
  4. static String country = "中国";//国籍。这是一个静态变量
  5.  
  6. public static void printInfo()
  7. {
  8. System.out.println(name+":"+country);
  9. }
  10. }
  11.  
  12. class StaticTest
  13. {
  14. public static void main(String[] args)
  15. {
  16. Person p = new Person();
  17. p.name = "小强";
  18. p.printInfo();
  19. }
  20. }

结果:

我们看到了一个和上一节全然同样的错误。而当我们把方法进行改动:

  1. public static void printInfo()
  2. {
  3. System.out.println(":"+country);
  4. }

结果:

我们看到当把printInfo方法中的非静态变量name去掉之后,程序正常执行,因此我们能够总结出statickeyword使用中的一个常见问题,即:

第一个细节:静态方法中不能调用非静态成员,仅仅能调用静态成员.这是因为我们知道静态成员是随着类的载入而存在,是先于对象存在的,而非静态的成员变量是随着对象的创建而存在,所以当我们在静态方法中调用非静态成员时,还没有创建对象,当然就不存在非静态变量.比方我们上面的样例,静态方法printInfo和静态变量country都会随着Person类的载入而载入,而成员变量name仅仅有随着Person对象的创建才会存在,当我们在静态方法中直接调用name时,此时根本就不存在,当然会出错.

当然对于这个细节,也能够说是静态方法的一个局限性.非静态方法既能够訪问静态成员,也能够訪问非静态成员.

我们再看下一个比較常见的问题.

第二个细节:静态方法中不能够使用this或者superkeyword.原因当然能够用静态的特点解释,super我们还没有学习,这里暂不说明,就拿thiskeyword来说,我们说this代表对象,那么当我们在静态方法中使用this时,this代表的就是当前类的实例,而静态方法和类是一起存在的,而该类的对象并不存在,所以会出错.我们看一个样例:

  1. class Person
  2. {
  3. String name;
  4. static String country = "中国";
  5.  
  6. public static void printInfo()
  7. {
  8. System.out.println(this.name+":"+country);
  9. }
  10. }

结果:

我们非常清楚的就看到这是不合法的.

第三个细节:主函数是静态的.这个我们大家肯定都不陌生,我们从開始学习就在搞main函数,它的正确格式是:

  1. public static void main(String[] args)

那么我们再来看一个样例:

  1. class StaticTest
  2. {
  3. int num = 4;
  4. public static void main(String[] args)
  5. {
  6. printNum();
  7. }
  8. public void printNum()
  9. {
  10. System.out.println(num);
  11. }
  12. }

结果:

我们会发现我们没实用好第一个细节,所以我们进一步改动:

  1. class StaticTest
  2. {
  3. int num = 4;
  4. public static void main(String[] args)
  5. {
  6. printNum();
  7. }
  8. public static void printNum()
  9. {
  10. System.out.println(num);
  11. }
  12. }

结果:

哦,另一个非静态成员变量,再一次改动:

这个过程真麻烦哦,那么我们是不是要在主函数中调用的成员都是静态的呢?假设真是这样,那么要对象干什么呢?

我们知道主函数是程序的入口,对于面向对象语言,那么主函数也就对象訪问的入口,是指挥对象工作的,假设没有对象不知道有多么可怕啊.

我们之前学习了两种调用方式,一种是通过类名调用,而还有一种方式就是通过对象调用,那么我们为了规避静态的局限性,我们把上面的方法进行非静态化,而且通过对象去调用:

  1. class StaticTest
  2. {
  3. int num = 4;
  4. public static void main(String[] args)
  5. {
  6. new StaticTest().printNum();
  7. }
  8. public void printNum()
  9. {
  10. System.out.println(num);
  11. }
  12. }

而且程序正常执行了.

第四个细节:在本类中,非静态成员前面省略的是this,而在静态成员前面省略的却是类名.比方上面的代码,实际上在Person类中,成员变量name前面省略的this,即this.name,而在静态变量country前面省略的类名Person,即Person.country,这一点我们在以后的使用多注意就能够了.

[javase学习笔记]-8.3 statickeyword使用的注意细节的更多相关文章

  1. [javase学习笔记]-8.1 statickeyword之特点

    这一节我们来学习java语言中一个新的keyword就是statickeyword. 当然对于每个keyword,我们都要明白的是它有什么作用,怎么用.我们先来看一个样例: class Person ...

  2. [javase学习笔记]-8.5 statickeyword的使用场景

    这一节我们来看一下在我们开发的过程中,在什么时候我们要用到statickeyword进行静态修饰. 我们这里所说的静态.无非就是两种.一种是静态变量,一种是静态函数,我们分这两种情况进行说明stati ...

  3. javaSE学习笔记(17)---锁

    javaSE学习笔记(17)---锁 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读 ...

  4. javaSE学习笔记(16)---网络编程

    javaSE学习笔记(16)---网络编程 基本概念 如今,计算机已经成为人们学习.工作.生活必不可少的工具.我们利用计算机可以和亲朋好友网上聊天,也可以玩网游.发邮件等等,这些功能实现都离不开计算机 ...

  5. javaSE学习笔记(15) ---缓冲流、转换流、序列化流

    javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...

  6. JavaSE学习笔记(14)---File类和IO流(字节流和字符流)

    JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...

  7. JavaSE学习笔记(13)---线程池、Lambda表达式

    JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...

  8. JavaSE学习笔记(12)---线程

    JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  9. javaSE学习笔记(11)--- Map

    javaSE学习笔记(11)--- Map 1.Map集合 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Jav ...

随机推荐

  1. HttpWebRequest 对象池 HTTP协议 HttpWebRequest和 Socket的一点总结

    相信接触过网络开发的人对HTTP.HttpWebRequest.Socket这些东西都不陌生吧.它们之间的一些介绍和关系我这里都忽略了.开我们平时开发过程中也是很少有机会接触大什么大并发这个东东,一般 ...

  2. Reverse Words in a String leetcode java

    题目: Given an input string, reverse the string word by word. For example, Given s = "the sky is ...

  3. ODBC更新记录集提示”记录集为只读“

    创建的ODBC应用程序默认的记录集不具有只读属性,但是再更新记录表时会提示”记录集为只读“,这是为什么呢? 今天看书找到了答案: 因为MFC中的数据库类不支持需要连接两个或者多个表的记录集更新,如果选 ...

  4. 文本分类需要CNN?No!fastText完美解决你的需求(后篇)

    http://blog.csdn.net/weixin_36604953/article/details/78324834 想必通过前一篇的介绍,各位小主已经对word2vec以及CBOW和Skip- ...

  5. JAVA-找不到元素 'beans' 的声明

    问题: Tomcat启动时,spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseExceptio ...

  6. JPA(二):HellWord工程

    使用JPA持久化对象的操作步骤: 1)创建persistence.xml,在这个文件中配置持久化单元: --- 需要指定跟哪个数据库进行交互: --- 需要指定JPA使用哪个持久化的框架以及配置该框架 ...

  7. unity3d shader 学习

    [浅墨Unity3D Shader编程] 着色器参考 [Unity Shaders]

  8. 关于Linux路由表的route命令

    转自:http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 查看 Linux 内核路由表 使用下面的 route 命令可以查看 Lin ...

  9. python抓取数据,python使用socks代理抓取数据

    在python中,正常的抓取数据直接使用urllib2 这个模块: import urllib2 url = 'http://fanyi.baidu.com/' stream = urllib2.ur ...

  10. LintCode: Single Number

    C++ (1)异或操作 3^3=0 (2)for (auto &i : Obejuct) {} class Solution { public: /** * @param A: Array o ...