返回顶部
首页 > 资讯 > 后端开发 > Python >Java 超详细讲解对象的构造及初始化
  • 612
分享到

Java 超详细讲解对象的构造及初始化

2024-04-02 19:04:59 612人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录如何初始化对象构造方法特性默认初始化就地初始化如何初始化对象 我们知道再Java方法内部定义一个局部变量的时候,必须要初始化,否则就会编译失败 要让这串代码通过编译,很简单,只

如何初始化对象

我们知道再Java方法内部定义一个局部变量的时候,必须要初始化,否则就会编译失败

image.png

要让这串代码通过编译,很简单,只需要在正式使用a之前,给a设置一个初始值就好
那么对于创造好的对象来说,我们也要进行相对应的初始化
我们先写一个Mydate的类

public class MyDate {

    public int year;
    public int month;
    public int day;

    
    public void setDate(int year,int month,int day) {
        this.year = year;
        this.month = month ;
        this.day = day;
    }

    public void printDate() {
        System.out.println("年:"+this.year+"月:"+this.month+"日:"+this.day);
    }
   public static void main(String[] args) {

        // this.printDate();

        MyDate myDate = new MyDate();

        myDate.setDate(2022,3,25);

        myDate.printDate();

        MyDate myDate2 = new MyDate();

        myDate2.setDate(2022,3,28);
        myDate2.printDate();

    }
}

我们可以看到,在Mydate类中,要在调用之前实现写好setDate才能将具体的日期设置到对象当中

image.png

我们通过这个例子就可以发现两个问题:

  • 每次对象创建好之后调用setDate方法设置具体时期,比较麻烦,那么对象该如何初始化呢?
  • 局部变量必须要初始化之后才能使用,那么为什么字段声明之后没有给初值,它依旧可以使用呢?

答案:

  • 我们可以运用构造函数来进行初始化
  • 因为这里和main函数中定义的局部变量不同,编译器会自动为你的字段声明的局部变量赋初始零值。

构造方法

当我们实例化一个对象的时候:必须会有这两步,但并不是一定只有这两步

  • 为对象分配内存
  • 调用合适的构造方法

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象的时候,由编译器自动调用,并且在整个对象的生命周期内只调用一次

class Person {
    public String name;
    public int age;

    //构造方法:
    //名字与类名相同,且没有返回值类型,void也不行
    //一般情况下使用public修饰
    //在创建对象的时候由编译器自动调用,并且在对象的声明周期内只调用一次
    public Person(String name,int age){
        this.name = name;
        this.age = age;
        System.out.println("构造方法被调用了")
    }
    public void eat() {
        System.out.println("吃饭!");
    }

    public void sleep() {
        System.out.println("睡觉!");
    }
    public static void main(String[] args){
        //在此处创建了一个Date类型的对象,并没有显式调用构造函数
        Person p = new Person("xiaohong",18);
        p.eat();
    } 
}

⚠️:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间

image.png

特性

  • 名字必须和类名相同
  • 没有返回值类型,void也不行
  • 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生)
  • 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
class Student {
    //属性:成员变量-》类的内部  方法的外部的
    public String name;
    public int age;
    public double score ;
    public String sex;


    public Student() {
        //调用本类中   带有2个参数的构造方法,第一个参数的类型是String,第2个参数的类型是int
        this.age = 18;
        System.out.println("这个是不带参数的构造方法!");
    }

    public Student(String name,int age) {
        //this();
        this.age = age;
        this.name = name;
        System.out.println("这个是带2个参数的构造方法!");
    }

    public Student(String name, int age, double score, String sex) {
        this.name = name;
        this.age = age;
        this.score = score;
        this.sex = sex;
        System.out.println("带4个参数的构造方法!");
    }

    public void doClass() {
        System.out.println(name+"正在上课!");
        //this.doHomeWork();
    }
    public void doHomeWork(){
        System.out.println(name+"正在写作业");
    }

    public void show() {
        System.out.println("姓名:"+name+" 年龄:"+age+" 学分:"+score+" 性别:"+sex);
    }
}
//重载的时候

上述方法中:名字相同,参数列表不同,因此构成了方法重载
如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。

class MyGirlFired {
    public String name;
    public int age;
    public String eyes;

    public void eat() {
        System.out.println("吃火锅!");
    }
}

在上面的代码中,没有定义任何构造方法,编译器就会默认为我们生成一个不带参数的构造方法
⚠️:一旦用户定义了,编译器则不再生成任何构造函数

image.png

class MyGirlFired {
    public String name;
    public int age;
    public String eyes;

    public MyGirlFired(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println("吃火锅!");
    }

    public static void main(String[] args) {
        //如果编译器会生成,则生成的构造方法一定是无参数的
        //则此处创建对象是可以通过编译的
        //但实际上会报错
        MyGirlFired xHong = new MyGirlFired();
    }
}

image.png

在构造方法中,可以通过this调用其他构造方法来简化代码

class Student {
    //属性:成员变量-》类的内部  方法的外部的
    public String name;
    public int age;
    public double score ;
    public String sex;


