Java中为什么静态的不能访问非静态的

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();
    }
}

在这里插入图片描述


最后:

限于自身水平,其中存在的错误,希望大家,给予指教,韩信点兵------- 多多益善, 谢谢大家! 后会有期 , 江湖再见!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值