问答详情
源自:8-7 Java 中的 static 使用之静态变量

关于静态方法不能调用非静态方法的问题

基本前提:静态方法不能调用非静态成员(成员方法与成员变量)

代码:一个main方法可以这么写:

class Demo{
    public static void main(String[] args){
        Demo d = new Demo();
        }
    }

解释:这里用的是Demo的内置无参构造函数,构造函数也是一个普通函数,也没有被static修饰,所以从这里理解构造函数只是一个成员函数

问题:那么,作为静态函数的main,是如何调用作为成员函数的构造函数的?

提问者:Antique 2017-08-27 15:01

个回答

  • qq_Smile夏汐_0
    2017-08-27 15:10:58
    已采纳

    这里是创建一个对象,不仅仅是调用构造函数,如果说连对象都不能创建了,还谈什么写程序了

  • Antique
    2017-09-05 16:13:39

    这个问题我算是终于找到正确答案了,如下:

    参考链接:http://rednaxelafx.iteye.com/blog/652719

    准确来说,构造方法(Constructor)实际上与普通方法(Method)是两个东西,大概翻译过来的时候为了大家容易上手就说是构造方法了。其实这有点混淆了。

    从JVM上看,静态static方法与构造方法(constructor)在内联优化的时候,效果是一样的,不过这不能说构造方法就是static。

    其实最后还是不太清楚,JVM原理还是不太清楚,不过基本可以理解。

  • 慕婉清3825589
    2017-08-27 16:35:43

    静态属性调用的时候不能创建实例,非静态属性必须通过创建的实例才能调用

  • Antique
    2017-08-27 15:14:01

    为排除main程序的特殊性,再贴一段非main函数Demo:如下:

    package com.antique;
    
    public class test {
        public static void main(String[] args){
            callDemo();           // 静态方法调用静态方法
        }
    
        public static void callDemo(){
            Demo d = new Demo();          //静态方法调用别人的构造函数
        }
    
    }
    
    class Demo {
    
        public Demo(){          //构造函数 普通成员函数
            System.out.println("Constructor is called");
        }
    
    }


  • qq_Smile夏汐_0
    2017-08-27 15:09:23

    这是main函数,不一样