首页 > 其他分享 >Day31--构造器详解

Day31--构造器详解

时间:2024-11-07 18:09:55浏览次数:3  
标签:name -- age 构造 Day31 Person 详解 public String

Day31--构造器详解

使用 new 关键字创建对象。使用 new 关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。

类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:

  1. 必须和类的名字相同;
    \2. 必须没有返回类型,也不能写 void。

构造器必须要掌握!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

构造器的快捷键:alt+insert ------>构造函数

​ 如果想要定义无参构造器,就是alt+insert ------>构造函数------->无选择

举例理解:

我在下面的代码里面,创建了Person方法,方法和类名相同,没有参数

package com.liu.oop.demo02;

public class Person {

    //一个类即使什么都不写,也会存在一个方法
    //显示的定义构造器
    //无参构造; 没有参数的构造
    public Person(){}
}

在同一个包的Application类里面,就可以调用这个方法了

package com.liu.oop.demo02;

//一个项目只应该有一个main方法,我们在这里把他放在Application里
public class Application {
    public static void main(String[] args) {
        //new实例化了一个对象
        Person person = new Person();
    }
}

上面讲的是无参构造器

下面是有参构造器:

//有参构造
    public Person(String name){
            this.name=name;
    }

this.name=name;

在右边的name,是传入的name,

左边的name,指的是属性name

一旦定义了有参构造,无参构造就必须要显示定义,否则就会报错

可以这样看:

当无参构造删除掉之后,Application就立刻报错了

package com.liu.oop.demo02;

public class Person {

        String name;
    //一个类即使什么都不写,也会存在一个方法
    //显示的定义构造器
    //无参构造; 没有参数的构造


    //无参构造
    //实例化初始值
    //使用new关键字,本质是在调用构造器
//    public Person() {
//        this.name = "哈哈";
//    }

    //有参构造
    //一旦定义了有参构造,无参构造就必须要显示定义,否则就会报错
    public Person(String name){
            this.name=name;
    }
}

package com.liu.oop.demo02;

//一个项目只应该有一个main方法,我们在这里把他放在Application里
public class Application {
    public static void main(String[] args) {
        //new实例化了一个对象
        Person person = new Person();

        System.out.println(person.name);//哈哈

    }
}

错误原因:java: 无法将类 com.liu.oop.demo02.Person中的构造器 Person应用到给定类型;
需要: java.lang.String
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同

解决方法:

当我们定义了一个实参构造器之后,就再定义一个空的无参构造器,就像这样

public Person() {
    }

构造器

//1.使用new关键字,本质是在调用构造器
//2.初始化值

好奇怪啊, public Person(){}

类的首字母可以大写了吗?在java里面,方法的名称可以与类的名称一样吗?

深入理解:

  1. 代码分析

    • 在你的代码中,你并没有创建一个名为Person的方法,而是创建了一个名为Person的类,并且这个类中有一个无参构造器。在Java中,构造器是一种特殊的方法,用于创建和初始化对象。它的名字必须与类名相同,并且没有返回类型(甚至不能写void)。你的public Person(){}就是这样一个构造器,它用于创建Person类的对象,当你使用new Person()来实例化一个Person对象时,就会调用这个无参构造器。这就是为什么在IDEA中没有显示错误的原因。
  2. 方法名称与类名是否可以相同

    • (1)构造器:构造器的名称必须与类名相同。构造器用于初始化类的新对象,这是Java语法的规定。例如,对于类Student,其构造器可以是public Student()或者public Student(int age, String name)等形式,名字必须是Student

    • (2)普通方法:普通方法的名称可以与类名相同,但这可能会引起混淆。不过在一些特定的设计模式或者代码结构中,这种命名方式是被允许的。例如,在一些工厂方法模式的实现中,可能会有一个与类名相同的静态工厂方法,用于创建该类的对象。例如:

      • class MyClass {
            public static MyClass MyClass() {
                return new MyClass();
            }
        }
        
        • 这里定义了一个名为MyClass的静态方法,它返回一个MyClass类型的对象。这种用法虽然不太常见,但在某些情况下是合理的。
  3. 方法名称首字母是否可以大写

    • 方法名称首字母可以大写。在Java中,方法名遵循标识符命名规则,即可以包含字母、数字、下划线(_)和美元符号($),并且不能以数字开头。虽然通常建议方法名采用小写字母开头的驼峰命名法(如calculateSum),但大写字母开头的方法名也是合法的。例如,public void CalculateTax()这样的方法定义是合法的,不过这种命名方式不符合Java的常见命名习惯,可能会让其他开发者在阅读代码时产生误解。

在构造器里面进行赋值:

package com.liu.oop.demo02;

public class Person {

