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

上一节我们在学习成员变量与静态变量的差别时,对于两种变量的调用方式不同一时候出现了“无法从静态上下文中訪问非静态变量”的错误。这个问题我们在以后会常常遇到。那么这是什么问题呢?我们从样例说起。我们把上一节中的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.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. HTTPS那些事(三)攻击实例与防御

    在<HTTPS那些事(二)SSL证书>我描述了使用SSL证书时一些需要注意的安全问题,在这一篇文章里面我再演示一下针对HTTPS攻击的一些实例,通过这些实例能更安全的使用HTTPS.知己知 ...

  2. Tiny210 U-BOOT(二)----配置时钟频率基本原理

    U-BOOT在启动的过程中,需要配置系统时钟. 配置系统时钟,大概是以下几个步骤: (1)设置系统PLL锁定时间 (2)配置PLL (3)配置各模块分频系数 (4)切换到PLL时钟 1.基本原理 首先 ...

  3. Multiply Strings leetcode java

    题目: Given two numbers represented as strings, return multiplication of the numbers as a string. Note ...

  4. Angular2 -- 生命周期钩子

    组件生命周期钩子 指令和组件的实例有一个生命周期:新建.更新和销毁. 每个接口都有唯一的一个钩子方法,它们的名字是由接口名加上 ng前缀构成的.比如,OnInit接口的钩子方法叫做ngOnInit. ...

  5. printf()详解之终极无惑

    1.printf()简介 printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出.标准输出,即标准输出文件,对应终端的屏幕.printf()申明于头文件stdio.h. 函数原型: ...

  6. 在SAE分布式服务上开发需要解决的问题

    这是在开发“幸运猜数”微信游戏的时候遇到的问题 对游戏感兴趣的,可以关注微信公众ID: EasyTool 回复[幸运猜数]开始游戏 之前提供的功能:[黄金][双色球][记事]等,都是无状态服务 而开发 ...

  7. AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法

    AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法 2018-01-18 16:13蚂蚁金服/雾霾/人工智能 导读:词向量算法是自然语言处理领域的基础算法,在序列标注.问答系统和机 ...

  8. js 正则表验证输入

    输入1-9的整数 <input type="text" class="form-control" style="width: 60px;disp ...

  9. protobuf-c的学习总结

    1.前言 项目中用到protobuf-c进行数据序列化,好处在于后期程序扩展性非常好,只需要改动proto的定义就可以保持兼容,非常的灵活方便.关于protobuf-c的详细介绍可以参考google官 ...

  10. ios 内存管理总结

    在ios 中 项目有两个内存管理方式 第一种,arc 方式,编译器编译时,自动给obj 加上 release  实现要求 1. 设置项目 将 Objective-C Automatic Referen ...