静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍
来源:互联网 发布:js 清空数组 编辑:程序博客网 时间:2024/06/18 00:16
静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍
静态变量
静态变量是类中的一种特殊变量,他在运行是可以说是从属于类,也就是说由该类定义生成的所有对象共用同一个静态变量,内存中只有一个版本。这对于要求在程序运行过程中,只有一个对象副本存于内存非常重要,如在实现单例模式时,为了实现只有一个类对象存于内存中,我们把内对象定义为一个静态变量;为了确保这个执行过程中,只有一个Connection对象村与内存中,我们把Connection定义为类静态变量。
静态代码块
静态代码块是以变量static表示的一段代码块,他是在第一次创建该类对象或第一次调用该类静态方法时执行,整个程序运行过程中最多执行一次。
静态方法
静态方法跟静态变量有点类似,也可以说是从属于类的方法,不用定义类实例对象就可以通过类名调用该方法。因此,我们也很容易知道,静态方法只能操作类的静态成员(包括静态变量和静态方法)或者其自己定义的内部成员。
非静态变量
非静态变量是属于特定类实例对象的,每个对象都有一个自己的副本。区别于静态变量的所有对象共用一个副本
非静态方法
非静态方法也可以说是属于对象的,只有类定义的对象才可以调用它,非静态方法可以操作静态变量,非静态变量及静态方法。
为了更好的理解以上内容,我将会给出一个实例程序,分析其在内存中的相关情况:
public class ClassA {
private int a;
private static int sa;
static
{
System.out.println("ClassA中的静态代码块开始");
sa=11;
System.out.println("ClassA中的静态代码块结束");
}
public ClassA()
{
System.out.println("ClassA中的构造函数开始");
a=1;
sa=10;
System.out.println("ClassA中的构造函数结束");
}
public void nonStaticPrintA()
{
System.out.println("ClassA中的非静态方法开始");
System.out.println("非静态变量a:"+a+"n静态变量sa:"+sa);
System.out.println("ClassA中的非静态方法结束");
}
public void staticPrintA()
{
System.out.println("ClassA中的静态方法开始");
System.out.println("不能调用非静态变量或非静态方法n静态变量sa:"+sa);
System.out.println("ClassA中的非静态方法结束");
}
}
public class ClassB extends ClassA {
private int b;
private static int sb;
static {
System.out.println("ClassB中的静态代码块开始");
sb = 111;
System.out.println("ClassB中的静态代码块结束");
}
public ClassB() {
System.out.println("ClassB中的构造函数开始");
b = 1;
sb = 10;
System.out.println("ClassB中的构造函数结束");
}
public void nonStaticPrintB() {
System.out.println("ClassB中的非静态方法开始");
System.out.println("非静态变量b:" + b + "n静态变量sb:" + sb);
System.out.println("ClassB中的非静态方法结束");
}
public void staticPrintB() {
System.out.println("ClassB中的静态方法开始");
System.out.println("不能调用非静态变量或非静态方法n静态变量sb:" + sb);
System.out.println("ClassB中的非静态方法结束");
}
}
public class Main {
public static void main(String[] args) {
// TODO code application logic here
ClassA a=new ClassA();
//ClassB b=new ClassB();
}
}
结果1
public class Main {
public static void main(String[] args) {
// TODO code application logic here
//ClassA a=new ClassA();
ClassB b=new ClassB();
}
}
结果2
public class Main {
public static void main(String[] args) {
// TODO code application logic here
ClassA a=new ClassA();
ClassB b=new ClassB();
}
}
结果3
总结:
1. 调用类构造函数创建对象执行顺序:父类静态代码块-》子类静态代码块-》父类构造函数-》子类构造函数
2. 静态代码块在整个程序执行过程中最多执行一次。如果按一般情况需要执行的静态代码块,但是它已经执行了,就不用在执行,具体参考结果2和结果3.
- 静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍
- Java中静态变量、静态方法、静态代码块、非静态变量、非静态方法的简介(转)
- 静态成员方法、静态成员变量、静态块、非静态成员方法、非静态成员变量—Java
- java中静态的代码块,静态变量,静态方法
- java中静态的代码块,静态变量,静态方法
- java基础---静态变量、静态块、非静态块、构造函数及静态方法总结及一点儿想法
- 静态方法中引用非静态变量
- 静态方法能否访问非静态变量
- static变量 静态方法 静态代码块
- java 继承时子类父类的静态非静态成员变量,构造方法,静态代码块的初始化顺序
- 静态方法(类方法),静态变量,静态代码块
- 静态方法不能调用非静态变量,非静态方法可以引用静态变量
- 静态变量,非静态变量
- Java学习:静态方法,静态变量和静态代码块
- java中的静态变量、静态方法与静态代码块
- java中的静态变量、静态方法和静态代码块
- java中的静态变量、静态方法与静态代码块
- java中的静态变量、静态方法与静态代码块
- hibernate的配置文件及连接池
- 程序员们 不要想一辈子靠技术混饭吃
- JS类库整理–判断干支、生肖和星座 –js
- Recommended Browsers for Oracle E-Business Suite 11i/R12
- 大话PreparedStatement.addbatch()的使用
- 静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍
- QT中.pro文件的写法
- find/grep
- java泛型
- Tomcat 创建服务启动
- 从解决php错误“Exception thrown without a stack frame in Unknown on line 0”想到的
- Linux常用性能检测命令搜集
- X264码率控制流程分析
- Android API教程:人脸检测(上)