以下内容参考:
https://www.cnblogs.com/dolphin0520/p/3799052.html
1.static 变量
静态变量和非静态变量的区别:
静态变量在方法区被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
2.static方法
static方法是没有this的,他不属于任何对象,static方法中不能调用非静态成员变量和方法。
3.static代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
一代码为例
package com.tunlun.App;
public class Test {
Person person = new Person("Test");
static Person sp = new Person("st");
static{
System.out.println("test static");
}
{
System.out.println("1");
}
public Test() {
System.out.println("test constructor");
}
public static void main(String[] args) {
new MyClass();
}
}
class Person{
static{
System.out.println("person static");
}
{
System.out.println("2");
}
public Person(String str) {
System.out.println("person "+str);
}
}
class MyClass extends Test {
Person person = new Person("MyClass");
static{
System.out.println("myclass static");
}
{
System.out.println("3");
}
public MyClass() {
System.out.println("myclass constructor");
}
}
运行结果
person static
2
person st
test static
myclass static
2
person Test
1
test constructor
2
person MyClass
3
myclass constructor
首先我们要知道 类初始化顺序是
父类静态变量——》父类静态代码块——》
子类静态变量——》子类静态代码块——》
main函数———》
父类非静态成员变量————》父类非静态代码块———》父类构造方法
子类非静态成员变量————》子类非静态代码块————》 子类构造方法
然后我们开始分析上面代码。
首先由于Test没有父类直接初始化该类的静态成员变量sp ——》
进入sp没有父类则初始化——》静态代码块——》实例代码块——》
构造方法————》返回Test类继续初始化静态代码块————》
主函数————》
进入myclass有父类,但父类静态变量和代码块以初始过了所以初始myclass静态方法——》
然后舒适化父类成员变量person——》父类非静态代码块———》
父类构造方法——》myclass父类成员变量person——》
myclass非静态代码块——》myclass构造函数
下面把上面代码改动一下做个小测试
package com.tunlun.App;
class Test {
Person person = new Person("Test");
static Person sp = new Person("sTest");
static{
System.out.println("test 静态代码块");
}
{
System.out.println("test 非静态代码块");
}
public Test() {
System.out.println("test 构造方法");
}
}
class Person{
static{
System.out.println("person 静态代码块");
}
{
System.out.println("Person 非静态代码块");
}
public Person(String str) {
System.out.println("person "+str);
}
}
public class MyClass extends Test {
Person person = new Person("MyClass");
static{
System.out.println("myclass 静态代码块");
}
{
System.out.println("myClass 非静态代码块");
}
public MyClass() {
System.out.println("myclass 构造方法");
}
public static void main(String[] args) {
System.out.println("主函数");
MyClass class1 = new MyClass();
}
}
运行结果:
person 静态代码块
Person 非静态代码块
person sTest
test 静态代码块
myclass 静态代码块
主函数
Person 非静态代码块
person Test
test 非静态代码块
test 构造方法
Person 非静态代码块
person MyClass
myClass 非静态代码块
myclass 构造方法