面向对象(三)
一、构造器(构造方法)
1.概述以及作用
构造器也叫构造方法,在构造类的对象时,构造器会运行,以便将实例域(成员变量)初始化成所希望的状态。
作用:给对象的数据(属性)进行初始化赋值,也可以不进行任何赋值。
2.例子:
1)代码
1 public class Person { 2 //成员变量 3 String name; //姓名 4 int age; //年龄 5 6 //空构造器 7 public Person(){ 8 9 } 10 11 //有参构造器 12 public Person(String name, int age) { 13 this.name = name; 14 this.age = age; 15 } 16 } 17 18 class Demo { 19 public static void main(String[] args){ 20 //空构造器 21 Person p1 = new Person(); 22 //有参构造器(初始化给对象赋值) 23 Person p2 = new Person("王阳明","55"); 24 25 } 26 }
有两个构造器,一个是空构造器,另一个是有参构造器。构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
2)构造器格式的特点:
- 构造器与类同名(大小也要一致)
- 每个类可以有一个以上的构造器
- 构造器参数可以有0个、1个或多个参数
- 构造器没有返回值return
- 构造器总是伴随着new操作符一起调用
3.构造器的重载
1)代码
1 //空构造器 2 public Person(){} 3 4 //有参构造器 5 public Person(int age) { 6 this.age = age; 7 } 8 public Person(String name) { 9 this.name = name; 10 } 11 public Person(String name, int age) { 12 this.name = name; 13 this.age = age; 14 }
Person()、Person(int age)、Person(String name)等这四个方法名相同,与返回值无关,只看参数列表。这就是构造方法的重载。重载只不过是在new时根据需求给不同的属性赋值罢了。
注:1.如果我们没有给出构造方法,系统将自动提供一个无参的构造器。
2.如果我们给出了构造方法,那么将不再用系统的,如果需要使用,必须自己给出。建议永远给出无参构造器。
4.通过Set方法和构造器给成员变量赋值有什么区别?
之前,我们给出了set/get方法,而是给成员变量赋值的,那么他和构造器赋值有什么区别呢。
首先,构造器给对象赋值是发生在构造类的对象的时候随着new的执行被调用。而且不能对已经存在的一个对象调用构造器重新赋值。而set方法,是对象实例化以后,通过调用set方法进行给成员变量赋值,可以重新赋值进行更新。
其次,set方法强调的是修改属性值,而构造器则是给对象属性进行初始化。
二、对象创建的过程(内存图)
如图:
三、static关键字
1.static的特点:
1)随着类的加载而加载
2)优于对象存在
3)被类的所有对象共享 (举例:班级学生拥有一个老师,那么老师可以为静态的,供学生共享。)
4)可以通过类名直接调用。其实他本身也可以通过对象名调用。当然,推荐使用类名调用。
2.static注意事项:
a:在静态方法中是没有this关键字的
* 如何理解呢?
* 静态是随着类的加载而加载,this是随着对象的创建而存在。
* 静态比对象先存在。
b:静态方法只能访问静态的成员变量和静态的成员方法
* 静态方法:
* 成员变量:只能访问静态变量
* 成员方法:只能访问静态成员方法
* 非静态方法:
* 成员变量:可以是静态的,也可以是非静态的
* 成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
* 简单记:
* 静态只能访问静态。
3.静态变量和成员变量和区别
首先,静态变量也叫类的变量,随着类的加载而加载。成员变量也叫对象变量,随着对象的创建而创建。
因此具体的不同是:
1)所属不同:
静态变量属于类
成员变量属于对象
2)内存当中的位置不同:
静态变量属于方法区中的静态区
成员变量属于堆内存
3)内存出现时间不同:
静态变量随着类加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失。
4)调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用。
如有错误之处,欢迎指正。