layout: post
title: static
subtitle:
date: 2019-10-31
categories: 面试题
author: miracle
catalog: true
tags:
- static关键字
—
static关键字会修饰java类,方法,变量,代码块方法
static关键字基本概念
方便在没有创建对象的情况下调用
被static关键字修饰的不需要创建对象调用,直接通过类名就可以去访问.
static关键字修饰类
java中static一般用来修饰成员变量或函数.有一种特殊用法使用static修饰内部类,普通类不允许声明为static,只有内部类才行.
public class TestStatic {
public static class InnerClass{
InnerClass(){
System.out.println("------------静态内部类----------");
}
public void InnerMethod(){
System.out.println("------------静态内部方法---------");
}
}
public static void main(String[] args) {
//直接通过StaticTest类名访问静态内部类InnerClass
InnerClass inner=new TestStatic.InnerClass();
//静态内部类可以和普通类一样使用
inner.InnerMethod();
}
}
如果没有static修饰,只能先new出外部类对象,通过外部类new出内部类对象
static修饰方法
可以通过类名来调用
public class StaticMethod {
public static void test(){
System.out.println("-------静态方法-------");
}
public static void main(String[] args) {
StaticMethod.test();
}
}
static修饰变量
被static修饰的成员变量叫做静态变量,或类变量,说明这个变量是属于这个类的,而不是属于对象,没有被static修饰的成员变量叫做实例变量,说明这个变量属于某个具体的对象
static修饰代码块
类初始化的顺序
- 父类静态变量
- 父类静态代码块
- 子类静态变量
- 子类静态代码块
- 父类普通变量
- 父类普通代码块
- 父类构造函数
- 子类普通变量
- 子类普通代码块
- 子类构造函数
深入分析static
静态变量存放在方法区中,是被所有线程共享的
堆区:
- 存储的全部都是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令)
- jvm只有一个堆区(heap)是被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区:
- 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用,对象都存放在堆区中
- 每个栈中的数据都是私有的,其他栈不能访问
- 栈分为3部分:基本类型变量区,执行环境上下文,操作指令区 方法区:
- 又叫静态区,跟堆一样,被所有线程共享.方法区包含所有的class和static变量
- 方法区中包含的都是在整个程序中永远唯一的元素,如class和static变量
调用
堆内存中的成员变量随着对象的消失而消失,静态变量是所有线程共享,所以不会消失.
特点:
- static是一个修饰符,用于修饰成员.static修饰的成员变量称为静态变量
- static修饰的成员被所有的对象共享
- static优先于对象存在,static的成员随着类加载就存在
- static修饰的成员可以类名直接调用
- static修饰的数据是共享数据
成员变量和静态变量的区别
- 生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而释放
静态变量随着类的加载而存在,随着类的消失消失
- 调用方式不同
成员变量只能被对象调用,静态变量可以被对象和类名调用
- 数据存储位置不同
成员变量存储在堆的对象中
静态变量存储在方法区的静态区
注意
- 静态方法只能访问静态成员(非静态既可以访问静态,也可以访问非静态)
- 静态方法中不可以使用this或super
- 主函数是静态的