Last modified:2013-04-09 23:45:39
**********************************
关于构造函数:
一个类中默认会有一个空参数的构造函数,这个默认的构造函数的权限和所属类一致。如果类被public修饰,那么默认的构造函数也带public修饰符。如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
默认构造函数的权限是随着类的变化而变化的。
静态代码块:
格式:
static
{
静态代码块中的执行语句;
}
特点:随着类的加载而执行,只执行一次,并优先于主函数。(当运行到类中东西时,类才加载。)
用于给类进行初始化。(第一次加载类时就会执行是类的初始化,而构造代码块是给所有对象的共性内容进行初始化,是在建立对象的时候才执行。)
(类初始化和对象初始化的区别?)
Person p = new Person("zhangsan",20);
这句话都做了什么事情?
0,栈内存分配main中的p空间。
1,因为new用到了Person.class文件,所以会先找到Person.class文件加载到内存中。
2,执行该类中的static代码块,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性,并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址赋给栈内存中的p变量。
初始化顺序:类初始化>>属性默认初始化>>属性显示初始化 >>构造代码块初始化 >>构造函数初始化。
Java构造函数详解:
构造函数:又叫构造方法,是一种特殊的函数,之所以说他特殊是因为他没有返回值,在创建对象的时候调用。在非构造函数中不可以调用构造函数,构造函数间可以相互调用(通过this关键字)。子类的构造函数也可调用父类的构造方法(通过super关键字)。注意:当构造函数间相互调用时必须在第一行调用!如果编写类时没有定义构造函数,那么系统会默认添加一个空参数的构造函数。
———————————————————————————————————————
当创建一个类时,如 Student stu = new Student();
jvm到底做了些什么?
1.栈内存分配main中的stu空间。
2.因为new用到了Studetn.class文件,所以会先找到Student.class文件加载到内存中。
3.执行父类静态代码块。(类初始化)
4.执行子类静态代码块。(类初始化)
5.在堆内存中建立对象的特有属性,并进行默认初始化。
6.父类显示初始化。**
7.执行父类构造代码块。
8.执行父类构造函数。
9.子类显示初始化。**
10.执行子类构造代码块。
11.执行子类构造函数。
———————————————————————————————————————
验证代码如下:
class fu{ other1 o = new other1(); static{ System.out.println("父类的静态代码块"); } { System.out.println("父类的构造代码块"); } fu(){ System.out.println("父类的构造函数"); } } class other1{ other1(){ System.out.println("父类显示初始化"); } } class other2{ other2(){ System.out.println("子类显示初始化"); } } class zi extends fu{ other2 o = new other2(); static{ System.out.println("子类的静态代码块"); } { System.out.println("子类的构造代码块"); } zi(){ System.out.println("子类的构造函数"); } } class Constructor{ public static void main(String[] args){ zi zilei = new zi(); } }
---------------------------------
运行结果:
父类的静态代码块
子类的静态代码块
//(执行到这里时,JVM会给子父类的所有属性分配空间并进行默认初始化)
父类显示初始化
父类的构造代码块
父类的构造函数
子类显示初始化
子类的构造代码块
子类的构造函数
----------------------------------
class X{ int xmask = 1; int mask; X(){ mask = xmask; System.out.println("mask="+mask);//1 method();//调用了可以被子类重载的方法,获取的ymask=0; //ymask尚未完成显示初始化。 } void method(){ System.out.println("父类的method方法,xmask="+xmask); } } class Y extends X{ int ymask = 2; Y(){ mask += ymask; System.out.println("mask="+mask);//3 method(); } void method(){ System.out.println("子类的method方法,ymask="+ymask); } } class Demo4{ public static void main(String[] args){ Y test = new Y(); } }
---------------------------------
运行结果:
mask=1
子类的method方法,ymask=0
mask=3
子类的method方法,ymask=2
---------------------------------
分析:
子类和父类的构造函数都调用了method方法,
执行的都是子类的method方法,
但是method输出的结果却不一样;
总结:在设计对象构造阶段调用的这些方法必须考虑上面这些因素。
构造函数应该避免调用那些可覆盖的方法,即不是私有的,静态的或final的方法。
如果调用了这些方法,必须在文档中特别说明。
———————————————————————————————————————
相关推荐
Java类的初始化遵循一定的顺序:首先执行静态初始化块和静态成员变量的初始化,然后是实例初始化块和实例成员变量的初始化,最后是构造函数的执行。这个顺序确保了类的正确初始化和对象的正确构建。 #### 8. Java...
通过讲解this关键字、继承、static关键字和代码块、final关键字、多态、方法重写、抽象类与接口、封装与隐藏、垃圾回收、类组合、包装类、对象处理、类成员、final修饰符详解等知识点,本文档为Java学习者提供了一套...
Java 基础类详解 Java 基础类是 Java 中非常重要的一个概念,它是 Java 语言的基础组件,包括了 Java 的基本数据类型、字符串、日期和时间、数学运算等。这些基础类是 Java 程序的基础构成部分,对于 Java 程序员来...
### Java编程思想学习笔记知识点...以上是《Java编程思想》学习笔记中关于操作符、控制语句、对象、初始化与清理等关键知识点的总结。通过理解这些基础概念和技术细节,可以更好地掌握 Java 编程的核心原理和技术实践。
- **构造函数 (Constructor):** 构造函数用于初始化对象。一个类可以有多个构造函数,只要它们的参数列表不同即可。构造函数的名字必须与类名相同。 - **生命周期:** 变量的生命周期是指变量存在的有效时间。变量...
构造函数用于初始化类的新实例,它与类名相同,无返回类型,通常在创建对象时通过`new`关键字调用。如果没有显式定义构造函数,Java会提供一个默认的无参构造函数。 9. `this`关键字: `this`关键字引用当前对象的...
### Java学习笔记——面向对象与面向过程对比及面向对象特性详解 #### 面向对象基本概念 在Java学习过程中,面向对象是一个重要的概念。它不仅是一种编程思想,也是理解和解决问题的有效方式。面向对象的基本单位...
- 当需要为同一操作提供多种实现时,例如提供多个构造函数。 #### 三、构造方法 - **目的**:用于初始化对象的状态。 - **特点**: - 构造方法名称与类名相同。 - 无返回类型(即使是 void 也不行)。 - 使用 ...
- 构造方法用于初始化新创建的对象。 - 它的名字必须与类名相同,并且没有返回类型。 **6.8 数据和方法的隐藏——封装** 封装是OOP的核心概念之一,它允许隐藏对象的具体实现细节,只暴露必要的公共接口。 **6.9 ...
### c++学习笔记之拷贝构造函数详解 在C++编程中,理解并正确使用拷贝构造函数至关重要,尤其在处理复杂数据结构和资源管理时更是如此。本文将深入探讨拷贝构造函数的概念、作用以及如何正确实现它,帮助读者避免...
- 构造与析构:对象的生命周期管理,构造函数初始化成员,析构函数清理资源。 - 静态成员与常量成员:静态成员属于类,而非单个对象;常量成员不能修改。 2. **面向对象编程** - 类与对象:封装数据和行为,对象...
- **对象创建与实例化**:理解`new`关键字的作用,学习如何通过构造函数创建对象。 - **封装**:理解面向对象编程的基本原则之一,用于隐藏实现细节,提供公共接口。 3. **控制流程**: - **条件语句**:`if`, `...
#### 一、构造函数与初始化块 Kotlin中定义类时,可以使用主构造函数和次构造函数。主构造函数直接位于类头之后,用于定义类的基本构造逻辑。 - **主构造函数**: - 定义在类头部。 - 不包含任何代码。 - 初始...
2.2 变量与常量:声明、初始化、使用变量,以及常量的定义。 2.3 运算符:赋值、算术、比较、逻辑、位运算符的用法。 2.4 流程控制:条件语句(if-else,switch-case)和循环语句(for,while,do-while)的运用。 ...
- **变量与常量**:理解变量的声明、初始化和作用域,以及常量的定义。 - **运算符**:学习各种算术、比较、逻辑、位和赋值运算符的用法。 - **流程控制**:掌握if语句、switch语句、for循环、while循环等控制...
构造方法用于初始化对象的状态,没有返回值,并且名称必须与类名相同。 #### 变量的类型与作用域 在Java中,变量分为实例变量和局部变量。实例变量是在类中定义但在任何方法之外声明的变量,它们的生命周期与对象...
4. **成员的初始化**:类中的私有成员需要通过公有方法或者构造函数进行初始化。 #### 四、构造函数与析构函数 1. **构造函数**: - 构造函数用于初始化新创建的对象。 - 构造函数没有返回值,也不能有`void`...