static关键字解析

初识static是在刚学Java时,一个main方法的中是这样定义的:

public static static void main(String[]args){
    System.out.println("Hello World!");
}

随着一句“Hello World!”进入了Java的世界。同时也在想“static”是什么鬼?当时知道应该是静态的意思。也并没有在意,但随着最近复习基础知识时发现有一道面试题问到了static关键字,所以就总结了一下当时学习的笔记,并写出来与大家分享。下面就是关于static比较重要知识总结,主要有四大特性,主要作用是共享数据的。
static关键字特性一——–被类的所有对象所共享
首先来看一个例子:

public class student{
    public String name;
    public inr age;
    public String country;
    public student(String name,int age,String country){
        this.name=name;
        this.age=age;
        this.country=country;
    }
    public void show(){
    System.out.println(name+"--->"+age+"--->"+country);
}
public static void main(String[]args){
    Student s1=new Student("张三",17,"中国");
    Student s1=new Student("李四",18,"中国");
    Student s1=new Student("王五",19,"中国");
}
}
输出结果:张三--->17--->中国
    李四--->18--->中国
    王五--->19--->中国

从输出结果我们可以看出什么呢?这三个人的国籍都是一样的—中国。也就是说这三个对象存在共同的属性–国籍。对于有共通属性的对象,我们在创建对象时可以将这个属性共享,以减少内存空间的开销,static正好能满足这一特性。将国籍country共享即可,即在country前加上static即可。改进代码如下:

public class student{
    public String name;
    public inr age;
    public static String country;
    public student(String name,int age,String country){
        this.name=name;
        this.age=age;
        this.country=country;
    }
    public void show(){
    System.out.println(name+"--->"+age+"--->"+country);
}
public static void main(String[]args){
    Student s1=new Student("张三",17,"中国");
    Student s1=new Student("李四",18);
    Student s1=new Student("王五",19);
}
}
输出结果:张三--->17--->中国
    李四--->18--->中国
    王五--->19--->中国

在创建对象时只要第一次对country这个属性进行了赋值,后面的对象也就不用再赋值了,因为static使得这个类中的所有对象都可以共享country这个数据。对于被static关键字所共享的成员变量,也称这个成员变量是静态的。
static关键字特性一——–随着类的加载而加载
static关键字的生命周期是根据类的加载来确定的,随着的类的加载而加载,随着类的消失而消失,使得static关键字不可能与this关键字共存,这是因为this关键字是随着对象的创建的而存在,而对象的创建在类的加载之后。这也引出了static的下一个特性。
static关键字特性一——–优先于对象而存在
为什么static是由于对象而存在呢?主要是因为对象的创建时new的时候才会产生,而static关键字是根据类的加载而存在的,Java虚拟机(jvm)在加载类的时候类中的方法并没有被jvm所执行,然而对象主要在方法中创建,对象的产生在类的加载之后,所以说static关键字先于对象的而存在。
static关键字特性一——–被static关键字所修饰的成员变量可以直接被类名所调用(也可以被对象调用)
看一个例子:

public class teacher{
    public int age1=22;
    public static age2=22;
public static static void main(String []args){
    teacher t=new teacher();
    System.out.println(t.age1);
    System.out.println(teacher.age2);

}
}
输出结果:22
    22

结果显示,总能正确显示出age1 和age2的答案22,然而二者的调用方式却大不一样,第一种是先在堆中创建一个对象t,而第二种无需创建对象,直接通过类名来调用,节省了内存空间,这也是static关键字的好处之一吧。
static关键字的几点注意
1.在在静态方法中(被static关键字修饰的方法)是没有this关键字的。这是因为static是随着的类的加载加载,this随着对象的创建而存在,同时类的加载先于对象的创建,所以静态方法和this是无法共存的。
2.静态方法只能访问静态的成员变量或成员方法
2.1当静态方法访问成员变量或者成员方法时,成员变量或者成员方法必须是静态的,也就是说成员变量或者成员方法必须被static关键字所修饰。
2.2非静态方法访问成员变量或者成员方法时,成员变量或者成员方法既可以是静态的(被static关键字修饰),也可以是非静态的。
总之一句话:静态只能访问静态,非静态既可以访问静态也可以访问非静态。
静态变量和成员变量的区别
1.所属不同
静态变量属于类,是类变量。
成员变量属于对象,是实例变量(对象变量)
2.内存所处位置不同
静态变量存储于方法区的静态区中
成员变量存储于堆内存中
3.生命周期不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而产生,随着对象的消失而消失
4.调用不同
静态变量既可以被类名直接调用,也可以被对象所调用
成员变量只能被对象所调用
main方法的解析

public static void(String[]args){
}

public:公共的,访问权限最大,由于main方法是要被jvm所调用,所以权限要足够大。
static:静态的,可以直接被类名调用,所以这样可以方便被jvm直接调用,减少内存小消耗,所以main方法中要加关键字:static。
void:因为方法的返回值是返回给调用者的,而main方法的调用者是Java虚拟机(jvm),如果把值返jvm这样是没有意义的,所以要是void,无返回值。
main:规定的写法,程序的执行入口,大多数编程语言的主方法都是main。
String[ ]args:字符串数组,早期是为了接收键盘录入数据,jdk1.5后才出现了Scanner扫描录入。数组名为args,是一个空的数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值