static关键字、类的分类、对象的内存图解

本文介绍了Java中的static关键字,解释了静态变量和静态函数的概念,并探讨了类的分类,包括实体类、工具类和主类/测试类。同时,文章通过对象的内存图解阐述了Java程序运行时内存的分配情况,强调了静态方法区和非静态方法区的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

static关键字

类的分类

对象的内存图解


static关键字

成员变量+static=静态变量         主要是解决成员变量重复的问题

class Chinese{
    static int momo;
    static boolean kaka;
    String name;  
    String age;
    static String country="China"; 
    //无法从静态上下文中引用非静态
    public void show(){
        String name="旺财";
        System.out.println(name+age+country);
    }
    public static void haha(){
        System.out.println("哈哈");
    }
    public static void main(String[] args){

    }

 每个对象中都有“name 、age、country”,但是每个对象中的“country”都是一样的,所以现在这样写有点浪费空间,所以当我们在设计类的时候,发现多个对象中有共享数据的时候,我们就可以把这个共享的数据定义为静态的。这时将“country”单独拿出来,原先三个对象就不用再定义“country”,如果每个对象想调用“country”时,去相应的位置寻找即可。

 静态的东西从堆中对象的空间里抽取出来,放到---------静态方法区

举个例子:如果你要喝水,选择水杯或水壶------特有      饮水机-------共有
    上述可以知道:共有的数据存在于一个特定的空间------>静态方法区
    你去学校上课,学校的饮水机在;你下课回家,学校的饮水机还在。说明一个问题----->共有的数据存活的周期比对象长

 

成员函数+static=静态函数

先想一个问题:静态函数意味着就是对象的共有行为吗?不是的

class StaticDemo{
    public static void main(String[] args){
        Chinese c1=new Chinese();
        Chinese c2=new Chinese();
        Chinese c3=new Chinese();
        //通过 对象.变量  
        //1.先去堆内存中对象的所属空间里找
        System.out.println(c1.name);    //成员变量
        //2.再去静态方法区中该对象所属类的空间里找
        System.out.println(c1.country); //静态变量

        //通过 对象.函数
        //1.先去非静态方法区中该对象所属类的空间里找
        c1.show();
        //2.再去静态方法区中该对象所属类的空间里找
        c1.haha();

        System.out.println(Chinese.country);
        Chinese.haha();
        //Chinese.show();
        System.out.println(Chinese.momo);
        System.out.println(Chinese.kaka);
    }
}
class Chinese{
    static int momo;
    static boolean kaka;
    String name;   
    String age;    
    static String country="China"; 
    //无法从静态上下文中引用非静态   public static void show()
    public void show(){
        String name="旺财";
        /*
        成员函数内部在调用变量时的顺序:
        1.先找局部变量
        2.去堆中对象空间中找
        3.去静态区该对象所属类的空间里找
        
        我要喝水 水从哪里来
        1.如果你的嘴里已经有水 直接喝
        2.如果你的嘴里没水 杯子里有水 拿杯子喝 
        3.如果你的嘴里没水 杯子没水 去饮水机 
        (先不考虑继承的情况下)
        */
        System.out.println(name+age+country);
    }
    public static void haha(){
        System.out.println("哈哈");
    }
    public static void main(String[] args){

    }
}

 

静态是优先于对象存在的,静态也称之为是类的成员,我们可以直接通过类去调用     类.静态成员

为什么主函数是静态的?主函数是程序的入口,优于其它运行

假设主函数是非静态的,那么必须先创建对象,才能调用主函数。


类的分类

  1. 实体类:
  • 就是为了描述一个事物 Person Point   
  • 类中内容基本上都是成员函数/成员变量
  • 也会而存在一个静态成员

    2.  工具类:

  • 提供一些已经被实现好的功能 向外部供应
  • 所以工具类中基本上全都是静态函数
  • 类.Xxx 类.Xxx() Math Arrays
  • 为啥工具类中都是静态?

            1.共有的
            2.长时间存在
            3.加载一次 后期随便使用

说一个道理:当我们钉一个钉子的时候,找榔头,是造一个榔头,还是用已存在的榔头?如果工具类可以被创建对象,是不是就想用的时候去创建---------效率较低

    3.主类/测试类

  • 主要用于运行/测试代码
  • 这个类中会有主函数的存在
  • 实体类是可以存在主函数的,但是不推荐
  • 工具类一般不会存在主函数

建议:一个类一个.java文件


对象的内存图解

 1.javac 将Java源代码进行编译 生成字节码文件
 2.java 将字节码文件加载进虚拟机中 开始运行程序
        字节码具体被加载在方法区里面
        方法区可以大致分为 非静态方法区/静态方法区
        所有非静态的代码(二进制)内容加载进非静态去
        所有静态的代码(二进制)内容加载进静态区
        JVM接下来会根据参数(java 字节码文件名(类名)) 去静态区找主函数
        将主函数代码加载进虚拟机栈,开始运行

 3.后面的和之前一样

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值