关键字static作用如下:

  1. 为某个基本数据类型或对象分配单一的存储空间。

  2. 实现某个属性或方法与类关联。在类被加载后类名可以直接调用静态成员方法(下面简称静态方法)或者访问静态成员变量(下面简称静态成员变量)。对象也可以做到。

  有4种使用情况:

  1. 静态属性即静态成员变量

  2. 静态方法

  3. 静态代码块

  4. 静态成员类

 

  静态方法

  因为静态方法不依赖于对象,所以静态方法内部不能使用this。因为非静态方法和非静态成员变量依赖于对象,所以静态方法内部不能调用非静态方法或者访问非静态成员变量。而非静态方法内部可以调用静态方法或者访问静态成员变量。静态方法只能定义在顶级类(不同于内部类)或者静态内部类里面。

  空对象调用静态方法:

 public class NullInvoker {

     public static void testNullInvoker(){
System.out.println("in testNullInvoker");
} public static void main(String[] args) {
NullInvoker NULL = null; // 虽然这里是空指针,但是下面依然可以执行下去
NULL.testNullInvoker(); // 正常运行
} }

  结果:

 in testNullInvoker

  静态方法不能被重写:

 public class TestStaticMethod {

     public static void main(String[] args) {
SubClass s = new SubClass();
Parent p = s;
p.testStatic(); // 打印父类方法
s.testStatic(); // 打印子类方法
} } class Parent { public static void testStatic() {
System.out.println("父类方法");
} } class SubClass extends Parent { public static void testStatic() {
System.out.println("子类方法 ");
} }

  结果:

 父类方法
子类方法

  静态成员变量

  静态成员变量和非静态成员变量的区别是:静态成员变量被所有的对象所共享,在内存中只有一个副本,在类被加载时会被初始化。而非静态成员变量是单个对象所独有,在创建对象时被初始化,存在多个副本,各个对象拥有的副本互不影响。

  

  静态代码块

  仅在类被加载时会执行静态代码块。任何方法内部都不能使用静态代码块。

  

  注意:Java语法规定static不能修饰局部变量。

  

  笔试题

  这段代码的输出结果是什么?

 public class Test {
Person person = new Person("Test");
static{
System.out.println("test static");
} public Test() {
System.out.println("test constructor");
} public static void main(String[] args) {
new MyClass();
}
} class Person{
static{
System.out.println("person static");
}
public Person(String str) {
System.out.println("person "+str);
}
} class MyClass extends Test {
Person person = new Person("MyClass");
static{
System.out.println("myclass static");
} public MyClass() {
System.out.println("myclass constructor");
}
}

  结果:

 test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor

  创建当前类的对象过程:先初始化成员变量,再执行构造器。

  参考资料

  Java中的static关键字解析

  关于静态方法为什么不能被重写的一点思考以及overload的一些坑。

  Java 静态内部类作用?

  《 Java程序员面试笔试宝典》 P80-83

Java 关键字 static的更多相关文章

  1. java关键字static使用总结

    java关键字static使用总结 1.static修饰的方法被称之为静态方法也叫做类方法,加static的方法,可以通过类名直接访问,不加static的方法只能通过对象名访问. 静态方法可以直接通过 ...

  2. java笔记——Java关键字static、final使用小结

    static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...

  3. Java关键字--static

    在Java中,将关键字static分为三部分进行讨论,分别为Java静态变量.Java静态方法.Java静态类 Java Static Variables Java instance variable ...

  4. Java关键字static、final

    static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...

  5. Java关键字static、final使用小结

    static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...

  6. [JAVA关键字] static & final

    JAVA十分常见的关键字static & final 总的来说final表示常量,即不可更改的:而static表示静态,即全局的 1. final 类:不能被继承 2. final 方法:能被 ...

  7. java 关键字static

    在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块. Java把内存分为栈内存和堆内存, 栈内存用来存放一些基本类型的变量.数组和对象的引用, 堆 ...

  8. java关键字“static”

    Java中static使用方法 1.static静态变量 静态变量:每个类只有一个,所有实例共享: 实例变量:每个实例只有一个: package test2; import java.lang.Str ...

  9. Java关键字——static

    static申明属性 如果有属性希望被所有对象共享,则必须将其申明为static属性. 使用static声明属性,则此属性称为全局属性,有时候也称为静态属性. 当一个类的属性申明位static的时候, ...

随机推荐

  1. .NetCore 下开发独立的(RPL)含有界面的组件包 (五)授权过滤参数处理

    .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作 .NetCore 下开发独立的(RPL)含有界面的组件包 (二)扩展中间件及服 务 .NetCore 下开发独立的(RPL)含 ...

  2. java 使用jdbc连接Greenplum数据库和Postgresql数据库

    1.公司使用的Greenplum和Postgresql,确实让我学到不少东西.简单将使用jdbc连接Greenplum和Postgresql数据库.由于使用maven仓库,不能下载Greenplum的 ...

  3. C#default关键字(泛型代码中的默认关键字)

    在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:T 是引用类型还是值类型.如果 T 为值类型,则它是数值还是结构.给定参数化类型 T 的一个变量 t,只有 ...

  4. ReSharper 8 & 9

    ronle ZoJzmeVBoAv9Sskw76emgksMMFiLn4NM 9: admin@youbaozang.com SpFEMUSrPM0AGupqlNs6J1Ey7HrjpJZy admi ...

  5. signal() 和 sigaction()

    [摘自<Linux/Unix系统编程手册>] Unix系统提供了两种方式来改变信号处置:signal() 和 sigaction(). signal() 的行为在不同Unix实现间存在差异 ...

  6. ajax后台输出有红点

    转自 百度了很多,说有utf8的bom头,通过dw,sublime软件,各种清除格式无果. 后来直接在返回结果之前,执行一下ob_clean(); 完美解决问题

  7. noip2012

    题解: 闲着无聊做了一遍noip2012 我觉得出题出的好奇怪啊... 为什么两道倍增两道二分答案??? 两天第一题: 第一天第一题傻逼普及组题没什么好说的了 第二天第一题你会扩欧就秒了 两天第二题: ...

  8. linux下几个常用软件

    Ubuntu 软件包地址 https://packages.ubuntu.com/ 一. 字体 不管是雅黑还是宋体,从windows cp过来后, 直接双击打开并安装 二. Meld 可视的diff和 ...

  9. windows下面使用nssm设置新的服务实现开机自启等

    1.下载: http://nssm.cc/download/?page=download 2.解压: 根据自己的系统选择相应的32bit或者64bit,然后将相应的可执行文件拷贝到系统环境中.配置环境 ...

  10. 【Android】修改Android 模拟器IMEI

    修改Android 模拟器IMEI 在.....\android_sdk\tools文件下找到emulator-arm.exe,使用UltraEdit文本编辑器打开,搜索CGSN关键字,把000000 ...