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