关键字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. 虚拟机设置静态IP与配置网络

    不废话,直接上图 一:先配置虚拟机的网络 二:配置win10-VM8网络 三:查看以太网的ip信息,直接在管理员命令中输入 ipconfig /all可以到连接信息 四:如果在上面找不到VM8的网络信 ...

  2. std::string 是什么

    #include "stdafx.h" #include <iostream> #include <string> using std::cout; usi ...

  3. POJ 2987 Firing【最大权闭合图-最小割】

    题意:给出一个有向图,选择一个点,则要选择它的可以到达的所有节点.选择每个点有各自的利益或损失.求最大化的利益,以及此时选择人数的最小值. 算法:构造源点s汇点t,从s到每个正数点建边,容量为利益.每 ...

  4. Java基础知识➣集合整理(三)

    概述 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实现(类) ...

  5. python之logging

    1.简单使用 # CRITICAL, ERROR, WARNING, INFO, DEBUG) cewid import logging logging.basicConfig(level=loggi ...

  6. 【AtCoder】AGC031

    A - Colorful Subsequence 答案是 \(\prod_{c = 'a'}^{'z'} (cnt[c] + 1)\) #include <bits/stdc++.h> # ...

  7. Python_shelve模块

    shelve:对象持久化的保存的模块,将对象保存到文件里  (默认的数据存储文件为二进制),可持久化任何pickle可支持的Python数据格式 shelve 中唯一的方法: shelve.open( ...

  8. Bean Shell常用内置变量总结

    JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log文件,使用方法:log.info( ...

  9. SSL/TLS

    為 授权计算机为 SSL/TLS 安全通道建立信任关系. ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, e ...

  10. Could not find result map XXX 解决办法

    错误定位在xml文件中 resultmap类型不匹配