Java——类和对象

目录

一.类定义和使用

1.简单认识类

2.类的定义格式

3.注意事项

二.课堂练习

1.定义一个狗类

2.定义一个学生类

3.注意事项:

 三.类的实例化

1.什么是实例化

 2.注意事项

3.类和对象的说明 

四.this引用

1.为什么要有this引用  

2.什么是this引用

五.对象的构造及初始化

1.如何初始化对象

2.构造方法 

2.1概念

2.2特性

3.默认初始化

4.就地初始化 


一.类定义和使用

面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。

上图左侧就是对洗衣机简单的描述,该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知),但是这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言。

1.简单认识类

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干 啥),描述完成后计算机就可以识别了。

比如:洗衣机,它是一个品牌,在Java中可以将其看成是一个类别。
属性:产品品牌,型号,产品重量,外观尺寸,颜色...
功能:洗衣,烘干、定时....

2.类的定义格式

在java中定义类时需要用到class关键字,具体语法如下

// 创建类
class ClassName{  
    field;       // 字段(属性) 或者 成员变量
    method;      // 行为 或者 成员方法
}

class为定义类的关键字,ClassName为类的名字,{}中为类的主体。类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法

class WashMachine{
    public String brand;   // 品牌
    public String type;    // 型号
    public double weight;  // 重量
    public double length;  // 长
    public double width;  // 宽
    public double height;  // 高
    public String color;   // 颜色
    
    public void washClothes(){   // 洗衣服
        System.out.println("洗衣功能");
   }
    
    public void dryClothes(){    // 脱水
        System.out.println("脱水功能");
   }
    
    public void setTime(){       // 定时
        System.out.println("定时功能");
   }
}

采用Java语言将洗衣机类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM的基础上计算机就可以识别了。

3.注意事项

  • 类名注意采用大驼峰定义
  • 成员前写法统一为public,后面会详细解释
  • 此处写的方法不带 static 关键字.。后面会详细解释

 

二.课堂练习

1.定义一个狗类

class PetDog {
    public String name;//名字
    public String color;//颜色
 
    // 狗的属性
    public void barks() {
        System.out.println(name + ": 旺旺旺~~~");
   }
    
    // 狗的行为
    public void wag() {
        System.out.println(name + ": 摇尾巴~~~");
   }
}

2.定义一个学生类

public class Student{
    public String name;
    public String gender;
    public short  age;
    public double score;

    public void DoClass(){

 }
    public void DoHomework(){

 }
    public void Exam(){

 }
}

3.注意事项:

  • 一般一个文件当中只定义一个类
  • main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
  • public修饰的类必须要和文件名相同
  • 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改(右键重命名)。

 三.类的实例化

1.什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog类和Student类。它们都是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。

用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

public class Main{
 public static void main(String[] args) {
        PetDog dogh = new PetDog();     //通过new实例化对象
        dogh.name = "阿黄";
        dogh.color = "黑黄";
        dogh.barks();
        dogh.wag();
        
        PetDog dogs = new PetDog();
        dogs.name = "阿黄";
        dogs.color = "黑黄";
        dogs.barks();
        dogs.wag();
 }
}
 
输出结果:
阿黄: 旺旺旺~~~
阿黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~

 2.注意事项

  • new 关键字用于创建一个对象的实例。
  • 使用 . 来访问对象中的属性和方法
  • 同一个类可以创建多个实例

3.类和对象的说明 

  • 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员
  • 类是一种自定义的类型,可以用来定义变量
  • 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
  • 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

四.this引用

1.为什么要有this引用  

先看一个日期类的例子:

以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题。 但是细思之下有以下两个疑问:

(1)形参名不小心与成员变量名相同 

public void setDay(int year, int month, int day){
    year = year;
    month = month;
    day = day;
}

(2)那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了

 一切让this引用来揭开这层神秘的面纱。

2.什么是this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

public class Date {
    public int year;
    public int month;
    public int day;
 
    public void setDay(int year, int month, int day){
        this.year = year; 
//this.year表示的是引用对象(即 public int year中)的year,赋值号后面的year表示的是参数中的year
        this.month = month;
        this.day = day;
   }
 
    public void printDate(){
        System.out.println(this.year + "/" + this.month + "/" + this.day);
   }
}

 注意:this引用的是调用成员方法的对象。

public static void main(String[] args) {
    Date d = new Date();
    d.setDay(2020,9,15);
    d.printDate();
}

 

五.对象的构造及初始化

1.如何初始化对象

通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

public static void main(String[] args) {
    int a;
    System.out.println(a);
}
 
// Error:(26, 28) java: 可能尚未初始化变量a

要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:

public static void main(String[] args) {
    Date d = new Date();
    d.printDate();
    d.setDate(2021,6,9);
    d.printDate();
}
 
// 代码可以正常通过编译
  • 需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题: 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化? 
  • 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?(五.3默认初始化)

2.构造方法 

2.1概念

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

public class Date {
    public int year;
    public int month;
    public int day;
 
