文章目录

  • 一、类变量 / 静态变量(static)
  • 二、类方法 / 静态方法(static)
  • 三、main方法
  • 四、代码块
    • (一)static代码块
    • (二)普通代码块
  • 五、属性初始化、代码块、构造器的调用优先级【超级重点】

一、类变量 / 静态变量(static)

(一)类变量也叫静态变量 / 静态属性,为同一个类所有对象共享,存储在堆中(在类加载时就创建了,即使没创建对象也可以使用)。

(二)定义语法:
访问修饰符 static 数据类型 变量名
例:public static int count = 0;

(三)如何访问类变量:
类名.类变量名
例:Person.name
【静态变量的访问修饰符的访问权限和范围和普通属性是一样的】

二、类方法 / 静态方法(static)

(一)定义语法:
访问修饰符 static 返回数据类型 方法名(){}
例:public static int getNum(){}

(二)如何访问类变量:
类名.类方法名【推荐】
例:Person.getNum()
【静态方法的访问修饰符的访问权限和范围和普通属性是一样的】

注意事项

  1. 静态方法不能使用和对象有关的关键字,例如this和super
  2. 静态方法只能访问静态变量或静态方法
  3. 普通成员方法可以访问非静态 / 静态的成员和方法

三、main方法

main方法的形式:
public static void main(Stringl args){}

  1. main方法时虚拟机调用
  2. java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
  3. java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static
  4. 该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
  5. java执行的程序 参数1 参数2 参数3

注意事项

  1. 在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性;
  2. 不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员

四、代码块

代码化块又称为初始化块,属于类中的成员,类似于方法,将逻辑语句封装在方法体中,通过 { } 包围起来。
不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。
基本语法:
[修饰符]{
代码
};
说明注意:
1)修饰符可选,要写的话,也只能写static
2)代码块分为两类:使用static修饰的叫静态代码块;没有static修饰的,叫普通代码块/非静态代码块
3)逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)
4); 号可以写上,也可以省略。
5)静态代码块只能调用静态属性/方法,普通代码块可以任意

(一)static代码块

  1. static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行(类什么时候被加载:看以下第二点),并且只会执行一次【重要】。如果是普通代码块,每创建一个对象,就执行。

  2. 类什么时候被加载【重要】
    (1)创建对象实例
    (2)创建子类对象实例,父类也会被加载
    (3)使用类的静态成员时(静态属性,静态方法)

class AA{static {System.out.println("AA静态代码块被执行");}
}
class BB extends AA{{System.out.println("普通代码块被执行");}private int n2 = getN2();public static int n1 = getN1();static {System.out.println("BB静态代码块被执行");}public static int getN1() {System.out.println("n1初始化");return 100;}public int getN2() {System.out.println("n2初始化");return 200;}
}
//情况一:
//AA m1 = new AA();
//输出:AA静态代码块被执行
//情况二:
//BB m2 = new BB();
//输出:1.AA静态代码块被执行 2.BB静态代码块被执行
//情况三:
//System.out.println("输出:" + BB.n1);
//输出:1.AA静态代码块被执行 2.n1初始化 3.AA静态代码块被执行 4.输出:1000

(二)普通代码块

