构造方法与匿名对象
在之前讲解了实例化对象的产生格式:
- ①类名称 ②对象名称 = ③new ④类名称();
对于以上的格式观察组成部分:
- ①类名称:任何的对象都应该有其对应的类,因为没有类就不知道对象具备的功能;
- ②对象名称:是一个唯一的标记,表示的是以后的操作的属性的标记;
- ③new:表示开辟新的堆内存空间;
- ④类名称():构造方法。
通过以上的分析就应该已经清楚了,所谓的构造方法指的就是在使用关键字new实例化新对象的时候来调用的操作方法,但是对于构造方法定义也需要遵守如下原则:方法名称必须与类名称相同,并且构造方法没有返回值类型声明,同时每一个类中一定会至少存在有一个构造方法,如果类中没有明确的定义任何一个构造方法,那么将自动生成一个无参的,什么都不做的构造方法。
范例:定义一个无参的什么都不做的构造方法
//在类中定义构造函数
class Person10{//定义一个类,类名称要求首字母大写
private String name = "wangkai";
private int age = 23;
public Person10() {//构造函数,与类名称同名,并且构造方法没有返回值类型声明
System.out.println("***********");
}
public void setName(String n) {
name = n;
}
public void setAge(int a) {
if(a > 0 && a < 150) {
age = a;
}else {
age = 0;
}
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void info() {
System.out.println("name = "+ name + ",age = " + age);
}
}
public class Class10{
public static void main(String args[]) {
//类名称 对象名称 = new 类名称();
Person10 per1 = new Person10();//声明一个新的对象
per1.setName("wangkai");
per1.setAge(160);
per1.info();
}
}
疑问:既然构造方法中没有返回数据,为什么不使用void定义呢?
现在的类中的组成:属性,普通方法,构造方法。
对于类中可以自动生成的无参构造函数方法实际上是有一个前提的:你类中没有定义任何的构造方法,相反,如果你现在类中已经定义了构造方法,那么此类默认的构造方法将不会自动生成。
范例:类中定义一个有参构造方法
//在类中定义一个有参数的构造函数
class Person11{//定义一个类,类名称要求首字母大写
private String name = "wangkai";
private int age = 23;
public Person11(String n,int a) {//构造函数,与类名称同名,并且构造方法没有返回值类型声明
name = n;//setName(n)
setAge(a);
}
public void setName(String n) {
name = n;
}
public void setAge(int a) {
if(a > 0 && a < 150) {
age = a;
}else {
age = 0;
}
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void info() {
System.out.println("name = "+ name + ",age = " + age);
}
}
public class Class11{
public static void main(String args[]) {
//类名称 对象名称 = new 类名称();
Person11 per1 = new Person11("wangkai",30);//声明一个新的对象
per1.info();
}
}
构造方法的作用:
1. 构造方法的调用和对象内存分配几乎是同步完成的,所以可以利用构造方法设置类中的属性内容,构造方法可以为类中的属性进行初始化处理;
2. 通过构造方法设置内容实际上就可以避免重复的setter调用了。
- setter方法除了具备有设置内容之外,也可以承担修改数据的操作;
既然构造方法本身属于方法,那么方法就一定可以进行重载,而构造方法的重载更加简单,因为方法名称就是类名称,你能够做的只有实现参数的类型或个数不同这一概念。
范例:构造方法重载
//构造函数重载
class Person12{//定义一个类,类名称要求首字母大写
private String name;
private int age;
public Person12() {
}
public Person12(String n) {
name = n;
}
public Person12(String n,int a) {//构造函数,与类名称同名,并且构造方法没有返回值类型声明
name = n;//setName(n)
setAge(a);
}
public void setName(String n) {
name = n;
}
public void setAge(int a) {
if(a > 0 && a < 150) {
age = a;
}else {
age = 0;
}
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void info() {
System.out.println("name = "+ name + ",age = " + age);
}
}
public class Class12{
public static void main(String args[]) {
//类名称 对象名称 = new 类名称();
Person12 per1 = new Person12("wangkai");//声明一个新的对象
per1.setAge(23);
per1.info();
}
}
在进行构造方法重载的时候请注意以下定义结构。建议若干个构造方法按照参数的个数采用升序或降序排列。
同时也需要注意一点:在进行类定义的时候,请按照如下顺序完成:
- 第一部分写属性;
- 第二部分写构造方法;
- 第三部分写普通方法;
发现构造方法可以传递属性的内容了,那么很多时候为了使用方便,往往会使用匿名对象完成。
范例:匿名对象
//匿名对象
class Person13{//定义一个类,类名称要求首字母大写
private String name;
private int age;
public Person13(String n,int a) {//构造函数,与类名称同名,并且构造方法没有返回值类型声明
name = n;//setName(n)
setAge(a);
}
public void setName(String n) {
name = n;
}
public void setAge(int a) {
if(a > 0 && a < 150) {
age = a;
}else {
age = 0;
}
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void info() {
System.out.println("name = "+ name + ",age = " + age);
}
}
public class Class13{
public static void main(String args[]) {
//类名称 对象名称 = new 类名称();
new Person13("wangkai",23).info();//匿名对象
}
}
因为匿名对象不会有任何的栈空间所指向,所以使用一次之后就将成为垃圾。
你现在是否使用匿名对象没有绝对定论,你一切都可以使用有名对象。
- 构造方法每个类中至少存在一个;
- 构造方法的名称与类名称相同,无返回值类型定义你;
- 构造方法允许重载,重载时只需要考虑方法的参数类型或个数即可。