JAVA中类和对象

一.类的创建:

         比如我们创建狗类:

        

public class Dog {public String name; //名字public int age;  //年龄public double tall;  //身高//狗的行为public void bark() {System.out.println("汪汪汪~~~");}public void wag() {System.out.println("摇尾巴~~~");}
}

     注意:

    1.  类名 (Dog) 注意采用大驼峰定义。

     2. 名字,身高这些类的属性要在类的内部方法外部创建。

     3. 一般一个文件当中只定义一个类

     4. 要是想修改类名,不能直接修改在代码 class 后的类名,要在编译器列表的文件栏找到再修改。 

        二.类的实例化:

        前面我们定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是java语言自 带的内置类型,而类是用户自定义了一个新的类型。

        

public class Dog {public String name; //名字public int age;  //年龄public double tall;  //身高//狗的行为public void bark() {System.out.println("汪汪汪~~~");}public void wag() {System.out.println("摇尾巴~~~");}public static void main(String[] args) {Dog s1 = new Dog();Dog s2 = new Dog();s1.name = "大黄";s1.age = 6;s1.tall = 0.4;s1.bark();s1.wag();s2.name = "旺财";s2.age = 8;s2.tall = 0.45;s2.bark();s2.wag();}
}

       注意:

         1.创建类对象可以采用 类名 + 引用变量名 = new + 类名();  

         2.使用  引用变量名 .  来访问对象中的属性和方法。

        输出结果:

        

        其中前两次动作是大黄的,后两次动作是旺财的。

        做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

        注意:

        

         对于类的成员变量来说,每一个成员变量都有一个默认值,引用类型默认值是 null 基本类型默认为对应的默认值。(int 是 0,double 是 0.0..........)

        三.this的功能

        (1) 

        我们来看下面的代码:

public class Date {public int year;public int month;public int day;public void setDate(int y,int m,int d) {year = y;month = m;day = d;}public void printDate() {System.out.println(year+" 年 "+month+" 月 "+day+" 日");}public static void main(String[] args) {Date date1 = new Date();date1.setDate(1999,6,6);date1.printDate();Date date2 = new Date();date2.setDate(2000,1,10);date2.printDate();}
}

        打印结果:

             

  我们创建了一个日期(Date)的类,再创建了两个对象,引用变量分别是date1  ,   date2  。

        接着分别赋值后再打印,那么,其他代码不变,我们把 setDate 方法 改成这样

        

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

        打印结果:

        

        我们发现对象并没有被赋值,怎么回事呢?

         因为 year = year 与 month = month 与 day = day 都是 setDate 方法里的形参,形参给形参赋值, 并没有赋值给我们的成员变量 date1 和 date2 ,形参名字与成员变量名相同了时,怎么解决呢?

        可以在前面加上 this. 

        

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

        打印结果:

        

        可以看到,正常赋值了,因为加上 this 后他会区分是当前对象的变量与形参的 year 与 month 与 day 。

        (2)

        再比如,方法是怎么知道给哪个对象的成员变量进行赋值的呢?

        是因为前面的引用变量名:

    date1.setDate(1999,6,6);date1.printDate();

        可以看到,方法前面的  date1. 可以让方法知道你当前调用的是哪个对象。

        而且,方法他会隐藏传递过去一个变量:

        比如我们看一个给对象赋值的方法:

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

        他会隐藏传递一个 Date this , this 可以看作是 date1 引用变量,因为 this 类型也是  Date ,  他把 date1 这个引用隐藏传递过去了,所以为什么只在调用方法前加  date1.  编译器就知道你要修改哪个对象。所以这个 Date this 不需要我们用户写,默认隐藏就行了。

      (3)通过this调用访问当前对象成员方法

        看下面代码:

public class Date {public int year;public int month;public int day;public void func() {this.printDate();}public void setDate(Date this,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 date1 = new Date();date1.setDate(1999,6,6);date1.func();}
}

        结果:

        

         可以看到,打印我们使用了 date1.func() ; 而  func  方法里面有个 this.printDate() ; 打印我们的结果,因为 this  可以让方法知道你当前调用的是哪个对象,这里我们调用的是 date1 。

        四.就地初始化

看下面代码:

public class Date {public int year = 1000;public int month = 10;public int day = 10;public void printDate() {System.out.println(year+" 年 "+month+" 月 "+day+" 日");}public static void main(String[] args) {Date date1 = new Date();date1.printDate();}
}

        结果:

         

         可以看到,我们如果想要默认有参数,就可以这样设置,就不会出现 不初始化 都是 默认基本参数了。

        五.构造方法

                构造方法名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

        下面看一段代码:

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 date1 = new Date(1999,2,2);date1.printDate();}
}

        结果:

        

         可以看到,构造方法在新对象时就可以传递过去数据进行初始化,注意,构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

        而且,当一个类没有写任何构造方法时,此时会存在一个默认不带参数的构造方法,只不过这个默认不带参数的构造方法里面什么都没做

        1.构造方法重载:

        构造方法是可以重载的,比如:

