深度剖析java类和对象

news2024/11/30 6:49:46

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
在这里插入图片描述

在Java中,一切皆对象。

目录

  • 一、类的定义和使用
    • 1.1类的定义格式
    • 1.2定义学生类
  • 二、类的实例化
  • 三、this引用
    • 3.1this引用是什么
    • 3.2this引用特性
  • 四、对象的构造及初始化
    • 4.1如何初始化对象
    • 4.2构造方法
    • 4.3构造方法特性
    • 4.4调用本类当中其它构造方法
    • 4.5默认初始化
    • 4.6就地初始化

一、类的定义和使用

在Java中,我们通过类来描述对象。

类的定义:Java类是面向对象编程中的基本构建模块,用于描述对象的属性(成员变量)和行为(方法)

1.1类的定义格式

Java类的定义格式如下:

[访问修饰符] class 类名 {
    // 成员变量(属性)
    
    // 构造方法
    
    // 方法
}

一个类应该有以下几部分组成:类声明、成员变量、成员方法、构造方法、访问修饰符。

1.2定义学生类

class Student{
	//成员变量
	public String name;
	public String gender;
	public short age;
	public double score;
	
	//方法
	public void DoClass(){}
	public void DoHomework(){}
	public void Exam(){}
}

我们定义类时应该注意一下注意事项:

1.一般一个文件当中只定义一个类
2.main方法所在的类一般要使用public修饰
3.public修饰的类必须要和文件名相同
4.不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改

二、类的实例化

我们首先要知道,我们定义一个类时其实就是在计算机当中自定义了一个类型,就像int、double一样,只不过类这个类型时我们自己定义的而已,而int、double这样的类型是Java语言自带的内置数据类型。

有了类这个类型(可以理解为我们自己定义的一种自定义类型)之后,我们就可以利用类这个类型来定义实例(也称对象)了,这个过程就称为类的实例化。

举个例子:
下面有一个Teacher类,请看:

class Teacher{
	//成员变量或字段
    public String name;
    public int age;
    public int ID;

	//成员函数
    public void work(){
        System.out.println("今天的工作是教学");
    }
    public void wages(){
        System.out.println("本月的工资为10000");
    }
}

我们现在实力化一个Teacher类对象,请看:

public class Test2 {
    public static void main(String[] args) {
        //通过new来实例化一个Teacher对象
        Teacher t1 = new Teacher();
        t1.name = "李华";
        t1.age = 25;
        t1.ID = 123456;

        System.out.println(t1.name);
        System.out.println(t1.age);
        System.out.println(t1.ID);

        t1.work();
        t1.wages();
    }
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

关于类的实例化这里有以下几点需要注意:

1.通过new 关键字来实例化一个对象。
2.使用 . 来访问对象中的属性和方法。
3.同一个类可以实例化多个对象。
4.**当成员变量没有赋值的时候,默认值就是其对应的初始值。**即int->0 float->0.0f boolean->false char->'\u0000'

三、this引用

3.1this引用是什么

概念:this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。

下面是日期类对象,请看:

class Date {
    public int year;
    public int month;
    public int day;
    public void setDay(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 class Test3 {
    public static void main(String[] args) {
        //先构造3个日期类对象
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();

        //对每个对象的成员变量进行赋值
        d1.setDay(23,8,30);
        d2.setDay(23,8,31);
        d3.setDay(23,9,1);

        //对每个日期类对象进行打印
        d1.printDate();
        d2.printDate();
        d3.printDate();
    }
}

运行结果如下:
在这里插入图片描述

注意关键字this用于引用当前对象,即调用当前方法的对象。它可以在对象的成员方法中引用当前对象的成员变量和方法。
请看举例:

class MyClass {
    private int value;

    public void printValue() {
        System.out.println(this.value); // 使用this引用当前对象的成员变量
    }
}

3.2this引用特性

this引用有如下几个特性:

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
  2. this只能在成员方法中使用(静态成员方法无法使用)
  3. 在成员方法中,this只能引用当前对象,不能再引用其他对象
  4. this是成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收

四、对象的构造及初始化

4.1如何初始化对象

我们先来看一个问题,如果一个对象没有对其成员变量赋值的话,那能不能打印其成员变量呢?依然是那日期类对象来进行举例:
在这里插入图片描述

运行结果如下:在这里插入图片描述

可以看到这里并没有报错。因为如果我们没有显式的初始化对象的成员变量,那么编译器就会默认将对象的成员变量进行初始化。

4.2构造方法

我们也可以通过构造方法来对对象进行初始化

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

请看举例:

//不带参数的构造函数
public Date(){
    System.out.println("不带参数的构造方法");
}
//带参数的构造函数
public Date(int year,int month,int day){
    System.out.println("带参数的构造方法");
}

我们要想实例化一个对象,就必须调用构造函数,因为只有调用完构造函数之后,才算真正实例化出了一个对象(调用完构造函数之后对象才算真正意义上的产生)。

另外,构造方法是可以构成重载的,如上(一个带参数、一个不带参数的构造方法)。

4.3构造方法特性

  • 名字必须与类名相同
  • 没有返回值类型,设置为void也不行
  • 当创建对象时由编译器自动调用构造函数,并且在对象的生命周期内只调用一次
  • 如果我们自己写了构造方法(无论是带参数还是不带参数),编译器则不会自己生成构造函数。
  • 当没有显式定义构造方法,编译器会自动为我们生成一个不带参数的构造方法
  • 构造方法支持重载(根据自己需求来提供不同参数的构造方法)
  • 大多数情况下,构造方法用public来进行修饰,特殊场景下需要用private来修饰。

4.4调用本类当中其它构造方法

什么是调用本类当中其它构造方法呢?请看举例:

class Date {
    public int year;
    public int month;
    public int day;
	//无参构造
    Date(){
        //调用本类当中其它构造方法
        this(23,5,21);//不许放在构造方法里面而且是第一行
        System.out.println("不带参数的构造方法");
    }
    //带参构造
    Date(int year,int month,int day){
        System.out.println("带参数的构造方法");
    }
    public void setDay(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);
    }
}

this(…)有两点需要注意

