static表示“静态”或者“全局”的意思,但在Java中不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量


一、静态变量

1. Java中存在两种变量,一种是static修饰的静态变量,又称为类变量。另一种是没有被static修饰的变量,称为实例变量。

2. 被static修饰的成员变量或成员方法独立于该类的任何对象(实例),被所有类对象共享。如果一个实例对象对静态成员变量做了修改,其他实例对象访问该静态成员变量也会受到影响。

 package com.huiAlex;

 public class Cat {
private String name;
private static int age;
private String color; public static void main(String[] args) {
Cat cat1 = new Cat();
Cat cat2 = new Cat(); cat1.color = "white";
cat1.name = "小花";
cat1.age = 4; cat2.color = "black";
cat2.name = "小黑"; System.out.println("小黑的年龄是: "+cat2.age);
}
}

以上代码中,cat1对静态变量age进行了修改,cat2访问age时,age已经被修改过了。在实际应用中,一定要小心使用静态变量。虽然可以达到共享成员变量的目的,但是也使得成员变量难以控制,可能带来意想不到的问题。

3. 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。

对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)


二、静态方法

1. 静态方法可以直接通过类名进行调用,也可以通过任何实例对象进行调用(不推荐)

 package com.huiAlex;

 public class Cat {
private String name;
private static int age;
private String color; public static void main(String[] args) {
Cat cat1 = new Cat(); System.out.println(Cat.Meow());
System.out.println(cat1.Meow());
} public static String Meow(){
return "猫都会喵喵叫~";
}
}

2. 静态方法必须被实现,不能是abstract类型

3. 静态方法中不能使用this和super关键字

4. 静态方法中只能直接访问静态变量和其他静态方法,如果需要访问其他非静态成员变量或成员方法,必须先实例化一个对象,再通过对象进行访问。

 package com.huiAlex;

 public class Cat {
private String name;
private static int age;
private String color; public static void main(String[] args) {
System.out.println(Cat.Meow());
} public String likeWarm(){
return "猫都喜欢暖和的地方";
} public static String likeFish(){
return "猫都喜欢吃鱼";
} public static String Meow(){
Cat.age = 8; // 直接访问静态成员变量
Cat cat2 = new Cat();
cat2.name = "小花"; // 通过实例化后的对象访问非静态成员变量
System.out.println("这只猫叫 "+cat2.name);
System.out.println(Cat.likeFish()); // 直接访问静态方法
System.out.println(cat2.likeWarm()); //通过实例化后的对象访问非静态方法 return "猫都会喵喵叫~";
}
}


三、static代码块

1. static代码块也叫静态代码块,是在类中独立于类成员的static语句块

2. 可以存在多个静态代码块,不能放在任何的方法体内

3. JVM加载类时会执行这些静态的代码块

4. 如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次

 public class Cat {
private String name;
private static int age;
private String color; static{
Cat.age = 2;
System.out.println(age);
Cat cat = new Cat();
System.out.println(cat.likeWarm());
} public static void main(String[] args) { } public String likeWarm(){
return "猫都喜欢暖和的地方";
} static{
Cat.age = 4;
System.out.println(age);
Cat cat1= new Cat();
cat1.name = "小花";
System.out.println(cat1.name);
}
}

运行结果:

Java:static的作用分析的更多相关文章

  1. JAVA! static什么作用?

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...

  2. JAVA! static的作用

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...

  3. java内部类的作用分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  4. 【转】java内部类的作用分析

    转自:http://blog.csdn.net/ilibaba/article/details/3866537 另收另外一篇有空的时候看:http://jinguo.iteye.com/blog/71 ...

  5. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  6. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  7. JAVA 从GC日志分析堆内存 第七节

    JAVA 从GC日志分析堆内存 第七节   在上一章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比 ...

  8. Java Reference 源码分析

    @(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...

  9. Java——static关键字

    前言 static关键字算是Java中比较复杂的关键字之一,它可以修饰变量.方法.类以及代码块.下面将介绍static的具体使用. static引入的目的 static的作用 static修饰变量 s ...

随机推荐

  1. Kubernetes Helm入门指南

    什么是Helm?这可不是暗黑破坏神里装备的名称:头盔,而是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.我们Helm和Kubernetes的关系,我们可以理解成y ...

  2. URL地址解析

    URL的一般格式为(带方括号[]的为可选项): protocol :// hostname[:port] / path /[?query]#fragment   1.protocol :// 为传输协 ...

  3. ShellSort uva

    ShellSort He made each turtle stand on another one's back And he piled them all up in a nine-turtle ...

  4. ubuntu误删home目录

    今天第一次写shell脚本,一不小心把home目录全给删除了. 解决方案: 先把手打上二十大板!!! [root@myshell ~]#mkdir /home/test01             / ...

  5. 创建git项目的feature分支以及下载特定分支的仓库代码

    在掌握了基础git的使用后可以按照这个步骤来: 下载项目:git clone <仓库地址>如果要下载非master的某分支代码:git clone -b <分支名> <仓 ...

  6. 八数码(IDA*算法)

    八数码 IDA*就是迭代加深和A*估价的结合 在迭代加深的过程中,用估计函数剪枝优化 并以比较优秀的顺序进行扩展,保证最早搜到最优解 需要空间比较小,有时跑得比A*还要快 #include<io ...

  7. JSONP--解决ajax跨域问题

    JSON和JSONP JSONP和JSON好像啊,他们之间有什么联系吗? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.对于JSON大家应该是很了解了吧 ...

  8. Linux上往mysql中导入SQL文件

    1.首先连上你的服务器 2.进入你安装好的数据库 mysql -uroot -p****, 3.执行命令 source /xxx/xxx.sql   后面是文件的路径 4.如果你要是在本地有数据库管理 ...

  9. 安装Chrome插件

    重装系统后重装了Chrome浏览器,想着将自己的东西同步到Chrome上.但是登录谷歌账号要FQ,我又是靠setup插件FQ,但插件又要靠账号同步到本地.形成了死循环. 其实重装系统前我将插件提取了, ...

  10. 洛谷P2439 [SDOI2005]阶梯教室设备利用(带权区间覆盖)

    题目背景 我们现有许多演讲要在阶梯教室中举行.每一个演讲都可以用唯一的起始和终止时间来确定,如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的.现在我们想要尽最大可能的利用这个教室 ...