public class Date {public int year;public int month;public int day;public Date() {System.out.println("什么都没做");}public Date(int year ,int month,int day) {this.year = year;this.month =month;this.day =  day;System.out.println("初始化三个参数");}public void printDate() {System.out.println(year+" 年 "+month+" 月 "+day+" 日");}public static void main(String[] args) {Date date1 = new Date(1999,2,2);date1.printDate();}
}

        结果:

        

        另一段代码:

public class Date {public int year;public int month;public int day;public Date() {System.out.println("什么都没做");}public Date(int year ,int month,int day) {this.year = year;this.month =month;this.day =  day;System.out.println("初始化三个参数");}public void printDate() {System.out.println(year+" 年 "+month+" 月 "+day+" 日");}public static void main(String[] args) {Date date1 = new Date();date1.printDate();}
}

         结果:

        

        可以看到,当  Date date1 = new Date() 括号里有参数 与 没有参数时,结果时不一样的,因为构造方法重载了。

        2.救急不救穷:

        有这段代码:

        

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;System.out.println("初始化三个参数");}public void printDate() {System.out.println(year+" 年 "+month+" 月 "+day+" 日");}public static void main(String[] args) {Date date1 = new Date();date1.printDate();}
}

        结果是报错了,为什么呢?

        因为如果一个构造方法都没有的时候,会有个默认的构造方法,但是其里面什么都不做

        但是上面代码有了个构造方法,就不能调用 默认的构造方法

        俗称“救急不救穷”。

        3.构造方法里可以调用其他构造方法:

public class Date {public int year;public int month;public int day;public Date() {this(1999,5,5);System.out.println("不做什么");}public Date(int year ,int month,int day) {this.year = year;this.month =month;this.day =  day;System.out.println("初始化三个参数");}public void printDate() {System.out.println(year+" 年 "+month+" 月 "+day+" 日");}public static void main(String[] args) {Date date1 = new Date();date1.printDate();}
}

        结果:

        

         可以看到,他一开始走的是没有参数的 Date 方法,之后通过 this 进入了 有参数 的构造方法,构造方法里可以利用 this 可以调用其他构造方法

        注意:

        this(1999,5,5) ;这段代码必须是构造方法中的第一行!

        4.构造方法不要形成环:

        

public class Date {public int year;public int month;public int day;public Date() {this(1999,5,5);System.out.println("不做什么");}public Date(int year ,int month,int day) {this();this.year = year;this.month =month;this.day =  day;System.out.println("初始化三个参数");}public void printDate() {System.out.println(year+" 年 "+month+" 月 "+day+" 日");}public static void main(String[] args) {Date date1 = new Date();date1.printDate();}
}

        这样也是报错,因为有参数的构造方法里出现了 this () 又回到了无参数的构造方法,形成了环。

        

        

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘提升3DMAX效率的6款必备神级插件!

对于3DMax新手来说,掌握一些高效、实用的插件能够大大提升工作效率和创作质量。以下是6个不能错过的神级插件推荐: 第1个:3DMAX造山地形插件Mountain是一款专为3dMax设计的插件,旨在帮助用户轻松快速地创建逼真的山脉地形。以下是对该插件的详细介绍: 一、插件概述 Mou…

手写模拟Spring的基本功能

文章目录 1. Spring的基本功能2. 容器启动 容器启动,即创建容器对象并赋予配置对象3. BeanDefinition扫描4. Bean的生命周期5. 单例Bean与多例Bean6. 依赖注入7. AOP8. Aware 回调9. 初始化10. BeanPostProcessor附录: 1. Spring的基本功能 2. 容器启动 …

VSCode图标的含义,以及DataLoader代码的使用

1 问题 vscode中的那些图标的含义分别是什么Dataloader代码怎么做 2 方法 去网站里面搜索各种图形代表的含义然后进行理解和记忆 长方体:变量 紫色立方体: 库中预定义的枚举: 两个矩形块:枚举 自定义的枚举 橙色树状结构&#xff…

LinkedList和链表(上)

