java基础知识18_构造函数

本文深入讲解Java中的构造函数,探讨其定义、作用及与普通函数的区别,并通过具体实例展示如何使用构造函数初始化对象。

java是 面向对象的语言: “万物皆对象”: 任何事物都可以使用类进行描述。

需求: 使用java类描述 一个婴儿.
在现实生活中有两种婴儿, 一种婴儿一出生就具备了名字(白户),还有一种婴儿就是 出生之后才有名字 的(黑户)。

构造函数:
构造函数的作用: 给对应的对象进行初始化。
构造函数的定义的格式:

修饰符 函数名(形式参数){
    函数体...
}

构造函数要注意的细节:

  1. 构造函数 是没有返回值类型的。
  2. 构造函数的函数名必须要与类名一致。
  3. 构造函数并不是由我们手动调用的,而是在创建对应的对象时,jvm就会主动调用到对应的构造函数。
  4. 如果一个类没有显式的写上一个构造方法时,那么java编译器会为该类添加一个无参的构造函数的。
  5. 如果一个类已经显式的写上一个构造方法时,那么java编译器则 不会再为该类添加 一个无参 的构造方法。
  6. 构造函数是 可以在一个类中以函数重载 的形式存在多个 的。

疑问:创建对象时,jvm就会调用到对应的构造方法,那么我们以前没有学构造方法,那么以前创建对象时,jvm是否 也会调用构造方法呢?如果有?构造方法从何而来呢?
答案:会调用, java编译器在编译的 时候给加上去的。

jdk提供了一个java开发工具(javap.exe)给我们进行反编译的。(可以在cmd命令行窗口中输入javap运行来查看该工具的使用方法)
例如:javap -c -l -private 类名

疑问: java编译器添加 的无参构造方法的权限修饰符是 什么?
答案:与类的权限修饰是一致的。

构造函数与普通 函数的区别:
1、返回值类型的区别:

  • 构造函数是没有返回值类型的;
  • 普通函数是有返回值类型的,即使函数没有返回值,返回值类型也要写上void

2、函数名的区别:

  • 构造函数的函数名必须要与类名一致;
  • 普通函数的函数名只要符合标识符的命名规则即可。

3、调用方式的区别:

  • 构造函数是 在创建对象的时候由jvm调用的。
  • 普通函数是由我们使用对象调用的,一个对象可以调用多次普通 的函数。

4、作用上的区别:

  • 构造函数 的作用用于初始化一个对象。
  • 普通函数是用于描述一类事物的公共行为的。

举例1:

//婴儿类   
class Baby{
    int id; //身份证 
    String name;  //名字

    //构造函数 有参
    public  Baby(int i , String n){
        id  = i;
        name = n;
        System.out.println("baby的属性初始化完毕!!");
    }

    //构造函数 无参
    public Baby(){
        System.out.println("无参的构造函数被调用了..");
    }

    //哭
    public void cry(){
        System.out.println(name+"哇哇哭...");
    }   
}

class Demo2{
    public static void main(String[] args){ 
        //创建一个baby对象
        Baby b1 = new Baby(110,"狗娃"); //婴儿诞生   白户//调用有参构造函数
        System.out.println("编号:"+ b1.id +" 姓名:"+ b1.name);
        b1.cry();//第一次调用 无参构造函数
        b1.cry();//第二次调用 无参构造函数

        /*
        //黑户
        Baby b2 = new Baby();
        new Baby();

        b2.id = 112;
        b2.name = "狗剩";
        System.out.println("编号:"+ b2.id +" 姓名:"+ b2.name);
        */
    }
}

举例2:
描述一个员工类,员工具备 的属性:id\ name \ age 。
具备的公共行为: 工作。
要求:一旦创建一个员工对象 的时候,那么该员工对象就要对应 的属性值。

class Employee{
    int id;  //编号
    String name;  //名字
    int age; //年龄

    //构造函数
    public Employee(int a, String b , int c){
        id =a;
        name = b;
        age = c;
    }

    public void work(){
        System.out.println(name+"好好工作,努力挣钱!!");
    }
}

