一、静态变量

描述:

  • 在类中,使用'static'修饰的成员变量,就是静态变量,反之为非静态变量。

区别:

  • 静态变量属于类的,可以使用类名来访问;非静态变量是属于对象的,必须使用对象来访问。
  • 静态变量对于类而言在内存中只有一个,能被类的所有实例所共享;实例变量对于类的每个实例都有一份,它们之间互不影响。
  • 静态变量在加载类的过程中分配内存,实例变量在创建对象时分配内存,所以静态变量可以使用类名来直接访问,而不需要使用对象来访问。

示例:

public class Student {
private static int age = 20;
private double score = 100; public static void main(String[] args) {
Student student = new Student();
System.out.println(age);//20
System.out.println(Student.age);//20
/* 不建议使用对象访问静态成员 */
System.out.println(student.age);//20
System.out.println(student.score);//100.0
}
}

二、静态方法

描述:

  • 在类中,使用'static'修饰的成员方法,就是静态方法,反之为非静态方法。

区别:

  • 静态方法数属于类的,可以使用类名来调用;非静态方法是属于对象的,必须使用对象来调用。
  • 静态方法不可以直接访问类中的非静态变量和非静态方法,但是可以直接访问类中的静态变量和静态方法;非静态方法可以直接访问类中的非静态变量和非静态方法,也可以直接访问类中的静态变量和静态方法。

注意:

  • 'this'和'super'在类中属于非静态的变量,静态方法中不能使用
  • 父类的静态方法可以被子类继承,但是不能被子类重写。
  • 父类的非静态方法不能被子类重写为静态方法。

示例:

public class Student {
private static int age = 20;
private double score = 100; public static void staticSay() {
System.out.println(age);
} public void say() {
System.out.println(age + " " + score);
} public static void main(String[] args) {
Student.staticSay();//20
Student student = new Student();
/* 不建议使用对象调用静态方法 */
student.staticSay();//20
student.say();//20 100.0
}
}

三、静态代码块

描述:

  • 在类中,使用'static'修饰的匿名代码块,就是静态代码块
  • 因为没有名字,在程序中并不能主动调用这些匿名代码块。

区别:

  • 静态代码块是在类加载完成之后就自动执行,并且只执行一次;匿名代码块是在每次创建对象的时候自动执行的,并且在构造器执行之前执行。
  • 静态代码块不可以直接访问类中的非静态变量和非静态方法,但是可以直接访问类中的静态变量和静态方法;匿名代码块可以直接访问类中的非静态变量和非静态方法,也可以直接访问类中的静态变量和静态方法。
  • 静态代码块的作用是给类中的静态成员变量初始化赋值;匿名代码块的作用是给对象的成员变量初始化赋值,但是因为构造器也能完成这项工作,所以匿名代码块使用的并不多。

注意:

  • 'this'和'super'在类中属于非静态的变量,静态代码块中不能使用
  • 在构造器中给静态变量赋值,并不能保证能赋值成功,因为构造器是在创建对象的时候才执行,但是静态变量可以不创建对象而直接使用类名来访问。

示例:

public class Student {
/* 静态代码块 */
static {
staticSay();
age = 10;
staticSay();
}
/* 匿名代码块 */
{
say();
age = 30;
score = 80.0;
say();
}
/* 构造器 */
Student() {
say();
age = 40;
score = 90.0;
say();
}
/* 静态成员变量赋初始值,定义在静态代码块之下,会比静态代码块后执行 */
private static int age = 20;
/* 非静态成员变量赋初始值,定义在匿名代码块之下,会比匿名代码块后执行 */
private double score = 100.0;
/* 静态方法 */
public static void staticSay() {
System.out.println(age);
}
/* 非静态方法 */
public void say() {
System.out.println(age + " " + score);
} public static void main(String[] args) {
/*
本次执行顺序为:静态代码块-->静态成员变量赋初始值-->匿名代码块-->非静态成员变量赋初始值-->构造器
所以创建对象会在控制台依次打印:
0
10
20 0.0
30 80.0
30 100.0
40 90.0
*/
Student student = new Student();
student.say();//40 90.0
}
}

四、创建和初始化对象的过程

步骤:

  1. 类加载,同时初始化类中静态变量赋默认值
  2. 静态变量有指定初始值,且代码定义在静态代码块之上,对静态变量进行显式赋值
  3. 执行静态代码块
  4. 静态变量有指定初始值,且代码定义在静态代码块之下,对静态变量进行显式赋值
  5. 创建对象,分配内存空间,同时初始化成员变量赋默认值
  6. 调用父类构造器
  7. 成员变量有指定初始值,且代码定义在匿名代码块之上,对成员变量进行显式赋值
  8. 执行匿名代码块
  9. 成员变量有指定初始值,且代码定义在匿名代码块之下,对成员变量进行显式赋值
  10. 执行构造器
  11. 若有变量引用,返回内存地址赋给变量。

示例:

public class Person {

    private int age = 10;

    public Person() {
System.out.println("Person构造器");
print();
} public void print() {
System.out.println("Person print方法: age = " + age);
}
} class Student extends Person {
/* 赋初始值定义在匿名代码块之上,会比匿名代码块先执行 */
private int age = 20; static {
System.out.println("Student静态代码块");
} {
System.out.println(age);
System.out.println("Student匿名代码块");
} public Student() {
System.out.println(age);
System.out.println("Student构造器");
} public void print() {
System.out.println("student print方法: age = " + age);
} public static void main(String[] args) {
/*
结果为在控制台依次打印:
Student静态代码块
Person构造器
student print方法: age = 0
20
Student匿名代码块
20
Student构造器
*/
new Student();
}
}

