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. 编译putty 源码去掉 Are you sure you want to close this session? 提示

    0, 为什么要编译 putty ?在关闭窗口的时候,会弹出一个 Are you sure you want to close this session?要把这个去掉.当然也可以用 OD 之类的来修改. ...

  2. JS循环嵌套的执行原理

    [逆战班] 循环嵌套是指在一个循环语句中再定义一个循环语句的语法结构,外循环执行一次,内循环全部执行完,直到外循环执行完毕,整个循环结束. while.do.. while和for循环语句都可以进行嵌 ...

  3. 写于疫情期间的一个plantUML例子

    @startuml 这几天的正经事 start repeat if(思维清晰) then (yes) :刷题; else (no) if(想写程序) then (yes) :调项目; else (no ...

  4. [vue/require-v-for-key] Elements in iteration expect to have 'v-bind:key' directives.

    使用VScode开发vue中,v-for在Eslint的规则检查下出现报错:如下Elements in iteration expect to have ‘v-bind:key’ directives ...

  5. 浅析Redis分布式锁---从自己实现到Redisson的实现

    当我们在单机情况下,遇到并发问题,可以使用juc包下的lock锁,或者synchronized关键字来加锁.但是这俩都是JVM级别的锁,如果跨了JVM这两个锁就不能控制并发问题了,也就是说在分布式集群 ...

  6. 解决QQ“抱歉,无法发起临时会话,您可以 添加对方为好友以发送消息”

    很多网站,目前无法发起临时会话,自己在找网上找到教程,特分享给大家.自从2014年3月1日开始,网站上放置QQ客服代码的网站,在点击联系QQ时,以前可以正常发起临时会话的,现在提示:“抱歉,无法发起临 ...

  7. ajax js分页算法分析

    显示效果:[页面总数小于等于10,全部显示,当前页特殊显示]上一页  1   2   3   4   5   6   7   8   9   10   下一页 [页面总数大于10,部分显示,当前页特殊 ...

  8. 【译】HTTP/2 为更快速的网站而生

    最近在做一个内部的服务对接,使用了Google的gRPC框架,gRPC是基于HTTP/2和protocol buffers实现的,所以额外去了解了一下HTTP/2,找到这这边文章.这篇文章虽然是写于2 ...

  9. JDBC怎么连接数据库

    1:注册驱动:class.forName("com.mysql.jdbc.Driver"); 2:连接数据库:DriverManager.getConnection(url , u ...

  10. 滑动窗口-Substring Search Problem

    2018-07-18 11:19:19 一.Minimum Window Substring 问题描述: 问题求解: public String minWindow(String s, String ...