    // 构造方法:
    // 名字与类名相同,没有返回值类型,设置为void也不行
    // 一般情况下使用public修饰
    // 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
    public Date(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("Date(int,int,int)方法被调用了");
   }
 
    public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
   }
 
    public static void main(String[] args) {
        // 此处创建了一个Date类型的对象,并没有显式调用构造方法
        Date d = new Date(2021,6,9);   // 输出Date(int,int,int)方法被调用了
        d.printDate();    // 2021-6-9
   }
}

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

2.2特性

  • 名字必须与类名相同
  • 没有返回值类型,设置为void也不行
  • 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  • 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public class Date {
    public int year;
    public int month;
    public int day;
    
    // 无参构造方法
    public Date(){
        this.year = 1900;
        this.month = 1;
        this.day = 1;
   }
// 带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
   }
 
    public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
   }
 
    public static void main(String[] args) {
        Date d = new Date();
        d.printDate();
   }
}

上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。

  • 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。  
public class Date {
    public int year;
    public int month;
    public int day;
 
    public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
   }
 
    public static void main(String[] args) {
        Date d = new Date(); //此时没有参数,说明调用的是不带参数的构造方法
        d.printDate();
   }
}

上述代码我们没有写以下定义,但是它默认存在

public dog(){
 
}

 注意:一旦用户定义,编译器则不再生成。

public class Date {
    public int year;
    public int month;
    public int day;
 
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
   }
public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
   }
 
    public static void main(String[] args) {
        // 如果编译器会生成,则生成的构造方法一定是无参的
        // 则此处创建对象是可以通过编译的
        // 但实际情况是:编译期报错
        Date d = new Date();
        d.printDate();
   }
}
 
/*
Error:(26, 18) java: 无法将类 extend01.Date中的构造器 Date应用到给定类型;
  需要: int,int,int
  找到: 没有参数
  原因: 实际参数列表和形式参数列表长度不同
*/
  •  构造方法中,可以通过this调用其他构造方法来简化代码
public class Date {
    public int year;
    public int month;
    public int day;
    
    // 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
    // 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
    // 但是this(1900,1,1);必须是构造方法中第一条语句
    public Date(){
        //System.out.println(year);   注释取消掉,编译会失败
        this(1900, 1, 1);
        
        //this.year = 1900;
        //this.month = 1;
        //this.day = 1;
   }
 
    // 带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
   }
}

注意:

this(...)必须是构造方法中第一条语句 

不能形成环

public Date(){
   this(1900,1,1);
}
 
public Date(int year, int month, int day) {
   this();
}
 
/*
无参构造器调用三个参数的构造器,而三个参数构造器又调用无参的构造器,形成构造器的递归调用
编译报错:Error:(19, 12) java: 递归构造器调用
*/

绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)

3.默认初始化

 在上文中提出的第二个问题:为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

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(2021,6,9);
   }
}

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

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

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

  1. 检测对象对应的类是否加载了,如果没有加载则加载
  2. 为对象分配内存空间
  3. 处理并发安全问题 比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突 数据类型
  4. 初始化所分配的空间 即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如: 
  5. 设置对象头信息(关于对象内存模型后面会介绍)
  6. 调用构造方法,给对象中各个成员赋值

4.就地初始化 

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

public class Date {
    public int year = 1900;
    public int month = 1;
    public int day = 1;
 
    public Date(){
   }
 
    public Date(int year, int month, int day) {
   }
 