    public Student() {
        //调用本类中   带有2个参数的构造方法,第一个参数的类型是String,第2个参数的类型是int
        this("yumi",18);
        //this("bit3",99,98.9,"女");
        System.out.println("这个是不带参数的构造方法!");
    }

    public Student(String name,int age) {
        //this();
        this.age = age;
        this.name = name;
        System.out.println("这个是带2个参数的构造方法!");
    }

    public Student(String name, int age, double score, String sex) {
        this.name = name;
        this.age = age;
        this.score = score;
        this.sex = sex;
        System.out.println("带4个参数的构造方法!");
    }

    public void doClass() {
        System.out.println(name+"正在上课!");
        //this.doHomeWork();
    }
    public void doHomeWork(){
        System.out.println(name+"正在写作业");
    }

    public void show() {
        System.out.println("姓名:"+name+" 年龄:"+age+" 学分:"+score+" 性别:"+sex);
    }
}

⚠️注意:

  • this()必须是构造方法中的第一条语句,且只能放在构造函数中
  • 不能形成“环”

例如

image.png

绝大多数情况我们都用public来修饰,特殊场景下会被private修饰

默认初始化

上面我们提到了一个问题:为什么局部变量在使用时必须要用初始化,而成员变量可以不用呢?

public class Date {
    public int year;
    public int month;
    public int day;
    
    public Date(int year,int month,int day){
        //成员变量在定义之前,并没有给出初始值,那为什么就可以使用呢?
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }

    public static void main(String[] args) {
        //此处a并没有初始化,编译器报错;
        //Error:(24,28)Java:可能尚未初始化变量a
        //int a;
        //System.out.println(a);
        Date d = new Date(2022,3,29);
    }
}

image.png

要搞清楚这个过程,我们需要知道new关键字背后所发生的一些事情

Date d = new Date(2021,6,9);

在程序层面只是简单的一条语句,而在JVM层面则需要做好多事情

  • 检测对象对应的类是否加载了,如果没有加载则加载
  • 为对象分配内存空间
  • 处理并发安全问题

?比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

  • 初始化所分配的空间

即:对象空间被申请好了之后,对象中包含的成员已经设置好了初始值

image.png

数据类型默认值
byte0
char‘\u0000’
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull
  • 设置对象头信息(关于对象内存模型后面再说)
  • 调用构造方法,是给对象中的各个成员赋值

就地初始化

在声明成员变量时,就直接给出了初始值

public class Date {
    public int year;
    public int month;
    public int day;

    public Date(){
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }
    public Date(int year,int month,int day){
        //成员变量在定义之前,并没有给出初始值,那为什么就可以使用呢?
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }

    public static void main(String[] args) {
        //此处a并没有初始化,编译器报错;
        //Error:(24,28)Java:可能尚未初始化变量a
        //int a;
        //System.out.println(a);
        Date d1 = new Date(2022,3,29);
        Date d2 = new Date();
    }
}

//运行结果:
//0
//0
//0
//0
//0
//0

⚠️注意:代码编译完成之后,编译器会将所有成员初始化的这些语句添加到各个构造函数中

image.png

image.png

5.一个类至少会有1个构造函数,就算你没有写!
6.构造方法 本质 就是来实例化对象的时候调用
(1)分配内存
(2)调用合适的构造方法
7.this可以用来调用本类中的其他构造方法【构造方法当中使用】
且必须放在第一行!所以,只能在当前构造方法当中,调用一次
8.this的用法:

  • this.data 访问属性
  • this.func(); 访问方法
  • this(); //用来调用本类中的其他构造方法

9.this不能形成环。

有错误请大家批评指正
感谢阅读

到此这篇关于Java 超详细讲解对象的构造及初始化的文章就介绍到这了,更多相关Java 对象的构造内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 超详细讲解对象的构造及初始化

