A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 燕国庆 高级黑马   /  2012-10-18 11:19  /  2362 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 燕国庆 于 2012-10-23 17:37 编辑

用static函数调用被声明为private的构造函数
        
        private Soup(){}
        
        public static Soup makeSout()
        {
                return new Soup();
        }
这个函数可以调用上面的构造函数吗???当static 加载到内存中构造函数是不是还没存在在对内存中?

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
可以调用上面的构造方法.
使用Soup类时,JVM会把Soup.class文件加载到内存的方法区中,包括构造函数的定义、静态方法的定义。
当程序运行调用静态方法时,会把静态方法压栈到栈区并执行。
当程序运行调用构造方法时,会把构造函数压栈到栈区并执行。
因为静态方法中没有this,在方法体中无法直接通过本类对象使用实例属性,也就是说this.属性无法使用,也就是我们常说的静态方法中不能使用非静态属性。
但我们可以通过new一个实例对象来调用属性和方法。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
可以调用的,
class Demo35
{
int a;
private Demo35(int a)
{
  this.a=a;
  System.out.println(this.a);
}
public static Demo35 MakeDemo()
{
  
  return new Demo35(4);
}
public static void main(String[] args)
{
  MakeDemo();
}
}
最后的输出结果为4
构造函数私有化是单例模式,如果整个应用对于某个类只需要1个实例,或者只能是同一个实例的话,就应该设成单例

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
丁旭 发表于 2012-10-18 11:35
可以调用上面的构造方法.
使用Soup类时,JVM会把Soup.class文件加载到内存的方法区中,包括构造函数的定义 ...

上面的例子中,在还没有创建对象的时候,即通过类名的调用构造函数是不可以的吧,因为在用到该类时,JVM会把它加载到内存中,又由于静态的优先于对象存在,所以不能调用它,即不通过实体调用是不可以的吧?!!!
回复 使用道具 举报
燕国庆 发表于 2012-10-18 16:01
上面的例子中,在还没有创建对象的时候,即通过类名的调用构造函数是不可以的吧,因为在用到该类时,JVM ...

静态方法和静态属性不一样。
静态属性随着类加载到方法区中,会为它开辟空间,进行默认初始化、显式初始化。
但静态方法是没有空间的。当程序调用它时,方法会被压栈到栈区运行。其实静态方法与实例方法执行是相同的。
只不过静态方法中没有this,所以无法使用实例属性或实例方法。
回复 使用道具 举报
丁旭 发表于 2012-10-18 16:13
静态方法和静态属性不一样。
静态属性随着类加载到方法区中,会为它开辟空间,进行默认初始化、显式初始 ...

在看视频时毕老师说其实在系统内存中有一个方法区,类中的静态属性,类中的方法(函数)都在这个内存区域中。谢谢你的解答,麻烦你了,我再好好理解一下吧!!!
回复 使用道具 举报
丁旭 中级黑马 2012-10-18 17:58:37
7#
燕国庆 发表于 2012-10-18 17:34
在看视频时毕老师说其实在系统内存中有一个方法区,类中的静态属性,类中的方法(函数)都在这个内存区域 ...

方法区里包含实例属性的定义、实例方法的定义、静态属性、静态属性的定义、构造方法的定义
回复 使用道具 举报
完全可以,一直都是构造函数先加载,除非你在类中定义了静态代码块,也就是:
  1. static{
  2.       语句;
  3. }
复制代码
这时静态代码块会优先于构造函数加载
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马