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. PHP数组的升序降序函数

    数组排序函数:::sort()对数组进行升序排列rsort()对数组进行降序排列 asort()根据关联数组的值,对数组进行升序排列ksort()根据关联数组的键,对数组进行升序排列 arsort() ...

  2. vue基础----过滤器filter

    1.用的场景:一个功能在每个组件都能用,而computed虽然有缓存,但不能用在每一个组件,需要的话的每一个都需要写. 2.特点:改变数据的展示形式,不改变原有的形式  分为全局与局部的 <di ...

  3. (转)协议森林04 地址耗尽危机 (IPv4与IPv6地址)

    协议森林04 地址耗尽危机 (IPv4与IPv6地址) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! IP地址是IP协议的重要组 ...

  4. Vue 学习笔记(四)

    一.路由简单示例 HTML <script src="https://unpkg.com/vue/dist/vue.js"></script> <sc ...

  5. 全文搜索技术--solr7.1之mysql的安装步骤

    1.安装命令 #>在线安装wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 输完上面一句话不能正常的下载安装 ...

  6. 阿里云服务器安装Docker

    在阿里云服务器上安装Docker,服务器的系统是CentOS 7.6, 所以可以看官方Docker安装文档:https://docs.docker.com/install/linux/docker-c ...

  7. 为什么我推荐你用Ubuntu开发?

    前言: 鱼哥在做多媒体开发时,领导倒逼我们用Ubuntu开发,后来才发现它的牛逼和高效.所以对于还在用Windows上开发的朋友,鱼哥建议,趁周末,搞个双系统,切到Ubuntu上开发, Ubuntu最 ...

  8. PU Learning简介:对无标签数据进行半监督分类

    当只有几个正样本,你如何分类无标签数据 假设您有一个交易业务数据集.有些交易被标记为欺诈,其余交易被标记为真实交易,因此您需要设计一个模型来区分欺诈交易和真实交易. 假设您有足够的数据和良好的特征,这 ...

  9. C# 基础知识系列- 4 面向对象

    面向对象 面向对象是一个抽象的概念,其本质就是对事物以抽象的方式建立对应的模型. 简单来讲,比如我有一只钢笔,那么我就可以通过分析,可以得到 这只钢笔的材第是塑料,品牌是个杂牌 ,里面装的墨是黑色的, ...

  10. 一起了解 .Net Foundation 项目 No.22

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Windows Templ ...