本文链接: https://lsjlt.com/news/144552.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 超详细讲解对象的构造及初始化
    目录如何初始化对象构造方法特性默认初始化就地初始化如何初始化对象 我们知道再Java方法内部定义一个局部变量的时候,必须要初始化,否则就会编译失败 要让这串代码通过编译,很简单,只...
    99+
    2024-04-02
  • C++详细讲解对象的构造
    目录一、对象的构造(上)1.1 对象的初始值1.2 对象的初始化1.3 小结二、对象的构造(中)2.1 构造函数2.2小实例2.3 小结三、对象的构造(下)3.1 特殊的构造函数3....
    99+
    2024-04-02
  • C++详细讲解对象的构造顺序
    目录一、局部对象的构造顺序二、堆对象的构造顺序三、全局对象的构造顺序命令行四、小结一、局部对象的构造顺序 对于局部对象 当程序执行流到达对象的定义语句时进行构造 下面看一个局部对象的...
    99+
    2024-04-02
  • 怎么使用java构造方法初始化对象
    在Java中,可以使用构造方法来初始化对象。构造方法是一种特殊的方法,用于创建和初始化对象。构造方法的名称必须与类名相同,没有返回类...
    99+
    2023-09-01
    java
  • C++超详细讲解构造函数
    目录类的6个默认成员函数构造函数特性编译器生成的默认构造函数成员变量的命名风格类的6个默认成员函数 如果我们写了一个类,这个类我们只写了成员变量没有定义成员函数,那么这个类中就没有函...
    99+
    2024-04-02
  • C++超详细讲解函数对象
    目录一、客户需求二、存在的问题三、解决方案四、函数对象五、小结一、客户需求 编写一个函数 函数可以获得斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用 下面来看第一个...
    99+
    2024-04-02
  • C++超详细讲解拷贝构造函数
    目录构造函数特征编译器生成的拷贝构造拷贝构造的初始化列表显式定义拷贝构造的误区结论构造函数 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对...
    99+
    2024-04-02
  • Java 超详细讲解类的定义方式和对象的实例化
    目录1.面对对象的初步认识1.1什么是面向对象1.2面向对象与面向过程2.类的定义与使用2.1简单认识类2.2 类的定义格式3.类的实例化3.1什么是实例化?3.2重点笔记总结1.面...
    99+
    2024-04-02
  • C++构造函数的初始化列表详解
    目录1.问题2.解决方法(初始化列表)3.顺序问题总结 1.问题 class A { private: int m_a; public: A(int a) { cout ...
    99+
    2024-04-02
  • 实例解析Java中的构造器初始化
    初始化顺序  当Java创建一个对象时,系统先为该对象的所有实例属性分配内存(前提是该类已经被加载过了),接着程序开始对这些实例属性执行初始化,其初始化顺序是:先执行初始化块或声明属性时制定的初始值,再执行构造器里制定的初始值。 在类的内部...
    99+
    2023-05-31
    java 构造器 初始化
  • 讲解Java中如何构造内部类对象以及访问对象
    通过反射构造内部类对象 首先在 javalang 包下写一个包含内部类的类: package javalang; public class Outer { public s...
    99+
    2022-05-28
    Java
  • java中的对象怎么初始化
    第一步:加载该类,一个java对象在初始化前会进行类加载,在JVM中生成Class对象。加载一个类会进行如下操作,下面给出递归描述。如果该类有父类,则先加载其父类。    i 初始化该类静态成员ii 执行该类静态代码块第二步:创建对象,如果...
    99+
    2015-01-14
    java 对象 初始化
  • C++超详细讲解构造函数与析构函数的用法及实现
    目录写在前面构造函数和析构函数语法作用代码实现两大分类方式三种调用方式括号法显示法隐式转换法正确调用拷贝构造函数正常调用值传递的方式给函数参数传值值传递方式返回局部对象构造函数的调用...
    99+
    2024-04-02
  • Golang创建构造函数的方法超详细讲解
    目录组合字面量自定义构造函数从构造函数返回错误interface构造函数最佳实践基本构造函数主包类型多个构造函数组合字面量 组合字面量是最直接方式初始化Go对象,假设定义了Book类...
    99+
    2023-01-28
    Go创建构造函数 Go构造函数
  • C++构造函数初始化列表的实现详解
    目录1.前言2.初始化列表3.注意事项1.前言 初始化就是给变量一个初始值。 初始化的目的是为了让变量有值,防止使用时出现异常。 在构造函数中,有一项重要功能就是对成员变量进行初始化...
    99+
    2024-04-02
  • Java超详细讲解数据结构的应用
    目录一.bfs二.双端队列三.算法题1.kotori和迷宫2.小红找红点3.小红玩数组 一.bfs bfs(广度优先搜索),类似二叉树的层序遍历,利用队列完成。一般用于求最短路。 图...
    99+
    2024-04-02
  • SpringIOC推导与DI构造器注入超详细讲解
    目录了解准备IOC思想IOC本质XML配置SpringIOC创建对象方式了解准备 什么是Spring? Spring是一款轻量级的控制反转(IOC)和面向切面编程(AOP)的非入侵式...
    99+
    2023-02-20
    Spring IOC推导 Spring DI构造器注入 Spring IOC推导与DI构造器注入
  • java数组的初始化及操作详解
    Java数组的初始化及操作详解:数组的初始化是指在创建数组对象时为数组元素赋予初值。Java数组的初始化有以下几种方式:1. 静态初...
    99+
    2023-08-17
    Java
  • 详细图解Java中字符串的初始化
    目录前言常量池反编译代码验证字符串初始化操作总结前言 在深入学习字符串类之前,我们先搞懂JVM是怎样处理新生字符串的。当你知道字符串的初始化细节后,再去写String s = "h...
    99+
    2024-04-02
  • Java中的对象是如何初始化的
    对象初始化的过程:一:初始化类首先创建某个对象时:Dog dog = new Dog();首次访问某个类的静态方法或者静态字段时:Dog.staticFields;Java 解释器就会去找类的路径,定位已经编译好的 Dog.class 文件...
    99+
    2020-06-07
    Java 对象 初始化
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作