普通的代码块,在创建对象实例时,会被隐式的调用。被创建一次,就会调用一次。
如果只是使用类的静态成员时,普通代码块并不会执行。
使用场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的利用率(在调用构造时,先执行代码块的内容,再执行构造器的内容

public class Hello {public static void main(String[] args) {Movie movie1 = new Movie("lihua", 199);Movie movie2 = new Movie("wangming", "你好");}
}
//以下两个构造器都使用代码块
class Movie{private String name;private double price;private String directer;public static int n1 = 10000;{System.out.println("电影已创建");}public Movie(String name, double price) {this.name = name;this.price = price;}public Movie(String name, String directer) {this.name = name;this.directer = directer;}
}

五、属性初始化、代码块、构造器的调用优先级【超级重点】

在对象创建时,属性初始化、代码块、构造器的调用优先级如下:
①父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
②子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
③父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
④父类的构造方法
⑤子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
⑥子类的构造方法
静态是在加载时就被调用,所以优先级最高;子类构造器中隐含调用super()和子类普通代码块,所以先父类再子类普通代码块

public class Hello {public static void main(String[] args) {AA a = new AA();}
}
class BB{//7.父类构造器public BB(){System.out.println("父类BB构造器被执行");}//5.父类普通属性private int n1 = getN1();//6.父类普通代码块{System.out.println("父类BB普通代码块被执行");}//1.父类静态代码块static {System.out.println("父类BB静态代码块被执行");}//2.父类静态属性public static int n0 = getN0();public static int getN0() {System.out.println("父类静态属性n0初始化");return 0;}public int getN1() {System.out.println("父类普通属性n1初始化");return 100;}
}
class AA extends BB{//10.构造器public AA(){//隐含 super()和调用普通代码块System.out.println("子类AA构造器被执行");}//8.普通代码块{System.out.println("普通代码块被执行");}//9.普通变量初始化private int n3 = getN3();//3.静态变量初始化public static int n2 = getN2();//4.静态代码块static {System.out.println("子类AA静态代码块被执行");}public static int getN2() {System.out.println("子类静态属性n2初始化");return 200;}public int getN3() {System.out.println("子类普通属性n3初始化");return 300;}
}
输出:
父类BB静态代码块被执行
父类静态属性n0初始化
子类静态属性n2初始化
子类AA静态代码块被执行
父类普通属性n1初始化
父类BB普通代码块被执行
父类BB构造器被执行
普通代码块被执行
子类普通属性n3初始化
子类AA构造器被执行

特别说明
本文章是个人整理的学习笔记,参考b站韩顺平老师的课程(【零基础 快速学Java】韩顺平 零基础30天学会Java)。老师讲的非常好,有兴趣的可以去看一下。

java静态变量、静态方法、代码块、main方法相关推荐

  1. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  2. (工作笔记)jmockit的使用-mock私有变量、静态变量、代码块

    目录 一.jmockit配置 二.实例 2.1 被测对象 2.2 测试类 一.jmockit配置 变量 <properties><jmockit.version>1.43< ...

  3. java静态变量存放在堆还是方法区?

    首先肯定:静态变量是被对象共享的,随着类加载而产生(不用实例化即可访问) jdk8之前:放在方法区 jdk8及以后:存放在堆中反射的class对象(即类加载后会在堆中生成一个对应的class对象)的尾 ...

  4. 【Java基础】Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)

    初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 3.其次,初始 ...

  5. [转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍

    参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中  方法外 调 ...

  6. Java 静态变量和静态方法

    在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量,常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个类所有. 静态成员不依赖于类的特定实例,被 ...

  7. Java中的静态变量静态方法

    静态变量&静态方法 静态变量又叫做类变量,静态方法又被称为类方法--均被static修饰 未被static修饰的成员变量和方法分别被称为实例变量和实例方法 (1)静态方法中不需要它所属类的任何 ...

  8. java 静态变量生命周期(类生命周期)

    java 静态变量生命周期(类生命周期) Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 ...

  9. Java 静态变量生命周期

    Java 静态变量生命周期(类生命周期) Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 ...

最新文章

  1. HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义...
  2. 导出excel--多个sheet
  3. 【正一专栏】如果世界杯上没有了意大利
  4. springboot集成shiro实现注册、登录、退出功能
  5. http使用post上传文件时,请求头和主体信息总结
  6. java 抽象类构造函数_抽象类可以有构造函数吗?
  7. Windows下Zookeeper启动zkServer.cmd闪退问题的解决方案
  8. 阿里前端开源的一些产品
  9. 探寻 Redis 内存诡异增长的元凶
  10. 「题解」:[BZOJ4558]方
  11. 新华网评:企业的信息安全关把好了吗?
  12. [深入Python]Alex Martelli的Borg类
  13. html中如何设置ttf,CSS怎么引用外部ttf字体?
  14. sklearn笔记19 随机森林和决策树的比较
  15. 启动服务器后台打印系统,服务器打印后台处理
  16. pyomo / Ipopt : Error evaluating constraint 1: can‘t evaluate pow‘(0,0.5).
  17. 怎么把m4a转换成mp3格式?
  18. 2021-02-03-隐藏Tomcat版本号
  19. 数据恢复软件如何恢复电脑删除的文件
  20. cv2绘图 cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText() python

热门文章

  1. 淫欲的真相是什么呢?可能很多英雄豪杰都没有想到过
  2. 部署无鱼工时系统,超详细教程,并成功部署
  3. 数据挖掘时功能和一个聚类分析应用案例
  4. 小编为您介绍留声机的古与今
  5. 前端、数据库面试要点
  6. Android爬虫(一)使用OkHttp+Jsoup实现网络爬虫
  7. python豆瓣mysql_python爬虫获取豆瓣电影——Python操作MySQL存储数据
  8. ngx-datatable的使用
  9. Jekyll 教程——博客功能(blog)
  10. 初始化mysql5.7.18_MySQL5.7.18,初始化完成登录,提示密码过