class Demo3 
{
    public static void main(String[] args) 
    {
        //创建一个员工对象
        Employee e = new  Employee(110,"狗娃",20);
        System.out.println("编号:"+ e.id+" 名字:"+e.name +" 年龄:"+ e.age);
    }
}
<think>好的,用户让我介绍一下Java基础中的构造函数。首先,我需要确定用户的知识水平。他们可能刚开始学Java,所以要从基础讲起,避免使用复杂术语。 构造函数是类中初始化对象的方法,这点很重要。我应该先解释基本概念,比如构造函数的定义和作用。然后,可能需要分点说明构造函数的特性,比如名称与类名相同、没有返回类型等。 用户可能对默认构造函数不太清楚,需要说明如果没构造函数Java会自动生成一个无参的。同时,带参数的构造函数可以用来初始化对象的状态,这部分要举例子,比如用Person类设置name和age的例子。 重载构造函数也是一个关键点,不同参数的情况如何处理。例如,用this()调用其他构造函数,这样可以避免重复代码。可能用户在实际编码时会遇到需要多个构造函数的情况,所以这个例子比较实用。 另外,需要注意构造函数的语法细节,比如没有void这样的返回类型,避免用户常见的错误。可能还要提一下构造函数的执行顺序,比如父类构造函数先执行,这对继承的理解有帮助。 用户可能还会混淆构造函数和方法,所以需要对比两者,强调构造函数在对象创建时的作用。不过用户的问题主要集中在构造函数本身,所以这部分可以简要带过。 最后,总结构造函数的要点,确保用户有一个清晰的回顾。检查例子是否正确,语法是否符合LaTeX要求,比如用$Person$类这样的行内公式格式。确保回答结构清晰,分点明确,帮助用户逐步理解。</think>我来帮你逐步梳理Java构造函数基础知识: 一、构造函数的核心概念 $$定义:构造函数是类中用于初始化对象的特殊方法$$ $$执行时机:每次用new创建对象时自动调用$$ 二、构造函数4大特性 1. 名称必须与类名完全相同(区分大小) ✔️ 正确示例:$public class Person{ public Person(){...} }$ ❌ 错误示例:$public class Person{ public person(){...} }$ 2. 没有返回类型声明(连void都不能) ✔️ 正确:$public Person(String name){...}$ ❌ 错误:$public void Person(String name){...}$ 3. 可重载(Overload) ```java public class Rectangle { // 无参构造 public Rectangle() { this.width = 1; // 默认宽度 this.height = 1; // 默认高度 } // 带参构造 public Rectangle(double w, double h) { this.width = w; this.height = h; } } ``` 4. 默认存在隐式构造(当不显式定义时) ```java class Demo{} // 自动生成public Demo(){} ``` 三、构造函数执行顺序示例 ```java class Animal { public Animal() { System.out.println("Animal构造器执行"); } } class Dog extends Animal { public Dog() { super(); // 隐含调用父类构造器 System.out.println("Dog构造器执行"); } } // 输出顺序: // Animal构造器执行 // Dog构造器执行 ``` 四、开发实践技巧 1. 链式调用(使用this关键字) ```java public class Student { private String name; private int age; public Student() { this("未知", 18); // 调用双参构造 } public Student(String name, int age) { this.name = name; this.age = age; } } ``` 2. 私有化构造器(单例模式) ```java public class Singleton { private static Singleton instance; private Singleton() {} // 阻止外部实例化 public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } } ``` 五、常见误区 1. 构造函数不能直接调用(只能通过new触发) 2. 构造函数不能被继承(子类必须通过super调用父类构造) 3. 构造函数不能被static修饰(与类初始化器区分) 六、与普通方法对比 | 特性 | 构造函数 | 普通方法 | |-----------|--------------|--------------| | 方法名 | 必须与类名相同 | 自由命名 | | 返回值 | 无 | 必须声明返回类型 | | 调用方式 | 通过new自动调用 | 通过对象显式调用 | | 继承性 | 不能被子类继承 | 可以被子类重或继承 | | 代码复用 | 通过this()复用 | 通过方法调用复用 | 建议练习:尝试创建一个包含三种构造方式的BankAccount类,包含默认账户、指定账户号、指定账户号和初始金额的构造方式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值