Java中的构造函数

构造函数

 1.需求:一些事物对应的对象在被创建时就已经有了值,在类中如何完成

则通过构造函数来完成(构造函数是在类中的),对象就是构造出来的,在构造的同时需要完成的动作就定义在函数中————构造函数(不同于一般函数的另一种函数)

2.作用:对对象创建进并且进行初始化

3.在代码中的体现:1.没有返回值类型,对象创建完成就结束。也不用写void 要与一般函数

                                            区别

                                     2.构造函数的函数名要与类的名字一致——是为了初始化类的对象的

                                            值的函数

                                     3.也没有返回值

class person2{
    //属性  名字  年龄
    private String name;
    private int age;

    //构造函数/构造器
    person2(String n){
        name = n;
    }

    //方法
    void Speack(){
        System.out.println("My name is "+name+" and "+age+" years old");
    }
}
public class ConstructedFunction {
    public static void main(String[] args){
        person2 p =new person2("XiaoM");//构造器是一种特殊的方法,用构造器来创建并初始化对象,在构造器前加上new
        p.Speack();
    }
}
类中的构造函数为:
 person2(String n){
        name = n;
    }

测试类中的构建对象的代码为:

person2 p =new person2();

总结:书中讲:要使用对象就要先构造对象,而构造对象就要使用构造器,构造器是一种特殊的方法,构造器的名字必须跟类名一致(这与构造函数的定义说明相符合)


说明:之前所谓的创建对象其实就是在构造对象也调用了构造器,只使在类中没有,(其实之前在类中有一个person 的空参构造器,为编译器在编译的时候默认的)

(其实编译器在编译的时候为我们默认加上去了很多东西,比如main()函数中的return;及其他函数中的return;)

当有构造函数时,就是用你写的构造器,当没有时就是编译器默认的构造器

在这个语句执行时:

 person2 p =new person2("XiaoM");

执行顺序:1.new 开辟空间,初始化为默认值

         2.然后调用person();这个构造函数传参

         3.在函数内:a 的值赋给name(找name 的原则:现在函数中找person()内;然后那个对象调用了他就到那个对象中找)

         4.函数执行完,弹栈,

         5.创建类类型的变量,将对象的首地址赋值给变量

对象的构建完成

{

在没有构建函数的类中,默认无参数的构建函数对对象的值毫无影响

}

构造函数的的细节
1.是否需要构造函数,或者需要怎样的构造函数根据具体的要求

2.你的构造函数不同对应的在对象构造时就有不同的构造方式(参数列表不同)

3.构造函数中也有return 用于结束函数

4.当类的构造函数被私有化(private 修饰)除了类里面面的其他地方将无法构造这个类的对象

函数:1.主函数   2.一般函数  3.构造函数

构造函数与一般函数的区别

1.在写法上的不一样,构造函数没有返回值,不写void 函数名与类名一致,

2.定义位置不同:构造函数只能定义在类里

3.运行不同:对象一构造就会调用相应的构造函数

一般方法是对象构造后有需要才调用的

4.有构造函数(用于初始化)依然需要setxxx函数(用于修改)

构造函数之间的调用(与私有化有关)

//构造函数的相互调用(与私有化有关)
//注意构造函数在仅在对象初始化的时候运行
class person3{
     //属性
    private String name;
    private int age;
    private person3(int a){//用private 把构造函数封装,使外界程序不能调用它,但类中可以调用
        age=a;
    }
    private person3(String n){
        name=n;
    }
    person3(String n,int a){//没有私有化的构造函数,外界程序可以调用
        this(n);//构造函数对构造函数的调用
        /*
        this :表示当前这个对象(this :new person3())
        this(n):new person3(n);向当前对象中传一个字符串型变量
         */
        age=a;
    }
    //行为--一般函数(方法)
    void Speack(){
      System.out.println("My name is "+name+" and "+age+" years old");
    }
}
public class ConstructFModulation {
    public static void main(String[] args){
        person3 p=new person3("Lizhuzhu",20);
        p.Speack();

    }
}
小细节:

在构造函数里默认有一个This();----表示当前对象(This 与类类型变量差不多,是引用型,值为对象的首地址)

(与之前讲的name = n 先在函数中着是否有name 这个变量 ,没有则在相应的对象中找,在相应对象中找的依据(寻址)就是This();)

总结:构造函数只有一个的时候,变量赋值在当前对象中这和This();相关,当由多个构造函数,需要构造函数之间的调用时无法知道赋值给哪一个对象,所以要写上This(实参)

调用构造函数要用到关键字This(实参);This();表示的就是当前这个对象



this();----------调用细节:

1.this();——调用必须是在调用的第一行

2.一个构造函数里只能有一个this();(保证在第一行)

