Java:static的作用分析
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的作用分析的更多相关文章
- JAVA! static什么作用?
是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...
- JAVA! static的作用
是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...
- java内部类的作用分析
提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
- 【转】java内部类的作用分析
转自:http://blog.csdn.net/ilibaba/article/details/3866537 另收另外一篇有空的时候看:http://jinguo.iteye.com/blog/71 ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- JAVA 从GC日志分析堆内存 第七节
JAVA 从GC日志分析堆内存 第七节 在上一章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比 ...
- Java Reference 源码分析
@(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...
- Java——static关键字
前言 static关键字算是Java中比较复杂的关键字之一,它可以修饰变量.方法.类以及代码块.下面将介绍static的具体使用. static引入的目的 static的作用 static修饰变量 s ...
随机推荐
- Jmeter入门12 __time函数 jmeter获取当前系统时间
有的接口要传递当前的日期或时间,可以用__time()函数获取当前时间 ${__time()} 当前时间到计算机元年的毫秒数 ${__time(时间格式)} 以预定的格式显示当前时间 请求示例: ...
- Android面试问题收集总结
转载请标明出处: http://www.cnblogs.com/why168888/p/6405204.html 本文出自:[Edwin博客园] Android基础 View的绘制流程:自定义View ...
- thrift基本概念和实例
一.thrift可以做什么 thrift是一个跨语言通信的工具,支持的语言多,而且还提供服务器端的众多网络模型,使服务端的开发可以只专于服务本身的逻辑. 二.thrift重要概念 1.processo ...
- JVM原理:4 运行期优化
JVM运行期优化 Java程序在运行的期间,可能会有某个方法或者代码块的运行特别频繁时,就会把这些代码认定为“热点代码”.为了提高热点代码的执行效率,在运行时JVM会将这些代码编译成与本地平台相关的机 ...
- SQLServer用存储过程实现插入更新数据
实现 1)有同样的数据,直接返回(返回值:0): 2)有主键同样,可是数据不同的数据,进行更新处理(返回值:2): 3)没有数据,进行插入数据处理(返回值:1). [创建存储过程] Create pr ...
- HDU 6214 最小割边
双倍经验题:HDU 6214,3987 求最小割的最小边. 方案一: 首先跑最大流,这个时候割上都满载了,于是将满载的边 cap = 1,其他 inf ,再跑最大流,这个时候限定这个网络的关键边就是那 ...
- 【洛谷P4124】[CQOI2016]手机号码
手机号码 数位DP模板题 记忆化搜索: #include<iostream> #include<cstring> #include<cstdio> using na ...
- 如何确定VS编译器版本
_MSC_VER是MSVC编译器的内置宏,定义了编译器的版本,_MSC_VER 值对应版本关系 MSVC++ 11.0 _MSC_VER = 1700 (Visual Studio 2012) MS ...
- Mysql之inner join,left join,right join详解
首先借用官方的解释下: inner join(等值连接):只返回两个表中联结字段相等的行: left join(左联接):返回包括左表中的所有记录和右表中联结字段相等的记录: right join(右 ...
- c语言描述的二叉树的基本操作(层序遍历,递归,非递归遍历)
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define ...