        String name;
    //一个类即使什么都不写,也会存在一个方法
    //显示的定义构造器
    //无参构造; 没有参数的构造

    //构造器的作用:实例化初始值
    public Person(){
        this.name="哈哈";
    }
}

package com.liu.oop.demo02;

//一个项目只应该有一个main方法,我们在这里把他放在Application里
public class Application {
    public static void main(String[] args) {
        //new实例化了一个对象
        Person person = new Person();

        System.out.println(person.name);//哈哈

    }
}

一个小拓展:

在Person类里面创建了name属性

package com.liu.oop.demo02;

public class Person {

        String name;
    //一个类即使什么都不写,也会存在一个方法
    //显示的定义构造器
    //无参构造; 没有参数的构造
    public Person(){}
}

在Application类里输出name属性:

快捷键:people.name.sout System.out.println(person.name);

package com.liu.oop.demo02;

//一个项目只应该有一个main方法,我们在这里把他放在Application里
public class Application {
    public static void main(String[] args) {
        //new实例化了一个对象
        Person person = new Person();
        
        System.out.println(person.name);
    }
}

总结:

构造器:

  1. 和类名相同。

  2. 没有返回值。

作用:

  1. new 本质在调用构造方法。
  2. 初始化对象的值。

注意点:

  1. 定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造。
    Alt + Insert。

再详细学一下

  1. 构造器的基本概念

    • 构造器(Constructor)是一种特殊的方法,用于创建和初始化对象。它的主要作用是在创建对象时,为对象的成员变量赋初始值,确保对象在使用前处于一个合理的初始状态。构造器的名称必须与类名相同,并且没有返回类型(不能写void)。
  2. 无参构造器示例

    • 以下是一个简单的Person类,包含一个无参构造器:

      • class Person {
            private String name;
            private int age;
            //无参构造器
            public Person() {
                name = "未命名";
                age = 0;
            }
        }
        
      • 在这个例子中,Person类有两个私有成员变量nameage。无参构造器public Person()在创建Person对象时被调用,它将name初始化为“未命名”,age初始化为0。例如,你可以这样创建Person对象:

        • public class Main {
              public static void main(String[] args) {
                  Person person = new Person();
                  System.out.println("姓名:" + person.name + ",年龄:" + person.age);
              }
          }
          
        • 输出结果为:“姓名:未命名,年龄:0”。

  3. 有参构造器示例

    • (1)基本使用

      • 可以为Person类添加有参构造器,用于根据传入的参数初始化对象。例如:

        • class Person {
              private String name;
              private int age;
              //有参构造器
              public Person(String name, int age) {
                  this.name = name;
                  this.age = age;
              }
          }
          
      • 这里的有参构造器public Person(String name, int age)接受两个参数,一个是String类型的name,另一个是int类型的age。在构造器内部,使用this关键字来区分成员变量和参数。this.name表示对象的成员变量namename(没有this)表示传入的参数。现在可以使用有参构造器创建Person对象:

        • public class Main {
              public static void main(String[] args) {
                  Person person = new Person("张三", 20);
                  System.out.println("姓名:" + person.name + ",年龄:" + person.age);
              }
          }
          
        • 输出结果为:“姓名:张三,年龄:20”。

    • (2)构造器的重载

      • 在一个类中可以有多个构造器,只要它们的参数列表不同(参数个数、参数类型或者参数顺序不同),这就是构造器的重载。例如,为Person类添加另一个有参构造器:

        • class Person {
              private String name;
              private int age;
              //有参构造器1
              public Person(String name, int age) {
                  this.name = name;
                  this.age = age;
              }
              //有参构造器2
              public Person(String name) {
                  this.name = name;
                  this.age = 18;
              }
          }
          
      • 第二个有参构造器public Person(String name)只接受一个String类型的参数name,并将age默认设置为18。这样就可以根据不同的需求选择不同的构造器来创建对象:

        • public class Main {
              public static void main(String[] args) {
                  Person person1 = new Person("李四", 22);
                  System.out.println("姓名:" + person1.name + ",年龄:" + person1.age);
                  Person person2 = new Person("王五");
                  System.out.println("姓名:" + person2.name + ",年龄:" + person2.age);
              }
          }
          
        • 输出结果为:“姓名:李四,年龄:22”和“姓名:王五,年龄:18”。

  4. 默认构造器

    • 如果一个类没有显式地定义构造器,Java编译器会自动为这个类生成一个默认构造器。这个默认构造器是无参的,并且它会将对象的成员变量初始化为默认值(例如,对于基本数据类型,int类型初始化为0,boolean类型初始化为false等;对于引用数据类型,初始化为null)。例如:

      • class Book {
            private String title;
            private int pageCount;
        }
        
      • 虽然这里没有定义构造器,但Java编译器会自动生成一个默认构造器。可以像这样使用:

        • public class Main {
              public static void main(String[] args) {
                  Book book = new Book();
                  System.out.println("书名:" + book.title + ",页数:" + book.pageCount);
              }
          }
          
          • 输出结果为:“书名:null,页数:0”。不过,一旦你在类中显式地定义了任何一个构造器,Java编译器就不会再为你自动生成默认构造器。

