Java static修饰符

static修饰符是静态修饰符,大家写Java第一次接触static就是主函数中的pubic static void main的声明了。

那么static有什么用?本文来详细说说。

static成员与普通成员的区别

static表示全局静态的意思,用来修饰类的成员变量和成员方法。

我们知道,程序中代码都是在编译的过程中由编译器自动分配的内存,而static类型就指其修饰的变量、方法在编译后就一直存在,直到程序结束才会释放内存。而我们知道Java是纯面向对象语言,万事万物都存在于类当中。 对于一个类而言,如果要使用它的成员变量、成员函数,普通情况下必须先实例化对象之后,通过对象的引用才能够访问这些成员。但是用static修饰的成员可以直接通过'.'访问标识符访问。

被static修饰的成员变量和成员方法独立于该类的任何对象,也就是说,static成员不依赖于特定的实例,而是被该类的所有对象共享,且不会被垃圾回收。

那么,只要这个类的代码被编译器编译了,static成员就可以直接通过类名访问(调用),无需引用任何对象。

static方法

静态方法可以直接通过类名访问,这也解释了为什么主函数是static方法了,因为我们不需要利用public类来实例化后才找到主函数入口。

  1. 静态方法可以直接通过类名调用,任何对象也可以调用,因此静态方法中不存在thissuper关键词;

  2. 静态方法不可以访问所属类的实例变量和实例方法(非静态)!因为实例变量和方法都是与对象相关的,而静态方法是独立于对象的;

  3. static方法必须被实现,不可以抽象。

  4. 静态方法可以直接调用同类的其他的静态成员(包括变量和方法)

  5. 虽然静态方法不可以调用非静态成员,但是对象可以调用静态方法。

class Student{
// 静态方法
static void print(){
System.out.println("I am a student!");
}
} public class Test{
public static void main(Sting[] args){
Student.print();
}
} // output
// I am a student!

static变量

静态变量不依附于类,而是从编译结束到程序退出一直都存在,所以不会被回收。虽然Java中没有这个概念,但是我们可以看作static变量为一种全局变量

  1. 静态变量可以被构造器和实例方法调用
  2. 静态变量属于整个类而不是某一个对象
  3. 静态变量不会被回收
class Student{
static int number = 0; // 静态变量
private int _num; // 私有变量
Student(){
_num = ++number;
System.out.println(_number);
}
} public class Test{
public static void main(Sting[] args){
Student a = new Student();
Student b = new Student();
}
} /* output
1
2
*/

可以看见,static变量一直存在,而不会每创建一个对象就重新赋值为0。

static的修饰符

static也可以被修饰和再修饰。例如static final就是指一个不可以被更改的静态变量。

这里特别说一下private 和 public。

  1. 被private static修饰的成员,仅仅可以被本类中的方法调用。
  2. 被public static修饰的成员,可以看作全局方法(变量),可以被类名和外部创建的对象直接调用。

static 代码块

静态代码块很简单,就是一段不依赖于类和方法的代码。

static{
// code here
}
  • 静态代码块在类被加载的的时候运行且只运行一次。

  • 静态代码块优先于主函数执行。静态代码块还是写在类中,由类调用。

  • 静态代码块中的变量是局部变量,和普通方法中的变量没有区别

public class Test{
public static void main(Sting[] args){
System.out.println("Main Method Code");
} static{
System.out.prinln("Test Class Static Code");
}
} /*
Output Test Class Static Code
Main Method Code */

可以看见,即使主函数写在static之前,也是会先执行static代码块内部的内容。

  • 静态代码块没有继承这个说法,因为静态代码块运行且只运行一次,就是在类加载的时候
class Person{
static {
System.out.println("I am a person");
} public Person() {
System.out.println("Constructor");
}
} public class Test {
public static void main(String[] args) {
Person a = new Person();
Person b = new Person();
Person c = new Person();
}
} /*
output I am a person
Constructor
Constructor
Constructor */

如上所见,对象创建了三个,构造方法调用了三遍,而静态代码块只调用了一遍。

所以可以看见,一个类被加载时,代码实现顺序是 静态代码块 > 构造方法 > 类方法

如果涉及到了继承,遵循静态优先执行,基类先于派生类的原则。

