Java基础之静态方法和实例方法的区别

这是在看面试题的时候看到的一道题,怪自己基础不够扎实,觉得很疑惑,所以敲了一遍代码验证了一下。

静态方法和实例方法的区别主要体现在两个方面:

  1. 在外部调用静态方法的时候,可以用类名.方法名进行调用,不必新创建一个对象。当然也可以创建一个对象,通过对象名.方法名进行调用,不过这种方法并不推荐。而实例方法则必须创建一个对象,通过该对象进行调用
  2. 静态方法在访问本类成员时,只允许访问静态成员(静态成员变量和静态方法)。而实例方法没有限制。
public class Cat {
    public static void main(String[] args) {

        // 使用对象调用 不推荐!
        new Cat().isStatic();
        // 调用静态方法无需创建对象,因为在java虚拟机加载类的时候就会把该类的静态方法直接加载到内存中,给静态方法分配一个内存空间
        Cat.isStatic();

        // 实例方法只能通过创建对象来调用
        Cat cat = new Cat();
        cat.notStatic();

    }
    public static void isStatic(){
        // 由于静态方法不能通过对象进行调用,故静态方法里面不能调用非静态变量或非静态变量成员
        System.out.println("静态方法");
    }

    public void notStatic(){
        System.out.println("实例方法");
    }
}

​ 运行结果

静态方法
静态方法
实例方法

上面的回答好像还是过于普通了
根据这个问题我们先分析一下都需要哪方面的知识,静态方法,实例方法分别是什么?JVM是怎么加载的?两者的区别是什么?

关于static关键字

Java语言中,static代表静态的意思。可以修饰成员变量和成员方法,也可以是静态代码块。static的主要作用在于创建独立于具体对象的域变量或者方法。

静态变量和静态方法都是属于那个类本身,而不是那个类的对象。所以静态方法的调用并不依赖于对象,这也就说明了为什么我们可以直接通过类名来调用静态方法。因为类的静态方法和静态变量是在类装载的时候装载的,这个时候还没有产生对象。具体的可以去看看类加载的机制
类加载机制

静态方法和实例方法在加载期的区别

Java虚拟机(JVM)只有一个堆区被所有线程所共享,堆区中有一块特殊的区域叫做方法区(静态区),这个区域也是被所有线程所共享的,JVM保存的所有信息都在这个方法区中,所以方法区在加载方法的时候都是统一对待的,无论是静态方法还是实例方法都是在类第一次被使用时加载,时机上没有区别。

静态方法和实例方法内存区别

静态方法在程序开始时生成内存,实例方法在程序运行中生成内存。所以静态方法可以直接调用,实例方法要先生成实例才能调用。静态方法速度很快,但是多了会占内存,所以不管是任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。
main函数的一个执行的过程如下图
在这里插入图片描述

静态方法和实例方法调用区别

静态方法:类名.方法名

实例方法:实例名.方法名

这么看好像除了修饰语不一样这两个方法也没什么不同,其实确实如此,我们可以将实例方法写成静态的,将实例作为参数传入即可,一般不会出什么问题,只是调用方式不一样。如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤。

从面向对象的角度上来说,在选择使用实例化方法或静态方法时,如果方法和实例化对象具有逻辑上的相关性,就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。从语言本身来看,JAVA是面向对象的语言,既然面向对象,那最好还是用实例化对象方法最合适。


大致解决了本小白的疑惑
有什么不太确定的,一定要多上机验证!多上机验证!多上机验证!不要眼高手低
本文参考了该文章:
https://blog.csdn.net/adam_swx/article/details/102861275.

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java中,静态方法实例方法有以下区别: 1. 访问方式:静态方法可以通过类名直接调用,而实例方法需要通过对象实例调用。 2. 内存分配:静态方法在类加载时就会被分配内存,而实例方法在对象实例化时才被分配内存。 3. 调用对象:静态方法不依赖于具体的对象实例,而实例方法需要通过对象实例来调用。 4. this关键字:静态方法中不能使用this关键字,因为this代表当前对象实例,而静态方法没有隐含的当前对象实例实例方法可以使用this关键字来引用当前对象实例。 5. 访问权限:静态方法可以直接访问类的静态成员变量和其他静态方法,但不能直接访问实例变量和实例方法实例方法可以访问类的静态成员变量、实例变量和其他实例方法。 6. 继承和重写:静态方法不能被继承和重写,子类中可以定义与父类同名的静态方法,但不会覆盖父类的静态方法实例方法可以被子类继承和重写。 7. 静态上下文:静态方法中只能访问静态成员,因为它们在对象实例化之前就已经存在。实例方法可以访问静态成员和实例成员。 8. 设计用途:静态方法通常用于实现与类相关的功能,如工具方法或工厂方法;而实例方法通常用于操作对象的行为和状态。 总的来说,静态方法是与类直接关联的,独立于对象实例存在;而实例方法是与对象实例相关的,需要通过对象实例来调用,并可以访问对象的状态和行为。选择使用哪种方法取决于具体的需求和设计目标。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值