Java面向对象-1
构造方法(函数)
构造方法概述和作用
- 构造对象
- 构造对象的时候给对象赋值
构造方法格式特点
- 如果我们没有在类里面写构造函数,则JVM会自动提供一个默认的无参构造2. 函数
- 构造函数的函数名称和类名一模一样
- 构造函数不需要有返回值,同时也不需要使用void修饰
- 如果说程序员提供了构造函数,则JVM不会再提供一个默认的无参构造函数
- 如果在类里面定义了有参构造函数,建议把无参构造函数保留
对象实例化在内存中的状态分析
如上图中有一个CarAuto类,在CarAutoTest中实例化
- 第一步: JVM将CarAutoTest加载到方法区,静态方法main也跟随CarAuto进入了方法区;同时所有使用stasic进行修饰的成员都加载。
- 第二步: main函数进栈,CarAuto被加载到方法区,所有属性都被初始化为一个默认值。
各数据类型的数组初始值
整数型:byte short int long -> 0
浮点型:float double -> 0.0
布尔型:boolean -> false
字符型:char -> “\u0000”
字符串:string -> null
- 第三步: CarAuto的构造方法进栈,对所有属性的值进行显示初始化,完成后构造函数弹栈。
-
第四步: 对象在堆里创建完成,同时分配一个堆内存地址;普通成员(变量等)随对象的创建而创建。
(new CarAuto)
-
第五步: 在栈里创建CarAuto对象的引用car1,然后将CarAuto对象的堆内存地址存放到car1里面。
(CarAuto car1 = new CarAuto;)
- 第六步: 使用引用对象car1给对象里的属性重新赋值
//无参数
CarAuto car1 = new CarAuto();
car1.tireNumber = 4;
car1.color = "银色";
//带参数,注意这种方式时,第六步不会执行,因为在第三步已经被执行了
CarAuto car2 = new CarAuto(3,"红色",315.7);
- 第七步: 使用引用对象car1调用对象中的属性、行为等。
- 第八步: 程序执行结束,main函数弹栈,JVM开始回收垃圾。
小结:
- 当JVM将类加载到方法区的时候,由static进行修饰的成员也加载到了方法区; 当类通过关键字new实例化出来一个对象的时候,在堆内存里面会进行成员属性和行为的默认初始化,同时还会创建一个关键字this来指向堆内存地址;即this滞后于static。
- 普通成员随着对象的创建而创建;静态成员随着类的加载而加载(static)
- 非静态方法既可以访问非静态的成员,也可以访问静态成员;静态方法只能访问静态成员;即静态变量是共享的。