    public static void main(String[] args) {
        Date d1 = new Date(2021,6,9);
        Date d2 = new Date();
   }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第16章 数据管理组织与角色期望知识点梳理

第16章 数据管理组织与角色期望知识点梳理(附带页码) ◼ 数据管理和数据治理组织需要足够灵活,才能在不断发展的环境中有效地工作。意识、所有权和问责制度是激励和吸引人们参加数据管理积极性、政策和流程的关键。P432 ◼ 如何了解组织的企…

【Docker】docker原理及使用-1

Docker目录 1️⃣概念2️⃣使用容器的好处2️⃣docker和普通软件启动方式的区别2️⃣docker和传统虚拟机的区别 1️⃣下载安装2️⃣安装步骤 1️⃣必须要掌握的核心概念1️⃣命令2️⃣例子2️⃣练习题目2️⃣进入一下python环境(简洁) 1️⃣解释一下 redis1️⃣docker底层隔离机…

AI大模型探索之路-应用篇12:AI大模型应用之向量数据库选型

目录 前言 一、什么是向量数据库? 二、向量数据库的应用场景 1. 图像检索 2. 推荐系统 3. 自然语言处理 三、向量数据库在AI大模型中的应用 1. 训练数据的索引和检索 2. 特征存储和管理 3. 模型中间结果的存储 4. 长上下文的记录和检索 5. 本地知识库的构…

基于springboot实现购物推荐网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现购物推荐网站系统演示 摘要 随着信息互联网购物的飞速发展,一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了东大每日推购物推荐网站的开发全过程。通过分析企业对于东大每日推购物推荐网站的需求,创建了一个计算机管…

Python求利率

要求 编写程序计算在给定利率、指定年数的情况下投资的未来值。这个计算公式如下。 使用文本域输入投资额、年份和利率。当用户单击“calculate”按钮时,在文本域中显示未来的投资值,如图所示。 代码实现 import tkinter as tkdef calculate():amou…

Spring Batch

Spring是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及W…

使用Python爬虫代理IP快速增加博客阅读量

目录 前言 二、Python爬虫代理IP技术简介 1.什么是爬虫? 2.什么是代理IP? 3.为什么使用代理IP? 三、使用Python爬虫代理IP增加博客阅读量的步骤 1.获取代理IP地址 2.模拟多次访问 3.定时任务 四、注意事项 五、总结 前言 随着互联…

金融机构与金融市场监管

金融机构与金融市场监管 中国的金融监管机构银行业监管的必要性银行业监管的基本目标银行业监管的基本内容商业银行的设立审批制度银行业日常监督管理流动性要求资产质量监管合理的内部控制制度风险集中和风险暴漏的监管银行资本风险资本的计算资本充足率的计算 中国的金融监管…

Mobile Tools v2.0 + Example Game

重要提示!如果您已经拥有我们的资产之一,您可以升级到此资产,根据资产的不同,您将获得15%至40%的折扣。 主要功能 包含一个完整游戏,已集成所有功能(广告、成就、排行榜、应用内购买、评价游戏弹出窗口、本地化、每日奖励、交叉促销和通知)。 包括以下独立资产(170美元…

探索数据结构:顺序串与链式串的深入理解

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 串的定义 串是一种特殊的顺序表,即每一个元素都是单独一…

关于机器学习/深度学习的一些事-答知乎问(四)

如何评估和量化深度学习的可解释性问题? 针对深度学习模型,评估指标能够全面衡量模型是否满足可解释性。与分类的评估指标(准确度、精确度和召回率)一样,模型可解释性的评估指标应能从特定角度证明模型的性能。但是&a…

AI服务平台replicate

Replicate是一个提供优秀AI模型和工具的平台,旨在帮助用户实现各种人工智能任务。该平台汇集了来自各个领域的顶尖模型,涵盖了文本到图像生成、语言模型、图像编辑、超分辨率等多个领域。用户可以通过Replicate平台快速获取和应用先进的模型,…

基于Springboot的毕业生信息招聘平台

基于SpringbootVue的毕业生信息招聘平台的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页展示 空中宣讲会 招聘岗位 求职信息 论坛信息 招聘咨询 …

代码随想录算法练习Day13:有效的字母异位词

题目: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 题目链接:242.有效的字母异位词 卡哥的视频讲解&#xff…

kali工具----网络映射器(Network Mapper)系统指纹

系统指纹识别 现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录。指纹识别是识别系统的一个典型模式,包括指纹图像获取、处理、特征提取和对等模块。如果要做渗透测试,需要了解要渗透测试的操作系统的类型才可以。本节将介绍使用Nmap工具测试…

小米温度计接入HA后,手机米家app里温度计就看不到温度数值了

环境: 小米温度计 HA OS Core 2023.12.1 Supervisor 2024.04.0 Operating System 11.1 问题描述: 小米温度计接入HA后,手机米家app里和HA里面温度计就看不到温度数值了 解决方案: 1.前往米家APP,解绑温度计和本地…

都2024年了,线上部署你不会只会log 调试吧,Arthas了解下!

文章目录 一、什么是Arthas?⛅背景⚡Arthas能为我们做什么 二、部署Arthas三、Arthas 基础命令四、Arthas 项目命令实战⌚thread 线程阻塞⏰watch命令演示⚡cpu飙升演示⛽方法演示 🚨小结 一、什么是Arthas? Arthas 是一款线上监控诊断产品&a…

264:vue+openlayers 坐标转换 WGS84-GCJ02-BD09

第264个 点击查看专栏目录 本示例演示如何在vue+openlayers中将 WGS84坐标转化为GCJ02坐标,然后再转换为BD09坐标,本示例中使用的是高德地图,所以转换来的GCJ02坐标是正确的位置。 84坐标系可以理解为是真实坐标系,是一个地点的实际坐标值。02坐标系是加密后的坐标系,是为…

[通俗易懂:Linux标准输入/输出和重定向]Shell脚本之 > /dev/null 2>1命令详解

目录标题 一、> /dev/null 2>&1 命令解析二、/dev/null 文件浅显理解三、标准输入、标准输出、标准错误输出四、输入重定向、输出重定向五、命令作用与应用场景 如果想看命令意义,可以直接跳到第五部分 一、> /dev/null 2>&1 命令解析 我们在别…

【Python深度学习系列】网格搜索选择神经网络超参数:隐含层神经元数量(案例+源码)

这是我的第259篇原创文章。 一、引言 在深度学习中,超参数是指在训练模型时需要手动设置的参数,它们通常不能通过训练数据自动学习得到。超参数的选择对于模型的性能至关重要,因此在进行深度学习实验时,超参数调优通常是一个重要的…