标签:name,--,age,构造,Day31,Person,详解,public,String
From: https://www.cnblogs.com/xiaokunzhong/p/18533727

相关文章

  • 高性能的Reactor和Proactor模式学习
    0、引言在上一篇的笔记中,我们学习了操作系统提供的高效I/O管理技术,主要用于解决服务器在高并发场景下的资源浪费和瓶颈问题。但是在实际的代码编写中,要是我们都全部调用底层的I/O多路复用接口来编写网络程序这种面向过程的方式,必然会导致开发的效率不高。于是在这一章节,我们来学......
  • 斯特林
    讲递推和初步性质。退役前可能学不到多项式。第一类斯特林数:$s(n,m)$把\(n\)个元素分成\(m\)组圆排列的方案,圆排列是\((n-1)!\)。从dp意义上推递推公式,设\(s(i,j)=dp_{i,j}\)为\(i\)个元素分\(j\)组圆排列的方案。则第\(i\)个元素可以独立成组或者加入到先前组......
  • 后缀数组
    学了这个东西字符串水平下降一万倍,之前敢拿hash草的题现在不敢了。后缀数组板题后缀数组可以把字符串的所有后缀存起来,然后干各种奇怪的事情。现在给你一个字符串banana,给他的后缀A,NA,ANA,NANA,ANANA,BANANA跑一个后缀的trie。然后把字典序小的字母排在左边,给每个后缀对......
  • 上周,一个国产 API 开源项目在 ProductHunt 杀疯了...
    随着AI大模型技术的兴起,全球产品更新和面市进程速度肉眼可见的加快,ProductHunt作为全球知名的产品发现平台,每日都会精选出一系列产品能力强劲的新产品,这些产品不仅代表了技术前沿,还反映了市场的发展趋势。上周ProductHunt(10.28-11.3)上的最佳产品榜单,出现了一次令人振奋的现......
  • Day31--命名
    Day31--命名要注意的是:方法名称首字母是否可以大写方法名称首字母可以大写。在Java中,方法名遵循标识符命名规则,即可以包含字母、数字、下划线(_)和美元符号($),并且不能以数字开头。虽然通常建议方法名采用小写字母开头的驼峰命名法(如calculateSum),但大写字母开头的方法名也是合法的......
  • Day31--生成空白行
    Day31--生成空白行在当前行上方插入空白行在IDEA中,在当前行上方插入空白行的快捷键是“Ctrl+Alt+Enter”例如,当你正在编辑一个Java类,光标位于某一行代码上,按下这个快捷键,就会在当前行的上方插入一个空白行,方便你添加新的代码。在当前行下方插入空白行快捷键是“Sh......
  • 20222327 2024-2025-1 《网络与系统攻防技术》实验四实验报告
    一、实验内容1.恶意代码文件类型标识、脱壳与字符串提取2.使用IDAPro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。3.分析一个自制恶意代码样本rada,并撰写报告,回答问题4.取证分析实践二、实验过程1.对恶意代码样本,进行文件类型识别,脱壳与字......
  • 网站robots文件怎么优化?robots.txt文件的作用及生成
    Robots.txt文件是网站根目录下的一个纯文本文件,用于指导搜索引擎蜘蛛如何抓取和访问网站内容,通过设置不同的规则,可以有效地控制哪些页面可以被抓取,哪些不可以被抓取,从而优化网站SEO效果和保护敏感信息。什么是robots.txt?定义:robots.txt是一个存放在网站根目录下的纯文本文件,用来......
  • Fileheader 2.0.2 | times.h
    Downloadtimes.h提供了查询系统时间的通用方法class::times你可以通过声明一个class::times变量来调用查询系统时间timesa;cout<<a.year();//2024times返回的任何数据都是std::string类型的,你可以利用hdk::tool::to_number(std::string)[tool.h]来将其转为数......
  • JOISC 2022 飞机旅行
    一个基础做法Alice给点标号,Bob可以传一个\(2^{20}\)的信息给Alice,意味着Alice只能知道点的部分信息,然后根据部分信息得把剩余需要的信息传给Bob。考虑树分块,子树大小\(\ge7\)的时候就划为一块,由于是二叉树(一开始以某个\(\le2\)度点为根),那每个子树的大小在\([7,13......