面向对象编程----static变量和方法_内存分析static
static关键字
类使用类的,对象既可以使用对象的方法,也可以使用类的方法。
在类中,用static 声明的成员变量为静态成员变量,或者叫做:类属性,类变量。
它为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
对于该类的所有对象来说,static 成员变量只有一份。被该类的所有对象共享!!
可以使用“对象.类属性”来调用。不过,一般都是用“类名.类属性”。
static 变量置于方法区中!
用static 声明的方法为静态方法或者叫类方法
不需要对象,就可以调用(类名.方法名)
在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。

package cn.bjsxt.oop.static00;
/**
* @author 神奇的梦
* 包名也不能用出现关键字
*/
public class Student {
// String name;int id;是从属于对象的,有了对象才有它
String name;
int id;
// static 变量static int ss;它的上级是类Student类
// 所以用Student可以直接用
static int ss;
// static 变量 写一个方法
// static void printSS() 从属于类, 在方法区堆里面引用,引用不了
void类是一个不可抗拒的占位符类,用于保存对表示Java关键字void的 类对象的引用。
public static void printSS() {
// Cannot make a static reference to the non-static field name
// 无法对非静态字段名称进行静态引用
用static 声明的方法为静态方法或者叫类方法
不需要对象,就可以调用(类名.方法名)
在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
// name在创建的模板里面,在方法区的堆里面无法引用 不在一个地方
// 直接引用对象的属性引用不了,因为从属的级别不一样
// name="走起";
// study();从属于对象,也不行,
// 在静态的方法里面,不能加载非静态的东西
// study();
System.out.println(ss);
}
// 普通的方法
public void study() {
// printSS();从属于类,我们首先加载的是类,所以必然已经有它了
// printSS();没有加类名,就表示是本类方法
// 所以在普通方法里面可以调用静态的属性和方法
printSS();
System.out.println(name+"在学习");
}
public void sayHellow(String sname) {
System.out.println(name+"向"+sname+"说:你好!");
}
}
package cn.bjsxt.oop.static00;
public class Test {
public static void main(String[] args) {
// static设静态变量或者叫类变量
// 去Student调(选择可以通过类名直接调了)ss
// 对象是以类为模板创建的
// ss从属于类所以对象里面没有
Student.ss=323;
// 再调Student。printSS()
Student.printSS();
// 建一个对象 对象里面只有对象成员变量
Student s1=new Student();
Student s= s1.name;
System.out.println(s);
}
}
静态初始化块
如果希望加载后,堆整个类进行某些初始化操作,可以使用static初始化块。
是在类初始化的执行,不是在创建对象时执行。
静态初始化块中不能访问非static成员。
执行顺序(先不管,等写完集成后,再回头看!):
上溯到Object块,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
本文来自博客园,作者:神奇的梦,转载请注明原文链接:https://www.cnblogs.com/fantasticDream/p/16301651.html
浙公网安备 33010602011771号