0 0

构造器虚拟机实现是不是static的?10

记忆中的印象构造器应该是默认static的
今天上课跟同学讨论的时候
他说:“如果构造器是static的话,那么它里面的字段和方法都必须是static的,但其实我们使用的时候并不是这样的。”
这句话把我整懵了,到底虚拟机是怎么实现构造器的?
如果真是默认static的,那么里面的字段,方法又怎么解释?
问题补充:
我刚查资料了的,构造器其实就是static的,那这个问题就变成了:为什么我们能在static的构造方法里调用非static的字段和方法?
问题补充:
编程思想上面,具体位置我忘了,因为我有个看书记笔记的习惯,我翻了我的笔记是这么写的
问题补充:
我只是想问,其他的static方法不能访问非static字段和方法,但是构造方法为什么可以?这个真的是底层实现而不需要我们关心吗?
2009年4月02日 13:27

5个答案 按时间排序 按投票排序

0 0

你们说的要是是Java,是其中每个类都有的<init>方法的话,那个确实是静态的没错。但就Java语言的语法/语义定义而言,构造器就不是静态的。举例来说,java.lang.Object中的public Object() { ... }并不是静态的,但由它生成的代码java.lang.Object::<init>()则是静态方法。

2009年4月02日 20:24
0 0

创建新实例时,只给实例变量分配内存。

而实例方法在运行时动态绑定到对象的,骨子里还是个“静态方法”……

2009年4月02日 19:34
0 0

构造器是指构造函数吧?

静态其实比较好理解:new SomeClass() 就是 SomeClass.newInstance() ……

静态方法一般不能访问实例变量,但是这个方法归虚拟机管,解释权在它手里……它让访问哪个实例都行。

其实,“实例方法”是不会被实例化的 -__-,我的理解是隐藏了实例这个参数的静态方法……

所以有人说面向对象是语法糖。

2009年4月02日 19:30
0 0

cantellow 写道
我刚查资料了的,构造器其实就是static的

求资料出处

2009年4月02日 19:07
0 0

先不谈虚拟机的问题。楼主所指的构造器是Java里普通的构造器么?是的话那个总是非静态的。
Java里能做初始化的结构很多,下面的代码里有一堆:

public class Foo {
    private static char bar = 'a'; // static field initializer
    
    // a static initialization block
    static {
        bar = 'b';
    }
    
    // another static initialization block
    static {
        bar = 'c';
    }

    private int baz = 1; // member field initializer
    
    // an anonymous constructor
    {
        baz = 2;
    }
    
    // another anonymous constructor
    {
        baz = 3;
    }
    
    // constructor
    public Foo() {
        baz = 4;
    }

    public int getBaz() {
        return baz;
    }

    public static void main(String[] args) { 
        Foo f = new Foo();
        System.out.printf("bar = %c, baz = %d\n", Foo.bar, f.baz);
        // bar = c, baz = 4
    }
}

2009年4月02日 16:20

