为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

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

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

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

正在回答

5 回答

这里是创建一个对象,不仅仅是调用构造函数,如果说连对象都不能创建了,还谈什么写程序了
0 回复 有任何疑惑可以回复我~
#1

Antique 提问者

这个我是理解的。只是逻辑上搞不通,实在是难受
2017-08-27 回复 有任何疑惑可以回复我~
#2

Antique 提问者

创建对象要不就是通过构造函数要不就是静态工厂方法,实际上最后用的还是构造函数,构造函数也是普通函数而已啊
2017-08-27 回复 有任何疑惑可以回复我~
#3

Antique 提问者

非常感谢!
2017-09-05 回复 有任何疑惑可以回复我~
#4

Antique 提问者

这个问题我已经找到正确答案了,麻烦看下问题最下面我的回答
2017-09-05 回复 有任何疑惑可以回复我~
查看1条回复

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

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

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

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

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

为排除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");
    }

}


0 回复 有任何疑惑可以回复我~

这是main函数,不一样

0 回复 有任何疑惑可以回复我~
#1

Antique 提问者

我下面贴了另外一段不是main的,也是可以的
2017-08-27 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信