3.在类中方法中都有一个保存当前对象this,一般可以省略(在程序中默认有(在变量名没有一样的时候)),但当方法中的局部变量和成员变量名字一致时,不能省略this(赋值找变量的方法依据之前讲的,先在方法中找,是否有变量,然后再去相应的对象中找)

 person3 p=new person3("Lizhuzhu",20);
 void Speack(){
      System.out.println("My name is "+name+" and "+age+" years old");
    }
//输出名字Lizhuzhu(有默认的this(),)年龄20
 void Speack(){
        String name ="MingMing";
      System.out.println("My name is "+name+" and "+age+" years old");
    }

//输出:名字MingMing    年龄   20;

 void Speack(){
        String name ="MingMing";
      System.out.println("My name is "+this.name+" and "+this.age+" years old");

//输出:名字Lizhuzhu   年龄  20







### Java 构造函数的概念及用法 #### 什么是构造函数? 在 Java 中,构造函数是一种特殊的方法,用于初始化对象的状态。它具有与类相同的名称,并且没有返回类型(即使是 `void`)。每当通过 `new` 关键字创建一个新对象时,相应的构造函数会被调用。 #### 如何定义构造函数构造函数可以通过两种方式定义:无参构造函数和有参构造函数。 - **无参构造函数**:不需要任何参数,通常用来初始化一些默认值。 - **有参构造函数**:接受参数并利用这些参数来初始化对象的属性。 以下是具体的说明以及代码示例: --- #### 示例 1: 无参构造函数 当未显式声明任何构造函数时,Java 编译器会自动生成一个默认的无参构造函数[^4]。然而,一旦手动编写了其他类型的构造函数,默认的无参构造函数将不再存在。 ```java class Person { String name; // 无参构造函数 public Person() { this.name = "Unknown"; } } public class Main { public static void main(String[] args) { Person person = new Person(); // 调用了无参构造函数 System.out.println(person.name); // 输出 Unknown } } ``` --- #### 示例 2: 有参构造函数 有参构造函数允许传入特定的初始值,从而更灵活地控制对象的初始化过程。 ```java class Person { String name; // 有参构造函数 public Person(String name) { this.name = name; // 初始化成员变量 } } public class Main { public static void main(String[] args) { Person person = new Person("Alice"); // 调用了有参构造函数 System.out.println(person.name); // 输出 Alice } } ``` --- #### 示例 3: 构造函数重载 同一个类中可以拥有多个构造函数,只要它们的参数列表不同即可。这种现象称为构造函数重载。 ```java class Rectangle { int width, height; // 无参构造函数 public Rectangle() { this.width = 0; this.height = 0; } // 有参构造函数 public Rectangle(int w, int h) { this.width = w; this.height = h; } } public class Main { public static void main(String[] args) { Rectangle rect1 = new Rectangle(); // 调用了无参构造函数 Rectangle rect2 = new Rectangle(5, 10); // 调用了有参构造函数 System.out.println(rect1.width + ", " + rect1.height); // 输出 0, 0 System.out.println(rect2.width + ", " + rect2.height); // 输出 5, 10 } } ``` --- #### 示例 4: 使用 `this` 关键字调用另一个构造函数 为了减少重复代码,在一个构造函数内部可以使用 `this()` 来调用同一类中的其他构造函数[^1]。需要注意的是,`this()` 必须位于构造函数的第一行。 ```java class Employee { String name; double salary; // 主要构造函数 public Employee(String name, double salary) { this.name = name; this.salary = salary; } // 辅助构造函数,调用主要构造函数 public Employee(double salary) { this("Default Name", salary); } } public class Main { public static void main(String[] args) { Employee emp1 = new Employee("John Doe", 50000); // 调用了两个参数的构造函数 Employee emp2 = new Employee(60000); // 调用了单个参数的构造函数 System.out.println(emp1.name + ": $" + emp1.salary); // 输出 John Doe: $50000.0 System.out.println(emp2.name + ": $" + emp2.salary); // 输出 Default Name: $60000.0 } } ``` --- #### 特殊情况:继承中的构造函数 如果子类没有显式调用父类的构造函数,则编译器会尝试隐式调用父类的无参构造函数。如果没有合适的无参构造函数可用,则会出现编译错误[^3]。 ```java // 父类 class Animal { public Animal(String type) { // 带参数的构造函数 System.out.println("Animal Type: " + type); } } // 子类 class Dog extends Animal { public Dog() { super("Mammal"); // 显式调用父类构造函数 } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); } } ``` 上述代码中,由于父类 `Animal` 的唯一构造函数带有参数,因此子类 `Dog` 需要显式调用 `super("Mammal")` 否则无法正常运行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值