Java中为什么静态的不能访问非静态的
每博一文案
人的一生不是所有的东西都要拿在手里,背在背上,该记得记,该丢的丢,行是一叶扁舟,装得多了,难免再不动许多愁。
人生该记得记?
该丢的丢,记得那些快乐,丢掉那些烦忧。
人生在世,不趁之事十之八九,欺我拒我者,就朝他挥挥衣袖,乱我心者,就让他随风漂流。
快乐是一天,痛苦是一天,何必执着,何必贪求人生,该记得记,该丢得丢?
—————— 一禅心灵庙语
问题: Java中为什么静态得不能访问非静态得
这是我在学习过程,遇到的困惑,通过各种方式,上网,查阅资料,得到的解答,这个疑问的答案
这里 给予大家参考,参考
什么是静态的 和 非静态的
- 简单来说就是被static 关键字修饰的,可称为是静态的
- 而相反,没有被 static 关键字修饰的,可称为是非静态的
静态变量 | 静态方法 | 实例成员变量 | 实例方法 | |
---|---|---|---|---|
静态方法: | 直接访问 | 直接访问 | 不可以直接访问 | 不可以直接访问 |
实例方法: | 直接访问 | 直接访问 | 直接访问 | 直接访问 |
- static 可以用来修饰的变量和成员方法,被修饰的成员是属于类的,而不单单是属于某个对象的,是属于所有的对象的,可以直接使用类名来调用该类中的属性,方法:
类名.属性名 = 值;
类名.方法名( );
class Test {
int num = 10;
static int sNum = 100;
static void print() {
System.out.println("静态方法");
}
}
public class Blog01 {
public static void main(String[] args) {
System.out.println(Test.sNum); // 静态变量访问
Test.print(); // 静态方法访问
}
}
- 非静态变量,和方法的的访问,通过 new 实例化,创建对象,访问
类名 自定义对象名 = new 类名( );
class Test {
int num = 10;
static int sNum = 100;
static void print() {
System.out.println("静态方法");
}
void print2() {
System.out.println("非静态方法");
}
}
public class Blog01 {
public static void main(String[] args) {
Test test = new Test(); // 实例化,创建对象
System.out.println(test.num);
test.print2();
}
发现;
- 静态方法和实例无关, 而是和类相关,是和类一起加载到内存中并创建出来的,并且只加载一份,归属于所有的对象,所有对象共用这一份数据
- 所以我们可以直接通过类名访问,静态的东西,
- 非静态是属性类,但是是在实例化,后才被加载到内存当中去的
解答
从内存的角度分析:
- 首先,静态数据是和类一起加载(创建)到 内存的一块 方法区 的,而且只加载一份,它是优先于对象先存在于内存(方法区) 当中的,所以可以被所有的对象**(通过类名)**调用
- 而非静态数据是在,实例化, new 才会被加载(创建)到内存的一块 堆区 上的,通过 new 实例化对象,可以创建多份,它是慢于静态 加载到内存当中的
- 我们简单的知道,数据,程序只有加载到了,内存当中才可以被执行,运行的.
- 上述说明过,非常重要的一点,就是: 我们的静态的是先于非静态 加载到内存当中的 , 而我们静态的 访问 非静态的时候,非静态可能还没有实例化 (还不存在),这样就导致了,我们静态的访问的是一个还没有创建出来的,不存在的数据.
- 而我们 Java 是个安全性语言,其中有个厉害的家伙 JVM虚拟机 ,我们的 JVM虚拟机 是不允许这样的恶劣的事情发生的,直接暴力的,给予你 报错处理
- 如果你想要静态的可以访问非静态的就需要在,访问之前,实例化 (new) , 创建对象,让其加载到内存 (堆区) 当中去,就可以实现访问了,(不会报错)
class Test {
int num = 10;
static int sNum = 100;
void print2() {
System.out.println("非静态方法");
}
static void print() {
System.out.println("静态方法");
// 我们静态的访问,非静态的方法,报错警告
print2();
}
}
public class Blog01 {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.num);
test.print2();
}
}
最后:
限于自身水平,其中存在的错误,希望大家,给予指教,韩信点兵------- 多多益善, 谢谢大家! 后会有期 , 江湖再见!