相关推荐

    虚拟机内存图以及加载类的执行过程

    - **初始化**:执行类构造器`()`方法。 ##### 3.2 类的加载方式 类的加载可以通过以下几种方式实现: - **使用`Class.forName(String className)`**:如果方法区内已经存在对应的`.class`文件对象,则直接通过`...

    Java中的static关键字

    Java 中的 static 关键字 ...在 Java 中,类装载器把一个类装入 Java 虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的。

    JVM调优篇.pdf

    验证这一阶段的主要目的是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 准备 准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配...

    JAVA 面试 1000题内容全覆盖2017年新版

    20. 为什么Java中的构造器不能是final、static或abstract的? 这些问题帮助面试者展示对面向对象概念的理解,例如继承、封装、多态等,并且要求对Java语言的特性有深刻的认识。例如,继承是OOPS的一个核心概念,它...

    深入Java虚拟机JVM类加载学习笔记

    初始化阶段是执行类构造器`()`方法的过程。类的初始化阶段会执行类变量的初始化代码。 #### 四、实战案例分析 以下是一个简单的示例,展示了类加载器的使用情况。 ```java package test01; public class ...

    java面试宝典

    17、构造器Constructor 是否可被override? 9 18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回值为true 的有: 10 21、当一...

    Java面向对象面试题.pdf

    Java面向对象面试题 以下是对Java面向对象面试题的知识点...是否可以从一个 static 方法内部发出对非 static 方法的调用?写 clone() 方法时,通常都有一行代码,是什么?等问题可以根据 Java 的语法和语义来回答。

    Top 1000 Java Interview Questions

    - **static:** 构造器不能被static修饰,因为它用于创建对象实例,而static成员与类本身关联。 - **abstract:** 构造器不能被abstract修饰,因为它必须有具体的实现来创建对象实例。 ### 继承与组合 21. **Java...

    java面试宝典2012版.pdf

    19、构造器Constructor是否可被override? 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 21、写clone()方法时,通常...

    尚硅谷JAVA基础笔记吐血整理

    构造器用于初始化新对象,如果没有显式定义,Java会自动生成一个无参构造器。构造器可以重载,即在同一个类中可以定义多个构造器,它们的参数列表不同。 【this关键字】 this关键字代表当前对象的引用,可以用来...

    JAVA程序执行顺序,你了解了吗.doc

    - **构造器赋值**:在构造器中对成员变量进行赋值,如`public MyClass() { this.y = 30; }` 总结来说,JAVA程序的执行顺序大致遵循以下规则: 1. 类加载时执行静态块 2. 创建对象时,先调用父类构造器 3. 然后执行...

    2014年Java最全面试题以及答案.

    在构造器中,this()可以用来调用同一个类中的其他构造器,而super()则用来调用父类的构造器。如果在子类的构造器中没有显式使用this()或super(),Java编译器会默认调用父类的无参构造器super()。 2. 作用域public, ...

    JAVA面试宝典

    构造器可以重载,但没有专门的拷贝构造器,但可以通过其他方式实现类似功能。 2.8 Java是否支持多重继承? Java不支持传统意义上的多重继承,但可以通过接口实现类似功能。 3. Java线程 3.1 进程与线程的区别是...

    深入java虚拟机加载初始化

    - **验证**(Verification):确保字节码文件符合JVM的规范,例如类的结构是否正确、操作是否合法等。这是出于安全性和兼容性的考虑。 - **准备**(Preparation):为类的静态变量分配内存并设置默认初始值。...

    java基础知识点总结.doc

    - **构造器:** 构造器用于初始化对象的状态,其名称与类名相同且无返回值类型。 - **成员变量:** 类中的数据成员,存储对象的状态。 - **方法:** 类的行为定义,执行特定的操作。 **2.2 对象的创建** - **...

    Java面试宝典

    - **DI (Dependency Injection)**:依赖注入,是一种实现IoC的技术手段,通过构造器、setter或其他方法将依赖关系注入对象中。 **16. 判断下列语句是否正确,如果有错误,请指出错误所在?** - 需要具体的语句才能...

    java代码-日常练习33,代码块### 静态代码块 static{代码内容;} 随着类的加载就执行一次 构造器代码块 {代码内容;} 每创建对象就执行一次 局部代码块 {代码内容;} 方法执行一次执行一次

    构造器代码块,也称为初始化块,不包含`static`关键字。每当创建一个类的新实例时,这些代码块就会被执行。它们可以与构造函数一起使用,用于在对象创建时执行共同的初始化任务。构造器代码块内的代码会先于构造函数...

    E-Crusade笔试题

    - 如果一个类没有显式定义任何构造器,编译器会自动提供一个无参构造器。 - **方法**: - 用于执行特定的任务或计算。 - 可以拥有任何合法的标识符名称。 - 可以拥有返回类型(包括`void`)。 - 可以使用修饰...

    Java面试大全

    **问题**:是否可以在 static 环境中访问非 static 变量? **解答**:不可以。由于非 static 变量与特定的类实例相关联,在没有实例化对象之前,它们不存在。尝试在 static 上下文中访问非 static 成员会导致编译...

Global site tag (gtag.js) - Google Analytics