class Person{
static {
System.out.println("I am a Person");
} public Person() {
System.out.println("Base Constructor");
}
} public class Student extends Person{
static {
System.out.println("I am a Student");
} public Student() {
System.err.println("Derived Constructor");
}
} public class Test {
public static void main(String[] args) {
Student a = new Student();
}
} /*
output Derived Constructor
I am a Person
I am a Student
Base Constructor */

可以看见,创建派生类对象时,先调用了基类静态代码块、基类构造方法然后调用派生类静态代码块、派生类构造方法。

Java static修饰符的更多相关文章

  1. Java static修饰符小记

    首先我们明确一点:java是一个纯面向对象的编程语言,它的每一个文件都视为一个类,当我们创建一个对象的时候,就是在调用一个文件,那么这个时候,这个文件(类)里的一些东西,它是需要通过对象来使用或访问, ...

  2. java final .static修饰符

    static静态修饰符(使用static修饰符修饰的成员变量.常量.和成员方法成为静态变量.常量和方法,他们统称为静态成员,归整个类所有,不依赖于类的特定实例,被类的所有实例共享,只要这个类被加载,J ...

  3. Java的修饰符

    转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主 ...

  4. JAVA类型修饰符(public,protected,private,friendly)

    JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...

  5. java学习--修饰符

    Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 访问控制修饰符 访问控制修饰符用来修饰类和类内部的成员变量和成员方法,来确定其访问权限 类的访问控制修饰符只有两种 defa ...

  6. Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

  7. Java 5- Java 修饰符

    Java 修饰符 Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class ...

  8. Java类修饰符的使用与作用以及常见问题

    首先明确,类是放在文件里的,在文件里面的不同位置就有不同的作用,就是不同类型的类. 1, 顶级类or外部类:包括两种,一个文件中与文件名同名称的类我们称作顶级类(也是外部类),如果在一个文件中的一个类 ...

  9. Java基本修饰符

    java中的修饰符分为类修饰符,字段修饰符,方法修饰符.根据功能的不同,主要分为以下几种: *权限访问修饰符(可以用来修饰类.方法和字段) 适用范围<访问权限范围越小,安全性越高> 访问权 ...

随机推荐

  1. 外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 SpringBoot是如何实现自动配置的?--SpringBoot源码(四) 温故而知新,我们来简单回顾一下上 ...

  2. Go组件学习:如何读取ini配置文件

    代码示例全部保存在,欢迎star:https://github.com/EnochZg/golang-examples 安装组件 go get gopkg.in/ini.v1 使用 先创建ini后缀的 ...

  3. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

  4. ggplot2(8) 精雕细琢

    8.1 主题 主题系统控制着图形中的非数据元素外观,它不会影响几何对象和标度等数据元素.这题不能改变图形的感官性质,但它可以使图形变得更具美感,满足整体一致性的要求.主题的控制包括标题.坐标轴标签.图 ...

  5. 懂一点Python系列——快速入门

    本文面相有 一定编程基础 的朋友学习,所以略过了 环境安装.IDE 搭建 等一系列简单繁琐的事情. 一.Python 简介 Python 英文原意为 "蟒蛇",直到 1989 年荷 ...

  6. ChaosTool,iOS添加垃圾代码工具,代码混淆工具,代码生成器,史上最好用的垃圾代码添加工具,自己开发的小工具

    最近在H5游戏项目中需要添加垃圾代码作混淆,提高过审机率.手动添加太费时费力,在网上并没有找到合适的比较好的工具,就自己动手写了一个垃圾代码添加工具,命名为ChaosTool. 扣扣交流群:81171 ...

  7. [剑指offer]10.斐波那契数列+青蛙跳台阶问题

    10- I. 斐波那契数列 方法一 Top-down 用递归实现 def fibonacci(n): if n <= 0: return 0 if n == 1: return 1 return ...

  8. Symantec NBU :Unable to retrieve version of the server xxx.xxx.xxx

    Symantec NetBackup  是赛门铁克收购的veritas公司的一款产品,该产品功能强大,据称堪称备份界的鼻祖. 其具体原理和备份方式可见:https://blog.51cto.com/s ...

  9. 灵感来袭,基于Redis的分布式延迟队列

    延迟队列 延迟队列,也就是一定时间之后将消息体放入队列,然后消费者才能正常消费.比如1分钟之后发送短信,发送邮件,检测数据状态等. Redisson Delayed Queue 如果你项目中使用了re ...

  10. canvas.toDataURL()报错的解决方案全都在这了

    报错详尽信息 Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases ...