类 和 对象(二)

news2024/9/17 3:11:58

构造方法

接上篇,若每次都想下面的setDate方法给对象初始化,未免比较麻烦,那有什么方法可以让初始化更加简便呢?

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

答:使用构造方法

概念

构造方法是一个特殊的成员方法,名字必须与类名相同(没有返回值,设置为void也不行),在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

方法名 (形参列表){//方法名须与类名相同
	方法体
}

小拓展:一个对象生成至少有两步:

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

构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间,实例化时可以用构造方法对对象进行初始化

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

对日期类可以做以上构造方法,这样在实例化时就可以直接为对象进行初始化,初始化代码如下
Date date = new Date(2004,12,20);

在写构造方法时可以发生重载:下面代码中即使两个构造方法的类名一样,但是参数不同,不会报错,发生了方法的重载,想要调用哪个就可以调用哪个。
但是当没有写任何构造方法时,Java会提供一个默认不带参数的构造方法(一旦写了构造方法,Java就不会在提供不带参数的构造方法),这也是我们不写构造方法对象也能生成的原因。

public Date(){
        System.out.println("这个是不带参数的构造方法");
    }

    public Date(int year, int month, int day){
        System.out.println("这个是带有三个参数的构造方法");
        this.year = year;
        this.month = month;
        this.day = day;
    }

构造方法中可以使用this来调用其他构造方法:
注意事项:

  1. this( ) 必须是该构造方法中的第一条语句
  2. 格式是 this( 参数 )
  3. 不能形成环(像循环一样调来调去的没有意义)
    以下是在没有参数的Date构造方法中调用有参数的Date构造方法代码
    public Date(int year, int month, int day){
        System.out.println("这个是带有三个参数的构造方法");
        this.year = year;
        this.month = month;
        this.day = day;
    }
    
	public Date(){
        this(2024,5,5);
        System.out.println("这个是不带参数的构造方法");
    }

总结:

  1. 构造方法名必须与类名相同
  2. 构造方法没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(实例化对象时一定会调用构造方法
  4. 构造方法可以重载(可以根据需求写出不同的构造方法)
  5. 如果用户没有显式定义(自己写),编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的(注意:一旦用户定义,编译器则不再生成
  6. 当然,当我们自己写的构造方法参数列表与实际实例化时参数列表个长度不同,由于编译器不会再生成不带参数的构造方法,所以编译器报错
  7. 绝大多数用public修饰,特殊情况下用private修饰
  8. 小技巧:idea中自动生成构造方法
    在这里插入图片描述
    在这里插入图片描述
    选择要生成的构造方法

封装

面向对象程序三大特性:封装、继承、多态。(可能的误区:这三个不是哪个语言的特征,而是面向对象的特征)

什么是封装?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
(套壳屏蔽细节,用东西包装起来对外隐藏内部实际细节)
总的来说就是对成员变量和成员方法用private进行修饰。
达到的效果:就是该成员变量或成员方法只能在当前类内部使用,当前类外不能使用(可以写一个方法只能供这个类内的方法使用,这样类外就不知道这个只能供这个类内的方法是怎么写的, 实现了隐藏)

访问限定符(管当前修饰的字段或方法的访问权限)

当一个字段或方法前没有任何访问限定符,则为默认权限 default
在这里插入图片描述

包的概念

在我们的电脑中,我们为了分类,会把同一类的东西放到一个文件夹中,但是我们会发现一个文件夹中不能出现相同名字的文件或文件夹。
类似的,在Java中为了更好地管理类,把类聚集到一个包中,称为软件包。包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,像文件夹一样,一个包中不能有名字相同的两个类(但是在一个工程中可以有两个名字相同的类,只要不在同一个包中)

导入包

Java 中已经提供了很多现成的类供我们使用,我们可以使用 import语句导入包比如说导入 java.util 这个包中的 Date 类
import java.util.Date;
如果想导入 java.util 这个包中的所有类可以 import java.util.*
但是同一个包中可能会有名字相同的类,所以建议显式的指定要导入的类名,否则还是容易出现冲突的情况

import导入的是包下的所有类,用到这个包底下哪个类就回调用哪个(而不是导入的这个包)

/*java.lang:系统常用基础类(String,Object),此包从JDK1.1后自动导入
java.lang.reflect:反射编程包
java.net:进行网络编程开发包
java.sql:进行数据库开发的支持包
java.util:Java提供的工具程序包(集合类等)非常重要
java.io:I/O编程开发包*/

可以使用import static导入包中静态的方法和字段
import static java.lang.Math.*
用静态导入包的好处是可以直接使用静态成员而不用通过类名来访问,使代码更简洁

注意事项: import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要。import 只是为了写代码的时候更方便. import 更类似于 C++ 的 namespace 和 using

static

static修饰成员变量

static修饰的成员变量,称为静态成员变量,也叫类变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的

【静态成员变量特性】

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 类变量只有一份且存储在方法区当中
  4. 生命周期伴随类的一生(即:随类的加载(.class文件通过java文件转化成class对象)而创建,随类的卸载而销毁)
  5. Java当中不允许定义局部的静态变量(可以通过类名或通过对象的引用访问,建议用类名访问)(static修饰的变量是类变量而不是局部变量)

static修饰成员方法

被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的

【静态方法特性】

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过==类名.静态方法名(…)==方式调用,更推荐使用后者
  3. 不能在静态方法中访问任何非静态成员变量
  4. == 静态方法中不能直接调用任何非静态方法,非静态方法中可以调用静态方法==,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用(静态方法中不能使用 static 关键字
    因为:静态方法不依赖与对象,可以直接通过类名来访问
    但是:非静态方法依赖于对象,要通过对象引用访问
    想要在静态方法中调用非静态方法需要先new对象,在通过对象引用访问
  5. 静态方法无法重写,不能用来实现多态

注意:静态的不依赖于对象,属于类,不属于对象

static成员变量初始化

一般通过四种方式:
就地初始化
静态代码块初始化(下面讲)
构造方法(少)
get set 方法初始化

代码块

概念及分类

使用 {} 定义的一段代码称为代码块。分下面四种:

  1. 普通代码块:定义在方法中的代码块(一般不写)
  2. 构造代码块:也叫实例代码块
  3. 静态代码块:一般用来初始化静态成员变量
    static { }
  4. 同步代码块:未来再议

构造代码块:

//实例代码块/构造代码块
    {
        this.name = "z";//实例化对象
        this.age = 18;
        this.num = 11;
    }

静态代码块:

//静态代码块
    static {
        classname = 1;//静态成员变量

    }

关于代码块:

  1. 静态代码块在类加载的时候被执行(静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的)
  2. 如果定义了多个静态代码块/构造代码块,则执行顺序与定义顺序有关
  3. 静态代码块不管生成了多少个对象只会执行一次->说明这个类只会被执行一次
  4. 实例代码块只有在创建对象时才会执行

关于代码块顺序问题:
由于静态代码块在加载时就执行了,而实例代码块在创建对象时才会执行,所以静态代码块的执行顺序先与实例代码块

//实例代码块/构造代码块
    {
        this.name = "z";
        this.age = 18;
        this.num = 11;
        System.out.println("构造");
    }

    //静态代码块
    static {
        classname = 1;
        System.out.println("静态");

    }

    //构造代码块
    {
        this.name = "z";
        this.age = 18;
        this.num = 11;
        System.out.println("构造");
    }

上述代码中,打印顺序为下图,由此可见静态代码块执行顺序先与构造代码块
在这里插入图片描述

对象的打印

重新实现toString来打印对象,代码如下

public class Person {

    public String name;
    public String gander;
    public int age;

    public Person(String name, String gander, int age){//构造方法
        this.name = name;
        this.gander = gander;
        this.age = age;
    }

    public String toString(){//重写toString
        return "[" + this.name + "," + this.gander + "," + this.age + "]";
    }

    public static void main(String[] args) {
        Person person = new Person("z","女",13);
        System.out.println(person);//打印时参数为对象名
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1703131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器端口号,如何避免与公共端口冲突

首先,我们需要明确什么是服务器端口号。服务器端口号是计算机操作系统分配给网络应用程序的一个数字标识,用于区分不同的网络服务。每个网络服务都需要一个唯一的端口号来进行标识,以便在通信过程中能够准确找到对应的服务。 为了避免与公共端…

恒创科技:Linux 服务器和 Windows 服务器哪个更好?

选择正确的服务器系统至关重要,目前广泛使用的选项是 Windows 服务器 和 Linux 服务器,它们各有优缺点。本文将比较 Linux 与 Windows 服务器,让我们来看看它们的主要区别,然后再决定哪种操作系统适合使用。 主要区别:…

Windows下mingw32编译ffmpeg5.1.4实现rtsp拉流

由于客户要求,要在Windows下使用mingw32编译,去ffmpeg.org下载需要编译的版本,使用msys2方法进行编译,使用QT5.10的编译器,基本上把网上的方法试了个遍,编译全部库总是报错出问题 查看了ffbuild文件夹中con…

Mac 电脑给android手机传输文件提示 No android device found

在开发过程中,我们有时候会有在电脑和手机之间传输文件的需求。 Mac电脑给android手机传输文件并不是很方便。 Google 官方提供了一个软件叫Android File Transfer,这个软件免费且好用。 Android File Transfer下载地址 但是使用过程中会遇到一些问题…

Android:使用Kotlin搭建MVI架构模式

一、简介MVI架构模式 M:Model 数据层,包含应用数据和业务逻辑V:View 界面层,在屏幕上显示应用数据,包含与界面相关的状态和界面逻辑,根据界面状态对象更新UI,界面状态定义是不可变的。这样的主要…

完全背包+背包装满 总结

目录 1.背包恰好装满 (1)问题是什么 (2)问题的有效状态和无效状态 (3)问题的常考形式,以及如何去处理 1.值的大小 2.组合个数 3.排列个数 2.例题 A. Cut Ribbon HDU1114 Piggy-Bank …

OpenHarmony实战开发——网络组件axios可以在OpenHarmony上使用了

什么是axios 上古浏览器页面在向服务器请求数据时,因为返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据,但是从服务器端发送的却是整个页面的数据,十分…

C++: 二叉搜索树及实现

目录 一、二叉搜索树的概念 二、二叉搜索树的操作 2.1插入 2.2删除 1.有左子树,无右子树 2.有右子树,无左子树 3.有左子树和右子树 三、二叉搜索树的实现 要点 前言:为了学习map和set,需要先学二叉搜索树作为铺垫。 一、…

计算机毕业设计 | SpringBoot招投标系统 任务发布网站(附源码)

1,绪论 在市场范围内,任务发布网站很受欢迎,有很多开发者以及其他领域的牛人,更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上,任务发布网站鱼龙混杂,用户需要找一个…

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型! 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文介绍了 IP-Adapter,一种 高效地将预训练的图像到图像转换模型适应到新领域 的方法。它通过在预训练模型的 输入端 添加一个…

Python考试复习--day2

1.出租车计费 mile,waitmap(int,input().split(,)) if mile<3:money13wait*1 elif mile>3 and mile<15:money13(mile-3)*2.3wait*1 else:money1312*2.3(mile-15)*2.3*(10.5)wait*1 print({:.0f}.format(money)) 【知识点1】&#xff1a; map() 函数 【知识点1】&…

数字水印 | 离散余弦变换 DCT 基本原理及 Python 代码实现

目录 1 基本原理2 代码实现3 图像压缩 1 基本原理 参考博客&#xff1a;https://www.cnblogs.com/zxporz/p/16072580.html D C T \mathsf{DCT} DCT 全称为 D i s c r e t e C o s i n e T r a n s f o r m \mathsf{Discrete\ Cosine\ Transform} Discrete Cosine Transfo…

HTTPS证书——网站如何实现HTTPS访问?

实现网站HTTPS访问可以简化为以下四个基本步骤&#xff0c;确保过程既通俗易懂又条理清晰&#xff1a; 1. 申请SSL证书 - 目的&#xff1a;SSL证书是实现HTTPS加密的关键&#xff0c;它验证了网站的身份&#xff0c;并提供了加密数据所需的密钥。 - 操作&#xff1a;首先&…

面试手撕——使用两个线程交替打印1-100

记录一下使用两个线程交替打印1-100的操作: /*** description: 使用两个线程交替打印1-100* author: Jay* create: 2024-05-27 21:29**/ public class print_1_to_100 {static volatile int flag 1; //此处需要加关键字volatile保证变量之间的可见性&#xff0c;否则程序将会…

TS(TypeScript)中Array数组无法调出使用includes方法,显示红色警告

解决方法 打开tsconfig.json文件&#xff0c;添加"lib": ["es7", "dom"]即可。 如下图所示。

move base全解

0. 简介 之前我们专门有一节讲到了《move_base源码学习》。主要介绍了MoveBase基类中函数的大概意思以及调用的方式。move_base是ROS下关于机器人路径规划的中心枢纽。它通过订阅激光雷达、map地图、amcl的定位等数据&#xff0c;然后规划出全局和局部路径&#xff0c;再将路径…

数组-两个升序数组中位数

一、题目描述 二、解题思路 (一).基本思想&#xff1a; 如果列表总长度allsize( arr1.size()arr2.size() ) 为奇数时&#xff0c;中位数位置应该在两个列表排序后的第 allsize/2 位置处&#xff0c;如果allsize为偶数&#xff0c;中位数应该取 (allsize/2)-1 和 allsize/2 的…

python数据类型之列表

目录 1.创建列表 2.列表基础操作 常用操作 对列表元素顺序随机打乱 列表下标和切片 字符串分割为列表 列表位移 列表切片替换 3.列表内置方法 4.列表排序 简单排序 使用key参数按指定规则排序 二维列表排序 自定义排序规则函数 5.列表排序算法 选择排序 柱状图…

4-主窗口

4-主窗口 1、简介2 菜单栏、工具栏、状态栏2.1 菜单栏2.2 QAction2.3 工具栏2.4 状态栏 3 混合方式UI设计 1、简介 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件&#xff0c;是许多应用程序&…

宝塔部署前后端分离项目手册

文章目录 安装宝塔安装环境开始部署1. 前端Vue项目1.先本地启动前端项目&#xff08;记住端口号&#xff09;2.打包前端项目3.上传前端项目4.创建PHP站点5.安全里开放端口号6.测试前端 2. 后端boot项目1. 先在本地跑起来2.修改数据库的配置信息3. 项目打包4. nohup启动项目4.1 …