一、静态变量

描述:

  • 在类中,使用'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. C++多元组tuple使用方法?你熟悉吗?快来看看吧

  2. Jcrop图片裁剪

    一.引入js和css 二.实现 1.jsp页面 <%-- Created by IntelliJ IDEA. User: a Date: 2019/8/19 Time: 9:36 To chan ...

  3. AYIT-2020 609暑假集训第一周周赛题 A - A计划

    可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下 ...

  4. 【洛谷 p3372】模板-线段树 1(数据结构--线段树)

    题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x:2.求出某区间每一个数的和. 解法:如题,模版题.需要加上 lazy 标记,也就是我的 upd.lazy 标记的思路就是对一个结 ...

  5. 2019HDU多校 Round9

    Solved:3 02 Rikka with Cake (树状数组) #include <bits/stdc++.h> using namespace std; typedef long ...

  6. HDU6532 Chessboard (最大费用流)

    题意:棋盘上有n个棋子 每个棋子都有收益 现在给定1e5条线 有横着的 竖着的 规定只能在线的一侧选最多ki个棋子 问最大收益 题解:写自闭的一道题 很容易想到是网络流 但是建图有点难 第一道最大费用 ...

  7. Codeforces Round #578 (Div. 2) C. Round Corridor (思维,数论)

    题意: 有一个分两层的圆盘,每层从12点方向均分插入\(n\)和\(m\)个隔板,当内层和外层的隔板相连时是不能通过的,有\(q\)个询问,每次给你内层或外层的两个点,判断是否能从一个点走到另外一个点 ...

  8. Codeforces Round #555 (Div. 3) E. Minimum Array (贪心,二分,set)

    题意:给你两个长度为\(n\)的数组\(a\)和\(b\),元素值在\([0,n-1]\),可以对\(b\)数组的元素任意排序,求新数组\(c\),满足\(c_i=(a_i+b_i)\ mod\ n\ ...

  9. Python 遭遇 ProxyError 问题记录

    最近遇到的一个问题,在搞清楚之后才发现这么多年的 HTTPS_PROXY 都配置错了! 起因 想用 Python 在网上下载一些图片素材,结果 requests 报错 requests.excepti ...

  10. java调用http接口的几种方式总结

    本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnblogs.com/jeffen/p/69 ...