五、静态导包

描述:

  • 静态导包就是java包的静态导入,用'import static'代替'import'来静态导入包,是JDK1.5中的新特性,意思是导入这个类里的静态方法
  • 静态导包的好处就是在有很多重复调用静态方法的时候可以简化一些操作,如果仅有一到两次调用,不如直接写来的方便。

示例:

import static java.lang.Math.PI;
import static java.lang.Math.random; public class Test {
public static void main(String[] args) {
/* 非静态导入需要使用Math.random()的方式调用 */
System.out.println(random());//0.05775943381246629
System.out.println(PI);//3.141592653589793
}
}

Java基础语法:static修饰符的更多相关文章

  1. Java基础——protected访问修饰符探讨

    Java基础——protected访问修饰符探讨 根据官方说法:(如图) protected修饰符是可以修饰其他包中的子孙类的,但是我做了个实验,结果发现了一个有趣的现象! 具体请往下看: packa ...

  2. Java中的Static修饰符

    static(静态.修饰符):static修饰成员变量时:static修饰成员变量时,那么该成员变量的数据就是一个共享的数据. 静态成员变量的访问方式:方式一: 使用对象进行访问. 对象.属性名 方式 ...

  3. Java final和static 修饰符

    一.final final是不变的,最终的意思.可以用来修饰变量,方法,类. 1. 修饰变量 private final int a = 2; private final int b; // fina ...

  4. 26.Java基础_状态修饰符

    状态修饰符: final(最终态),static(静态) final关键字: 修饰类: 修饰局部变量: static关键字: 修饰变量:   修饰函数:

  5. java基础 关于final修饰符

    final作为一个修饰符,可以修饰类.变量.函数. 1.被final修饰的类不可以被继承(保护封装性),为了避免被继承,被子类复写: 2.被final修饰的函数不可以被复写 3.被final修饰的变量 ...

  6. Java Basic Notes——static修饰符

    1.static 在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就 ...

  7. Java学习——使用Static修饰符

    程序功能:通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. package Pack1; public class Try { public static vo ...

  8. JAVA基础语法——标识符、修饰符、关键字(个人整理总结)

    JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1    什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Dem ...

  9. 2、Java 基础语法标识符、修饰符、变量、 数组、枚举、关键字

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  10. java基础语法(标识符 修饰符 关键字)

    标识符 用来表示类名,变量名,方法名,类型名,数组名,文件名的有效字符序列称为标识符.   1)只有字母(区分大小写),下划线,美元符号和数字组成,长度不受限制.注:字母包括英文26个字母 ,汉字,日 ...

随机推荐

  1. python格式转换的记录

    Python的格式转换太难了. 与其说是难,具体来说应该是"每次都会忘记该怎么处理".所以于此记录,总的来说是编码+格式转换的记录. 本文记录环境:python3.6 经常见到的格 ...

  2. Codeforces301D. Yaroslav and Divisors

    题意:2e5的全排列 每次询问一个区间有多少对数 满足一个数是另一个数的倍数 题解:考虑离线来做 看到有个说法说 在处理有两种约束的问题时 一般用数据结构边插入边询问的方式 这个题正是如此 我们用su ...

  3. int和longlong的范围

    unsigned   int     0-4294967295   (10位数,4e9) int                        -2147483648-2147483647  (10位 ...

  4. Panasonic Programming Contest (AtCoder Beginner Contest 186) E.Throne (数学,线性同余方程)

    题意:有围着一圈的\(N\)把椅子,其中有一个是冠位,你在离冠位顺时针\(S\)把椅子的位置,你每次可以顺时针走\(K\)个椅子,问最少要走多少次才能登上冠位,或者走不到冠位. 题解:这题和洛谷那个青 ...

  5. Codeforces Round #570 (Div. 3) G. Candy Box (hard version) (贪心,优先队列)

    题意:你有\(n\)个礼物,礼物有自己的种类,你想将它们按种类打包送人,但是打包的礼物数量必须不同(数量,与种类无关),同时,有些礼物你想自己留着,\(0\)表示你不想送人,问你在送出的礼物数量最大的 ...

  6. Codeforces Round #552 (Div. 3) C. Gourmet Cat (数学,模拟)

    题意:你要带着你的喵咪一起去旅行,你的喵在星期\(1,4,7\)吃喵粮\(x\),在星期\(2,6\)吃喵粮\(y\),在星期\(3,5\)吃喵粮\(z\),你只有\(a\)个\(x\),\(b\)个 ...

  7. POJ 3281 Dining(最大流板子)

    牛是很挑食的.每头牛都偏爱特定的食物和饮料,其他的就不吃了. 农夫约翰为他的牛做了美味的饭菜,但他忘了根据它们的喜好检查菜单.虽然他不可能喂饱所有的人,但他想让尽可能多的奶牛吃上一顿有食物和水的大餐. ...

  8. Caocao's Bridges HDU - 4738 找桥

    题意: 曹操在赤壁之战中被诸葛亮和周瑜打败.但他不会放弃.曹操的军队还是不擅长打水仗,所以他想出了另一个主意.他在长江上建造了许多岛屿,在这些岛屿的基础上,曹操的军队可以轻易地攻击周瑜的军队.曹操还修 ...

  9. codeforces 1076E Vasya and a Tree 【dfs+树状数组】

    题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...

  10. codeforces 758D

    D. Ability To Convert time limit per test 1 second memory limit per test 256 megabytes input standar ...