  • 必须放在构造方法中且是第一行
  • 不能形成环

4.5默认初始化

默认初始化是指在创建对象时,如果没有显式地对成员变量进行初始化,Java会使用默认值来初始化它们。默认值根据成员变量的类型而定,例如,整型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。默认初始化确保了对象在创建时每个成员变量都有一个初始值。

请看举例:
在这里插入图片描述
运行结果如下:
在这里插入图片描述

4.6就地初始化

就地初始化是指在创建对象时,对成员变量进行显式的初始化。我们可以在对象创建的同时为成员变量赋予特定的值。

请看举例:

public class MyClass {
	//当然,在这里进行就地初始化也是可以的
    private int value;
    private String str;

    // 就地初始化块
    {
        value = 10;
        str = "Hello";
    }

    // 构造方法1
    public MyClass() {
        // 存在就地初始化的成员变量的初始化语句
    }

    // 构造方法2
    public MyClass(int value) {
        // 存在就地初始化的成员变量的初始化语句
        this.value = value;
    }
}

解释
MyClass类包含一个就地初始化块,在这个块中对成员变量value和str进行了初始化。在编译期间,编译器会将就地初始化块的内容添加到所有的构造函数中(包括无参构造函数和带参构造函数)。
因此,无论是使用无参构造函数还是带参构造函数创建对象,成员变量value和str都会得到就地初始化块中指定的初始值。

所以,就地初始化后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。这样可以确保无论使用哪个构造函数创建对象,成员变量都得到了正确的初始化

以上就是本文类和对象的全部内容。

好了,本文到这里就结束了,再见啦友友们!!!
在这里插入图片描述

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

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

相关文章

MariaDB数据库服务器

目录 一、什么是数据库? 二、什么是关系型数据库? 三、数据库字符集和排序规则是什么? 四、常用数据类型 五、Mariadb数据库相关配置案例 一、什么是数据库? 数据库(DB)是以一定方式长期存储在计算机硬盘内…

【Terraform学习】使用 Terraform创建DynamoDB添加项目(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

Android JNI系列详解之ndk-build工具的使用

一、Android项目中使用ndk-build工具编译库文件 之前介绍过CMake编译工具的使用,今天介绍一种ndk自带的编译工具ndk-build的使用。 ndk-build目前主要有两种配置使用方式: 如上图所示,第一种方式是Android.mkApplication.mkgradle的方式生成…

leetcode15. 三数之和(java)

三数之和 题目描述双指针法代码演示 题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xf…

机器视觉工程师们,学习是工作以外的事情

面试时,领导问你,很多技术问题,你永远的回答是,我可以学。 公司以为你来公司的目标就是学习,学完就跑。 那你进公司的目标到底是什么? 我认为你,你最好想好再回答。 对于每一家公司来说&#xf…

android——spinner下拉弹窗、popupwindow下拉弹窗列表

一、spinner下拉弹窗 效果图如下: adapter的代码: package com.yaona.spinnerimport android.R import android.content.Context import android.graphics.Color import android.view.LayoutInflater import android.view.View import android.view.Vie…

配置环境变量的作用

配置环境变量的作用 一般运行过程:寻找QQ.exe所在的目录,输入QQ.exe配置环境变量:把QQ所在的路径配给操作系统Path, 在任何路径下都能运行QQ.exe 举例: 定义变量:SCALA_HOME SCALA_HOME、JAVA_HOME 等这…

27.CSS粒子特效

效果 源码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Vanilla JS Particles</title><link rel="stylesheet" href="style.css"> </head> <body>…

【2023百度之星备赛】码蹄集 BD202301 公园(BFS求最短路)

题目 https://www.matiji.net/exam/brushquestion/1/4347/179CE77A7B772D15A8C00DD8198AAC74?from1 题目大意&#xff1a; 给定一个无向图&#xff0c;有两个人往同一个目的地走&#xff0c;分别消耗体力TE、FE。如果他们到某个点汇合了&#xff0c;然后一起走向目的地&…

三、原型模式

一、什么是原型模式 原型&#xff08;Prototype&#xff09;模式的定义如下&#xff1a;用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里&#xff0c;原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效&a…

数据结构 day6

1->xmind 2->递归实现程序&#xff1a;输入一个数&#xff0c;输出该数的每一位

【哈士奇赠书活动 - 37期】- 〖深入浅出SSD:固态存储核心技术、原理与实战 第2版〗

文章目录 ⭐️ 赠书 - 《深入浅出SSD&#xff1a;固态存储核心技术、原理与实战 第2版》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《深入浅出SSD&#xff1a;固态存储核心技术、原理与实战 第2版》 ⭐️ 内容简介 本书从基础认知、核心技…

Mac版JFormDesigner IDEA插件安装(非商业用途)

前言 仅供个人开发者使用&#xff0c;勿用作商业用途。 仅供个人开发者使用&#xff0c;勿用作商业用途。 仅供个人开发者使用&#xff0c;勿用作商业用途。 感觉做了这些年开发&#xff0c;怎么感觉市场越搞越回去了。桌面应用又成主流了&#xff1f; 甲方让做桌面客户端&am…

【微服务部署】一、使用docker-compose部署Jenkins、SonarQube、PostgreSQL

一、安装 1、编写docker-compose部署Postgres、SonarQube、Jenkins的yml文件jenkins-compose.yml Postgres&#xff1a;作为SonarQube的数据库存储SonarQube&#xff1a;代码质量检查Jenkins&#xff1a;jenkins/jenkins:lts镜像&#xff0c;jenkinsci/blueocean镜像缺少node…

ELK安装、部署、调试 (二) ES的安装部署

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口操作ES&#xff0c;也可以利用Java API。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业…

linux安装docker全过程

3. 第二步&#xff1a;设置docker的存储库。就两条命令&#xff0c;我们直接执行就好。 ​ sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ​​ 4. 安装docker engine和docker-compose。 执行命…

WebSocket--技术文档--架构体系--《WebSocket实现原理以及关键组件》

WebSocket产生背景 简单的说&#xff0c;WebSocket协议之前&#xff0c;双工通信是通过多个http链接来实现&#xff0c;这导致了效率低下。WebSocket解决了这个问题。下面是标准RFC6455中的产生背景概述。 长久以来, 创建实现客户端和用户端之间双工通讯的web app都会造成HTT…

4.6 审阅与共享演示文稿

本节主要学习了审阅与共享演示文稿的方法&#xff0c;让用户学会审查制作好的演示文稿&#xff0c;并分享给其他人。 4.6.1 审阅演示文稿 当需要对其他人制作的演示文稿进行修改时&#xff0c;可使用添加批注功能&#xff0c;这样能在不改动原有幻灯片的情况下&#xff0c;使…

MAC修改python3命令为py

1, 找到python3安装路径 2, vi ~/.bash_profile 3, 增加内容: alias py“/usr/bin/python3” 4, 重载source ~/.bash_profile 5,执行py

onnx模型修改:将均值和方差放到模型中

训练模型时&#xff0c;一般都会对原始数据进行归一化再送入网络&#xff0c;即减均值和除方差。在部署时&#xff0c;我们也要进行同样的操作。有些推理框架会提供对应的接口&#xff0c;我们只需要设置均值和方差即可&#xff0c;如MNN.也有一些框架不提供这样的功能&#xf…