Java面向对象编程 -2.2

构造方法与匿名对象

现在的程序在使用类的时候一般都按照了如下的步骤进行:

  • 声明并实例化对象,这个时候实例化对象中的属性并没有任何的数据存在,都是其对于数据类型的默认值
  • 需要通过一系列的setter方法为类中的属性设置内容。
    等于说现在要想真正获取一个可以正常使用的实例化对象,必须经过两个步骤才可以完成

但是如果按照这样的方式来进行思考的话 就会发现一个问题:假设说现在类中的属性很多个(8个),这样一来按照我们之前的做法,此时我们需要调用多次(8次)的setter方法进行内容设置
这样的调用实在是太罗嗦了,所以在java里面为了考虑到对象初始化的问题,专门提供有构造方法。

即:可以通过构造方法实现实例化对象的属性初始化处理。只有在关键字new的时候使用构造方法。

在Java程序里面构造方法的定义要求如下:

  • 构造方法名称必须与类名称保持一致
  • 构造方法不允许设置任何的返回值类型,即没有返回值定义
  • 构造方法是在使用关键字new实例化对象的时候自动调用的
class Person{
	private int age;
	private String name;
	
	public void setAge(int a) {
		age = a;
	}
	public int getAge() {
		return age;
	}
	public void setName(String n) {
		name = n;
	}
	public String getName() {
		return name;
	}
	
	public  void intorduce() {
		System.out.println("age= "+age+" name= "+name);
	}
	public Person(int a ,String n) {//有参构造
		age = a;
		name = n;
	}
}
public class xxx {
	public static void main(String[] args) {
		Person per1 = new Person(18,"sakura");
		per1.intorduce();
	}

}

>>>age= 18 name= sakura

在Java程序里面考虑到程序结构的完整性,所以所有的类中都会提供有 构造方法,如果现在你的类中没有定义任何的构造方法,那么一定会默认提供一个无参的,什么都不做的构造方法。
这个构造方法是在程序编译的时候自动创建的。如果你已经在类中明确地定义有一个构造方法的时候,那么这个默认的构造方法将不会被自动创建。
结论:一个类至少存在有一个构造方法

疑问:为什么构造方法不允许设置返回值类型?
既然构造方法也是一个方法,那么为什么不让它定义返回值类型呢?
既然构造方法不会返回数据,为什么不使用void定义呢?
分析:程序编译器是根据代码结构来进行编译处理的,执行的时候也是根据代码结构来进行处理的。
如果在构造方法上使用了void,那么此结构就与普通方法的结构完全相同了,这样编译器会认为此方法是一个普通方法。
普通方法和构造方法最大的区别:构造方法是在类对象实例化的时候调用的,而普通方法是在类对象实例化产生之后调用的。

既然构造方法本身是一个方法,那么方法就具有重载的特点,而构造方法重载的时候只需要考虑参数的类型及个数即可。

class Person{
	private int age;
	private String name;
	
	public void setAge(int a) {
		age = a;
	}
	public int getAge() {
		return age;
	}
	public void setName(String n) {
		name = n;
	}
	public String getName() {
		return name;
	}
	
	public  void intorduce() {
		System.out.println("age= "+age+" name= "+name);
	}
	public Person(int a ,String n) {//有参构造
		age = a;
		name = n;
	}
	public Person() {//无参构造
		age =12;
		name = "sax";
	}
}
public class xxx {
	public static void main(String[] args) {
		Person per1 = new Person();
		per1.intorduce();
	}

}

>>>age= 12 name= sax

在进行多个构造方法定义的时候强烈建议大家有一些定义的顺序,例如:可以按照参数的个数降序或者升序排列

经过了分析之后可以发现,利用构造方法可以传递属性数据,于是现在进一步分析对象的产生格式:

  • 定义对象的名称:类名称 对象名称 = null
  • 实例化对象:对象名称 = new 类名称()。
    如果这时候只是通过实例化对象来进行类的操作也是可以的,而这种形式的对象由于没有名字就称为匿名对象
public class xxx {
	public static void main(String[] args) {
		 new Person().intorduce();
	}
>>>age= 12 name= sax

此时依然通过了对象进行了类中introduce方法的调用,但是由于此对象没有任何的引用名称,所以该对象使用了一次之后就将成为垃圾,
而所有的垃圾将被GC进行回收和释放。

posted @ 2020-02-17 16:25  上杉家主-上杉绘梨衣  阅读(104)  评论(0)    收藏  举报