[javase学习笔记]-8.3 statickeyword使用的注意细节
2017-08-18 17:45
411 查看
这一节我们看静态在使用过程中应注意的几个细节。
上一节我们在学习成员变量与静态变量的差别时,对于两种变量的调用方式不同一时候出现了“无法从静态上下文中訪问非静态变量”的错误。这个问题我们在以后会常常遇到。那么这是什么问题呢?我们从样例说起。我们把上一节中的Person类中方法printInfo进行静态修饰:
结果:
我们看到了一个和上一节全然同样的错误。而当我们把方法进行改动:
结果:
我们看到当把printInfo方法中的非静态变量name去掉之后,程序正常执行,因此我们能够总结出statickeyword使用中的一个常见问题,即:
第一个细节:静态方法中不能调用非静态成员,仅仅能调用静态成员.这是因为我们知道静态成员是随着类的载入而存在,是先于对象存在的,而非静态的成员变量是随着对象的创建而存在,所以当我们在静态方法中调用非静态成员时,还没有创建对象,当然就不存在非静态变量.比方我们上面的样例,静态方法printInfo和静态变量country都会随着Person类的载入而载入,而成员变量name仅仅有随着Person对象的创建才会存在,当我们在静态方法中直接调用name时,此时根本就不存在,当然会出错.
当然对于这个细节,也能够说是静态方法的一个局限性.非静态方法既能够訪问静态成员,也能够訪问非静态成员.
我们再看下一个比較常见的问题.
第二个细节:静态方法中不能够使用this或者superkeyword.原因当然能够用静态的特点解释,super我们还没有学习,这里暂不说明,就拿thiskeyword来说,我们说this代表对象,那么当我们在静态方法中使用this时,this代表的就是当前类的实例,而静态方法和类是一起存在的,而该类的对象并不存在,所以会出错.我们看一个样例:
结果:
我们非常清楚的就看到这是不合法的.
第三个细节:主函数是静态的.这个我们大家肯定都不陌生,我们从開始学习就在搞main函数,它的正确格式是:
我们会发现我们没实用好第一个细节,所以我们进一步改动:
哦,另一个非静态成员变量,再一次改动:
这个过程真麻烦哦,那么我们是不是要在主函数中调用的成员都是静态的呢?假设真是这样,那么要对象干什么呢?
我们知道主函数是程序的入口,对于面向对象语言,那么主函数也就对象訪问的入口,是指挥对象工作的,假设没有对象不知道有多么可怕啊.
我们之前学习了两种调用方式,一种是通过类名调用,而还有一种方式就是通过对象调用,那么我们为了规避静态的局限性,我们把上面的方法进行非静态化,而且通过对象去调用:
第四个细节:在本类中,非静态成员前面省略的是this,而在静态成员前面省略的却是类名.比方上面的代码,实际上在Person类中,成员变量name前面省略的this,即this.name,而在静态变量country前面省略的类名Person,即Person.country,这一点我们在以后的使用多注意就能够了.
上一节我们在学习成员变量与静态变量的差别时,对于两种变量的调用方式不同一时候出现了“无法从静态上下文中訪问非静态变量”的错误。这个问题我们在以后会常常遇到。那么这是什么问题呢?我们从样例说起。我们把上一节中的Person类中方法printInfo进行静态修饰:
class Person { String name;//姓名。这是一个成员变量 static String country = "中国";//国籍。这是一个静态变量 public static void printInfo() { System.out.println(name+":"+country); } } class StaticTest { public static void main(String[] args) { Person p = new Person(); p.name = "小强"; p.printInfo(); } }
结果:
我们看到了一个和上一节全然同样的错误。而当我们把方法进行改动:
public static void printInfo() { System.out.println(":"+country); }
结果:
我们看到当把printInfo方法中的非静态变量name去掉之后,程序正常执行,因此我们能够总结出statickeyword使用中的一个常见问题,即:
第一个细节:静态方法中不能调用非静态成员,仅仅能调用静态成员.这是因为我们知道静态成员是随着类的载入而存在,是先于对象存在的,而非静态的成员变量是随着对象的创建而存在,所以当我们在静态方法中调用非静态成员时,还没有创建对象,当然就不存在非静态变量.比方我们上面的样例,静态方法printInfo和静态变量country都会随着Person类的载入而载入,而成员变量name仅仅有随着Person对象的创建才会存在,当我们在静态方法中直接调用name时,此时根本就不存在,当然会出错.
当然对于这个细节,也能够说是静态方法的一个局限性.非静态方法既能够訪问静态成员,也能够訪问非静态成员.
我们再看下一个比較常见的问题.
第二个细节:静态方法中不能够使用this或者superkeyword.原因当然能够用静态的特点解释,super我们还没有学习,这里暂不说明,就拿thiskeyword来说,我们说this代表对象,那么当我们在静态方法中使用this时,this代表的就是当前类的实例,而静态方法和类是一起存在的,而该类的对象并不存在,所以会出错.我们看一个样例:
class Person { String name; static String country = "中国"; public static void printInfo() { System.out.println(this.name+":"+country); } }
结果:
我们非常清楚的就看到这是不合法的.
第三个细节:主函数是静态的.这个我们大家肯定都不陌生,我们从開始学习就在搞main函数,它的正确格式是:
public static void main(String[] args)那么我们再来看一个样例:
class StaticTest { int num = 4; public static void main(String[] args) { printNum(); } public void printNum() { System.out.println(num); } }结果:
我们会发现我们没实用好第一个细节,所以我们进一步改动:
class StaticTest { int num = 4; public static void main(String[] args) { printNum(); } public static void printNum() { System.out.println(num); } }结果:
哦,另一个非静态成员变量,再一次改动:
这个过程真麻烦哦,那么我们是不是要在主函数中调用的成员都是静态的呢?假设真是这样,那么要对象干什么呢?
我们知道主函数是程序的入口,对于面向对象语言,那么主函数也就对象訪问的入口,是指挥对象工作的,假设没有对象不知道有多么可怕啊.
我们之前学习了两种调用方式,一种是通过类名调用,而还有一种方式就是通过对象调用,那么我们为了规避静态的局限性,我们把上面的方法进行非静态化,而且通过对象去调用:
class StaticTest { int num = 4; public static void main(String[] args) { new StaticTest().printNum(); } public void printNum() { System.out.println(num); } }而且程序正常执行了.
第四个细节:在本类中,非静态成员前面省略的是this,而在静态成员前面省略的却是类名.比方上面的代码,实际上在Person类中,成员变量name前面省略的this,即this.name,而在静态变量country前面省略的类名Person,即Person.country,这一点我们在以后的使用多注意就能够了.
相关文章推荐
- [javase学习笔记]-8.5 statickeyword的使用场景
- [javase学习笔记]-7.10 static关键字使用的注意细节
- [javase学习笔记]-7.12 static关键字的使用场景
- [javase学习笔记]-7.5 构造函数需要注意的几个细节
- [javase学习笔记]-7.5 构造函数须要注意的几个细节
- 韩顺平_php从入门到精通_视频教程_第13讲_选择器使用细节_块元素和行内元素_盒子模型_盒子模型经典应用①_学习笔记_源代码图解_PPT文档整理
- JAVASE学习笔记三——this,static
- Python 学习笔记【使用元组的注意点】
- C#学习笔记29——c#使用word、excel、pdf
- javasE学习笔记:关键字super的使用
- SilverLight商业应用程序开发---学习笔记(9)从摘要信息跳转到详细信息 导航到细节视图 在弹出窗体打开细节视图 使用DataGrid控件的行细节显示特性显示细节内容 主/从视图的实现
- JavaSE视频学习阶段性总结 一(java入门,原生数据类型及使用注意,运算符)
- SQL中like关键字结合SqlParameter使用时的注意事项(学习笔记)
- golang学习笔记――细节注意
- Cocos2dx 学习笔记28 使用CCCamera注意事项
- Spark学习笔记-如何运行wordcount(使用jar包)
- 学习WP7应用开发的笔记--在App和Page中使用资源集合的注意点1
- [学习笔记]寄存器使用注意事项
- Java学习笔记(十五)——javadoc学习笔记和可能的注意细节
- word的使用学习笔记(一)