Static静态 详解

# Static静态 #

public static void main

(1)类只是用来存储和被调用的,而对象是需要执行的,执行时就必定需要知道程序的入口,这个入口就是由main所在的位置。

(2)Java的类中没有main方法,因为它不需要执行,想执行需要自己加。

(3)Java所编写的程序是由其他程序来启动执行的(由某程序找到Java程序的入口,打开门后将操作的权限暂时交给Java程序,待到Java程序执行完毕再将权限收回),因此仅仅找到位置是不行的,还得有权限,如果没有权限,就像是你找到了门但是没有钥匙,一样进不了屋子。

(4)static的数据或方法,属于整个类的而不是属于某个对象的,是不会和类的任何对象实例联系到一起。所以子类和父类之间可以存在同名的static方法名,这里不涉及重载。所以不能把任何方法体内的变量声明为static,例如:


    fun() {

       static int i=0; //非法。

    }


static表示全局或者静态的意思, static修饰的变量和方法叫做静态变量和静态方法。

(5) Static 用来修饰哪些元素?

Static 修饰变量   ,静态变量,类变量  ,属于类所有,调用方式上  类名.变量名 ,(不推荐 对象名.变量名)

                静态变量位于方法区中,在 内存中只有1份,能够被类的所有实例所共享(类的所有对象共享这同一份资源,投票例子里共用同一个count)

Static  修饰方法   ,静态方法,类方法     调用方式上   类名.方法名  (不推荐 对象名.方法名)

     普通方法既可以访问静态,也可以访问非静态的

     静态方法,只能访问静态的 ,不能访问非静态的 , 这条规律,不光针对变量,也针对方法 。 

    静态方法中,不允许出现this,super关键字

Static  修饰代码块  , 静态代码块     jvm加载的时候自动执行的,而且只会执行1次,在new实例化之前就会被执行

    Static代码块可以有多个,自上而下执行,不管实例化多少次,都只会执行1次静态代码块

    静态代码块和普通代码块的区别  , 在new实例化之前执行,new实例化多少次,就会执行多少次 

Static  修饰内部类, 静态内部类`

静态内部类中可以定义静态变量,静态方法  ,需要知道调用方式

(6)    Static的内存图分析

示例1:(无法直接调用方法,需要实例化)

    Person.showName();

示例2:

加static后可以使用Person.showName()

**总结:**

(1)静态方法可以直接通过类名调用,但静态方法内只能访问静态变量、只能调用静态方法。非静态可以调用静态。

(2)Main方法需要调用其他方法,所以自己必须在运行期间始终保持在内存中,所以使用static修饰。

**交叉比较区别:成员变量和静态变量的区别**

(1)两个变量的生命周期不同

成员变量随着对象的创建而存在,随着对象被回收而释放。

静态变量随着类的加载而存在,随着类的消失而消失。

注:加载顺序:启动类的static block最先加载

**子父类之间:**

(父类静态成员、静态代码块—>子类静态成员、静态代码块—>父类实例成员、非static代码块——>父类构造函数—>子类实例成员、非static代码块—>子类构造函数)

单个类的执行顺序: 静态成员----》静态代码块 ----》实例成员----》普通代码块----》构造

(2)调用方式不同

成员变量只能被对象调用。

静态变量可以被对象调用,还可以被类名调用。

(3)别名不同

成员变量也称为实例变量。

静态变量也称为类变量。

**什么时候使用static,什么时候不用static?**

对静态变量的修改会被始终保留下来。创建两个人的对象,会导致密码相同。

举例说明

有违Java的面向对象的封装特性,增加的耦合。

多次使用某一个方法或变量的时候用static如数据库连接串等,因为static是在程序初始化时就已分配了内存空间,直到退出前才被释放出来,而new则是在变量进入作用域时被分配,离开时释放,每new时每创建一个类的实例,都会在内存中为非静态成员新分配一块存储,所以,常用的时候用static,只在程序初始化时分配内存空间,为各个类的实例所共用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域,所以常用方法或变量可以考虑用static,大型网站一般不推荐多用static因为他长时间的占用内存空间,另外static它不属于类的某一个具体的实例,而是属于类本身,所以其中不能用this等关键字,静态方法效率上要比实例化高,缺点是不能自行销毁,而实例化的可以自行销毁,网上有人说,static失去了面向对象的特性,这一点我认为是正确的,因为static不需要new根本就产生不了对象

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 正确使用refs不建议写法: 正确写法: 正确使用props和state不能直接修改state的状态 props和...
    LuckyJin阅读 300评论 0 0
  • 我生活的小镇没有大商场,没有完备的公共设施,比如城郊公交车基本上都是二十几分钟一班。所以有时候回家了也会怀念城市里...
    渔娘阅读 501评论 2 10
  • 一转眼2019年了,每年伊始都豪情壮志自信满满的做下决定。我相信很多人都向我一样,觉得又可以从新开始,能把生活过成...
    积渐阅读 591评论 0 1
  • 福道,即福州城市森林步道,采用全国首创钢架镂空设计,主轴线长6.3公里,环线总长约19公里,福道东北接左海公园,西...
    加减_阅读 625评论 0 0