1. 顺序表ArrayList的缺点和优点 优点: 1> 在给定下标进行查找的时候,时间复杂度是O(1) 缺点: 1> 插入数据必须移动其他数据,最坏情况下,插入到0位置,时间复杂度为O(N) 2> 删除数据也需要移动数据,最坏情况下,就是删除0位置.时间复杂度为O(N) 3> 扩容之后(1.5倍扩容…

SQL JOIN的学习

SQL JOIN (w3school.com.cn) 之前跟着老师学数据库的时候学过,最近又比较频繁的在使用。 再复习一下。 Id_P是主键 Id_O是主键 1. SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P Orders.Id_P 2. SEL…

【JVM】—深入理解G1回收器——概念详解

深入理解G1回收器——概念详解 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 文章目录 深入理解G1回收器…

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产,企业管理员必须建立高效的企业终端安全管控机制,确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统,确保任何未经授权的资产变动都能被迅…

Shiro认证 -- (Authentication)

Apache Shiro是一个功能强大的Java安全框架,提供了身份验证(Authentication)、授权(Authorization)、加密(Cryptography)、会话管理(Session Management)、与Web集成、缓…

【WEB应用安全测试指南–蓝队安全测试2】--超详细-可直接进行实战!!!亲测-可进行安全及渗透测试

安全基础理论入门知识参考上一篇《WEB应用安全测试指南蓝队安全测试1》 WEB应用安全测试指南2 一、文件 I/O 类1.1、任意文件上传1.2、任意文件下载1.3、文件包含 二、接口安全类2.1、短信炸弹2.2、邮件炸弹2.3、短信内容可控2.4、邮件内容可控 三、逻辑流程类3.1、越权3.2、未…

深度学习论文: EfficientCrackNet: A Lightweight Model for Crack Segmentation

深度学习论文: EfficientCrackNet: A Lightweight Model for Crack Segmentation EfficientCrackNet: A Lightweight Model for Crack Segmentation PDF: https://arxiv.org/pdf/2409.18099v1 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https:/…

红日安全vulnstack (一)

目录 环境搭建 本机双网卡 Kali IP 靶机IP Web GetShell 前期信息收集 Yxcms后台模板 Getshell PHPMyAdmin日志 Getshell into outfile写入一句话 X phpmyadmin 日志写入一句话 后渗透 MSF 生成木马上线 提取用户hash值 **hash**加密方式 MSF权限Shell至CS CS …

光标在单词中间,如何通过快捷键选择当前单词?

工具》选项>环境》键盘 :把应用修改成visual studio 6或者 visual assist就可以了

IO编程--单字符、字符串、格式化、模块化实现文件拷贝以及登录注册

一、完成标准io的单字符、字符串、格式化、模块化实现两个文件的拷贝 代码如下&#xff1a; 1.单字符 #include <myhead.h> int main(int argc, const char *argv[]) {//打开文件FILE* fpfopen("test.txt","r"); FILE* fqfopen("copy_test.txt&…

第九课:Python学习之函数基础

函数基础 目标 函数的快速体验函数的基本使用函数的参数函数的返回值函数的嵌套调用在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数&#xff0c;就是把 具有独立功能的代码块 组织为一个小模块&#xff0c;在需要的时候 调用函数的使用包含两个步骤&#xff…

基于GRNN广义回归网络和MFCC的语音情绪识别matlab仿真,对比SVM和KNN

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) filePath Test_data\悲伤1.wav 类型&#xff1a;悲伤 识别置信度 Vmax 0.9559 2.算法运行软件版本 matlab2022a 3.部…

Vue2路由

1.路由 1.1.Vue路由基础 Vue属于单页应用&#xff08;SPA&#xff09;&#xff0c;即整个应用程序中只有一个html页面。 在单页应用中&#xff08;SPA&#xff09;&#xff0c;由于只是更改DOM来模拟多页面&#xff0c;所以页面浏览历史记录的功能就丧失了。此时&#xff0c…

nextjs项目中,使用postgres的完整案例

目的 通过此案例&#xff0c;可以简单快速的过一下数据库的操作&#xff0c;熟悉app-router这种模式下&#xff0c;client component和server component的两种组件中基本的接口使用。 技术栈 nextjs14.2.* app-routervercel/postgres0.10.*typescript5 重要事情说三遍1 ap…

uni-app写的微信小程序如何体积太大如何处理

方法一&#xff1a;对主包进行分包处理&#xff0c;将使用url: /pages/components/equipment/equipment跳转页面的全部拆分为分包&#xff0c;如url: /pagesS/components/equipment/equipment 在pages.json中添加 "subPackages": [{ "root"…

antd样式修改

1.Tab添加竖线 .ant-tabs .ant-tabs-tab {&::before {position: absolute;top: 50%;inset-inline-end: 0;width: 1px;height: 24px;background-color: #e1e1e1;transform: translateY(-50%);transition: background-color 0.2s;content: "";}} 像这样&#xff…

基于SSM的药品商城系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…