-
构造器虚拟机实现是不是static的?10
记忆中的印象构造器应该是默认static的
今天上课跟同学讨论的时候
他说:“如果构造器是static的话,那么它里面的字段和方法都必须是static的,但其实我们使用的时候并不是这样的。”
这句话把我整懵了,到底虚拟机是怎么实现构造器的?
如果真是默认static的,那么里面的字段,方法又怎么解释?
问题补充:
我刚查资料了的,构造器其实就是static的,那这个问题就变成了:为什么我们能在static的构造方法里调用非static的字段和方法?
问题补充:
编程思想上面,具体位置我忘了,因为我有个看书记笔记的习惯,我翻了我的笔记是这么写的
问题补充:
我只是想问,其他的static方法不能访问非static字段和方法,但是构造方法为什么可以?这个真的是底层实现而不需要我们关心吗?2009年4月02日 13:27
5个答案 按时间排序 按投票排序
-
你们说的要是是Java,是其中每个类都有的<init>方法的话,那个确实是静态的没错。但就Java语言的语法/语义定义而言,构造器就不是静态的。举例来说,java.lang.Object中的public Object() { ... }并不是静态的,但由它生成的代码java.lang.Object::<init>()则是静态方法。
2009年4月02日 20:24
-
构造器是指构造函数吧?
静态其实比较好理解:new SomeClass() 就是 SomeClass.newInstance() ……
静态方法一般不能访问实例变量,但是这个方法归虚拟机管,解释权在它手里……它让访问哪个实例都行。
其实,“实例方法”是不会被实例化的 -__-,我的理解是隐藏了实例这个参数的静态方法……
所以有人说面向对象是语法糖。2009年4月02日 19:30
-
先不谈虚拟机的问题。楼主所指的构造器是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 中,类装载器把一个类装入 Java 虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的。
验证这一阶段的主要目的是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 准备 准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配...
20. 为什么Java中的构造器不能是final、static或abstract的? 这些问题帮助面试者展示对面向对象概念的理解,例如继承、封装、多态等,并且要求对Java语言的特性有深刻的认识。例如,继承是OOPS的一个核心概念,它...
初始化阶段是执行类构造器`()`方法的过程。类的初始化阶段会执行类变量的初始化代码。 #### 四、实战案例分析 以下是一个简单的示例,展示了类加载器的使用情况。 ```java package test01; public class ...
17、构造器Constructor 是否可被override? 9 18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回值为true 的有: 10 21、当一...
Java面向对象面试题 以下是对Java面向对象面试题的知识点...是否可以从一个 static 方法内部发出对非 static 方法的调用?写 clone() 方法时,通常都有一行代码,是什么?等问题可以根据 Java 的语法和语义来回答。
- **static:** 构造器不能被static修饰,因为它用于创建对象实例,而static成员与类本身关联。 - **abstract:** 构造器不能被abstract修饰,因为它必须有具体的实现来创建对象实例。 ### 继承与组合 21. **Java...
19、构造器Constructor是否可被override? 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 21、写clone()方法时,通常...
构造器用于初始化新对象,如果没有显式定义,Java会自动生成一个无参构造器。构造器可以重载,即在同一个类中可以定义多个构造器,它们的参数列表不同。 【this关键字】 this关键字代表当前对象的引用,可以用来...
- **构造器赋值**:在构造器中对成员变量进行赋值,如`public MyClass() { this.y = 30; }` 总结来说,JAVA程序的执行顺序大致遵循以下规则: 1. 类加载时执行静态块 2. 创建对象时,先调用父类构造器 3. 然后执行...
在构造器中,this()可以用来调用同一个类中的其他构造器,而super()则用来调用父类的构造器。如果在子类的构造器中没有显式使用this()或super(),Java编译器会默认调用父类的无参构造器super()。 2. 作用域public, ...
构造器可以重载,但没有专门的拷贝构造器,但可以通过其他方式实现类似功能。 2.8 Java是否支持多重继承? Java不支持传统意义上的多重继承,但可以通过接口实现类似功能。 3. Java线程 3.1 进程与线程的区别是...
- **验证**(Verification):确保字节码文件符合JVM的规范,例如类的结构是否正确、操作是否合法等。这是出于安全性和兼容性的考虑。 - **准备**(Preparation):为类的静态变量分配内存并设置默认初始值。...
- **构造器:** 构造器用于初始化对象的状态,其名称与类名相同且无返回值类型。 - **成员变量:** 类中的数据成员,存储对象的状态。 - **方法:** 类的行为定义,执行特定的操作。 **2.2 对象的创建** - **...
- **DI (Dependency Injection)**:依赖注入,是一种实现IoC的技术手段,通过构造器、setter或其他方法将依赖关系注入对象中。 **16. 判断下列语句是否正确,如果有错误,请指出错误所在?** - 需要具体的语句才能...
构造器代码块,也称为初始化块,不包含`static`关键字。每当创建一个类的新实例时,这些代码块就会被执行。它们可以与构造函数一起使用,用于在对象创建时执行共同的初始化任务。构造器代码块内的代码会先于构造函数...
- 如果一个类没有显式定义任何构造器,编译器会自动提供一个无参构造器。 - **方法**: - 用于执行特定的任务或计算。 - 可以拥有任何合法的标识符名称。 - 可以拥有返回类型(包括`void`)。 - 可以使用修饰...
**问题**:是否可以在 static 环境中访问非 static 变量? **解答**:不可以。由于非 static 变量与特定的类实例相关联,在没有实例化对象之前,它们不存在。尝试在 static 上下文中访问非 static 成员会导致编译...