zoukankan      html  css  js  c++  java
  • Java——static关键字

    static方法:

    1、定义:

    《java编程思想》中提到:static方法就是没有this的方法,在static方法内部不能调用非静态方法,反过来是可以的,而且可以在没有创建任何对象的情况下,仅仅通过类本身来调用static方法,这实际上正是static方法的用途

    2:概念:

    static方法一般称作静态方法,由于静态方法不依赖于对象就可以访问,所以也就没有this,并且static修饰的方法不能调用非静态成员变量和非静态成员方法,但是非静态成员方法可以调用静态成员方法

    static变量:

    定义:

    static变量也称为静态变量,静态变量和非静态变量的区别:静态变量是所有对象共享的,在内存中只存在一个副本,在类的初始化时加载,而非静态变量是对象特有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响

    static代码块:

    static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

    类中的static:

    1)子类是不继承父类的static变量和方法的。因为这是属于类本身的。
    但是子类是可以访问的。
    2)子类和父类中同名的static变量和static方法都是相互独立的,并不存在任何的重写的关系。
    3)子类和父类中同名的实例变量都是相互独立的,并不存在任何的重写的关系。

    代码:

    class Parent {
    	public static int i = 1;
    	public int j = 10;
    	public static void staticMethod() {
    		System.out.println("Parent staticMethod run");
    	}
    	public void method() {
    		System.out.println("Parent method run");
    	}
    }
    class Son extends Parent {
    	public static int i = 2;
    	public int j = 20;
    	public static void staticMethod() {
    		System.out.println("Son staticMethod run");
    	}
    	public void method() {
    		System.out.println("Son method run,j=" + super.j);
    	}
    }
    public class StaticInheritDemo {
    	public static void main(String[] args) {
    		Parent child = new Son();
    		System.out.println(child.i);//
    		child.staticMethod();//
    		child.method();
    		System.out.println(child.j);
    		Son s = new Son();
    		System.out.println(s.i);
    		s.staticMethod();
    		child.method();
    		System.out.println(s.j);
    	}
    }
    

      

    运行结果:

    1
    Parent staticMethod run
    Son method run,j=10
    10
    2
    Son staticMethod run
    Son method run,j=10
    20
    

      

    类的初始化顺序:

    • 类的初始化顺序:静态成员的初始化只执行一次,实例成员每实例化一个对象都初始化一次,一个类中的初始化顺序,类内容(静态变量、静态初始化块) => 实例内容(变量、初始化块、构造方法)

    • 两个具有继承关系类的初始化顺序 * 父类的(静态变量、静态初始化块) => 子类的(静态变量、静态初始化块)=>父类的(实例变量、实例初始化块、构造方法)=> 子类的(实例变量、实例初始化块、构造方法)

    代码:

    public class StaticInit {
    	public static void main(String[] args) {
    		new A();
    		System.out.println();
    		new B();
    	}
    }
    
    
    class A {
    	public A() {
    		System.out.println("Constructor A.");
    	}
    	{
    		System.out.println("Instance Block A.");
    	}
    	static {
    		System.out.println("Static Block A.");
    	}
    }
    /* 两个具有继承关系类的初始化顺序 * 父类的(静态变量、静态初始化块) => 子类的(静态变量、静态初始化块)=>
     * 父类的(实例变量、实例初始化块、构造方法)=> 子类的(实例变量、实例初始化块、构造方法) */
    class B extends A {
    	public B() {
    		System.out.println("Constructor B.");
    	}
    	{
    		System.out.println("Instance Block B.");
    	}
    	static {
    		System.out.println("Static Block B.");
    	}
    }
    

      

    运行结果:

    Static Block A.
    Instance Block A.
    Constructor A.
    
    Static Block B.
    Instance Block A.
    Constructor A.
    Instance Block B.
    Constructor B.
    

      

  • 相关阅读:
    【leetcode】1442. Count Triplets That Can Form Two Arrays of Equal XOR
    【leetcode】1441. Build an Array With Stack Operations
    【leetcode】1437. Check If All 1's Are at Least Length K Places Away
    cxCheckCombobox
    修改现有字段默认值
    2018.01.02 exprottoexcel
    Statusbar OwnerDraw
    dxComponentPrinter记录
    单据暂存操作思路整理
    设置模式9(装饰者,责任链,桥接,访问者)
  • 原文地址:https://www.cnblogs.com/wugongzi/p/11206354.html
Copyright © 2011-2022 走看看