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

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

  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 静态方法 存放 java静态方法和实例方法_静态方法

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

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

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

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

main函数的一个执行的过程如下图

java 静态方法 存放 java静态方法和实例方法_面试_02

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

静态方法:类名.方法名

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

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

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


大致解决了本小白的疑惑
有什么不太确定的,一定要多上机验证!多上机验证!多上机验证!不要眼高手低