Java中的类与对象

面向对象

设计对象并使用

  • 类: 是共同特征的描述(设计图)

  • 对象: 是真实存在的具体实例

  • Javabean类: 用来描述一类事物的类,在Javabean类里是不写main方法的

    1. 注意: 类名首字母要大写,见名知意,(驼峰模式)

    2. 注意: 在实际开发中,建议一个文件定义一个class类

      代码:

      package com.xiaonan.Demo01;public class GirlFriend {//属性String name;int age;String gender;//行为public void eat(){System.out.println("在吃饭");}public void sleep(){System.out.println("在睡觉");}
      }
package com.xiaonan.Demo01;public class GirlFriendTest {public static void main(String[] args) {//创建一个女朋友对象GirlFriend gf1 = new GirlFriend();//赋值gf1.age = 18;gf1.gender = "女";gf1.name = "小琪";//输出System.out.println(gf1.age);System.out.println(gf1.gender);System.out.println(gf1.name);//调用方法gf1.eat();gf1.sleep();System.out.println("--------------------");//new第二个对象GirlFriend gf2 = new GirlFriend();//赋值gf2.age = 18;gf2.gender = "女";gf2.name = "小青";//输出System.out.println(gf2.age);System.out.println(gf2.gender);System.out.println(gf2.name);//调用方法gf1.eat();gf1.sleep();}
}

封装

  • 是面向对象三大特征 (封装 继承 多态)

  • 对象代表什么,就得封装对应的数据,并提供数据对应的行为

    案例:

    人关门

    这个门是自己关的,人只是给门一个作用力

private关键字

  • 是一个权限修饰符

  • 可以修饰成员(成员变量 和成员方法)

  • 被private(私有的)修饰的成员只能在本类中才能访问

    例子:

package com.xiaonan.test;public class Test {private int age; // private:私有的//set 赋值public void setAge(int a){if(a>=10 && a<= 50){age = a;}else{System.out.println("非法数据");}}//get(获取)public int getAge(){return age;}
}
  • 针对private修饰的成员变量,如果需要被其他的类使用,要提供相应的操作

  • 提供"setXxx(参数)" 方法,用于给成员变量赋值,方法用public修饰

  • 提供"getXxx()" 方法,用于获取成员变量的值,方法用public(公共的)修饰

就近原则和this关键字

示例代码:

package com.xiaonan.test01;public class GirlFriend {//成员变量private int age;public void method() {//局部变量 (方法变量)int age = 10;//System.out.println(age); //就近原则(谁离我近,我就用谁)System.out.println(this.age); //this关键字 这里的age是 成员变量的age}
}
package com.xiaonan.test01;public class GirlFriendTest {public static void main(String[] args) {//创建一个 GirlFriend对象//格式: 类名 对象名 = new 类名();//例子GirlFriend gf1 = new GirlFriend();gf1.method();}
}

this关键字的作用

  • 区分成员变量和局部变量

构造方法

在Java中,构造方法是用于创建对象并初始化对象的特殊方法。构造方法具有以下注意事项:

  1. 构造方法的名称必须与类名完全相同,且没有返回类型(包括void),它们不能被显式地调用,而是在创建对象时自动调用。

  2. 如果在类中没有定义任何构造方法,Java编译器会自动生成一个默认的无参构造方法。如果在类中定义了构造方法,编译器将不会自动生成默认构造方法。

  3. 可以定义多个构造方法,它们可以具有不同的参数列表(参数个数、类型或顺序不同),这被称为方法的重载(overloading)。

  4. 构造方法可以有访问修饰符(如public、private、protected)来控制对构造方法的访问权限。一般情况下,构造方法应该使用public修饰符,以便其他类可以实例化对象。

  5. 在构造方法中可以使用关键字super调用父类的构造方法,以便在创建子类对象时初始化父类的成员变量。

  6. 构造方法可以使用this关键字调用同一个类中的其他构造方法,以便在构造方法之间进行重用。

  7. 构造方法可以抛出异常,但通常不建议在构造方法中抛出受检异常,而应该在构造方法中处理异常或使用非受检异常。

  8. 构造方法可以执行任意的初始化操作,例如初始化对象的成员变量、调用其他方法等。

需要注意的是,构造方法的主要目的是在创建对象时进行初始化操作,因此应该避免在构造方法中执行过多的逻辑或复杂的计算。如果需要进行复杂的初始化操作,可以考虑使用静态工厂方法或其他设计模式来替代构造方法。

标准的JavaBean

  • 类名要见名知意

  • 成员变量使用private修饰

  • 提供至少两个构造方法

    1. 无参构造方法

    2. 带全部参数的构造方法

  • 成员方法

    1. 提供每一个成员变量对应的setXxx()与getXxx()

    2. 如果还有其他的行为也要写上

快捷键

// alt + insert (快速生成JavaBean标准类的 构造无参与全部参数的方法 和set方法和get方法)

插件

PTG 一秒生成标准的JavaBean

对象内存图

一个对象内存图

当在Java中创建一个对象时,它会在堆内存中分配一块连续的内存空间来存储对象的数据。下面是一个更详细的Java对象的内存图示例:

  1. Object Header:对象头是用于存储对象的元数据的部分。它通常包含以下信息:

    • 类型指针(Type Pointer):指向对象所属的类的元数据。
    • 哈希码(Hash Code):对象的哈希码,用于支持对象的哈希表操作。
    • 锁信息(Lock Information):用于支持对象的同步和并发操作。
  2. Instance Variables:实例变量,也称为成员变量或字段,是对象的数据部分。它们是在类中定义的变量,用于存储对象的状态和属性。每个实例变量占用一定的内存空间,具体大小取决于变量的类型和对齐要求。

创建对象时,Java虚拟机会执行以下步骤:

  1. 分配内存:Java虚拟机在堆内存中分配一块连续的内存空间来存储对象的数据。

  2. 初始化对象头:Java虚拟机会将对象头的字段初始化为默认值,如类型指针、哈希码和锁信息。

  3. 初始化实例变量:Java虚拟机会将实例变量的值初始化为默认值,如数值类型为0,布尔类型为false,引用类型为null。

  4. 执行构造方法:Java虚拟机会调用对象的构造方法来执行进一步的初始化操作,可以在构造方法中设置实例变量的具体值。

    注意:上述内存图和步骤是基于Java的传统对象模型,具体实现可能会因Java虚拟机的不同实现而有所不同。此外,Java还有其他的内存区域,如栈内存、方法区等,用于存储不同类型的数据和执行程序的其他操作。

    两个引用指向同一个对象

    在Java中,可以通过将两个引用变量指向同一个对象来实现这种情况。当两个引用指向同一个对象时,它们实际上引用了相同的内存地址,因此它们可以访问和修改相同的对象数据。

    下面是一个示例代码,演示了如何在Java中创建两个引用指向同一个对象:

    public class Main {public static void main(String[] args) {// 创建一个对象MyClass obj = new MyClass();// 创建两个引用指向同一个对象MyClass ref1 = obj;MyClass ref2 = obj;// 修改对象的数据obj.setData("Hello, World!");// 通过两个引用访问和修改相同的对象数据System.out.println(ref1.getData());  // 输出: Hello, World!System.out.println(ref2.getData());  // 输出: Hello, World!}
    }class MyClass {private String data;public void setData(String data) {this.data = data;}public String getData() {return data;}
    }

    在上面的示例中,ref1ref2是两个引用变量,它们都指向obj所引用的同一个MyClass对象。通过这两个引用变量,我们可以访问和修改相同的对象数据。

    需要注意的是,当一个对象没有任何引用指向它时,它将成为Java中的垃圾对象,并由垃圾收集器回收内存。因此,在使用多个引用指向同一个对象时,需要小心确保在不需要引用时及时将其置为null,以便垃圾收集器可以回收不再使用的对象。

    基本数据类型与引用数据类型的区别

  5. 存储方式:基本数据类型的值直接存储在变量中,而引用数据类型的变量存储的是对象的引用(内存地址)。

  6. 大小和默认值:基本数据类型具有固定的大小和默认值,而引用数据类型的大小取决于对象的大小,且默认值为null。

    • 基本数据类型的大小是固定的,不受具体平台的影响。例如,int类型始终占用4个字节。
    • 引用数据类型的大小取决于所引用对象的大小。例如,一个引用变量可能指向一个很小的对象或一个很大的对象。
    • 基本数据类型的默认值是根据其类型确定的。例如,int类型的默认值为0,boolean类型的默认值为false。
    • 引用数据类型的默认值为null,表示该引用变量当前未指向任何对象。
  7. 传递方式:基本数据类型在方法参数传递时是按值传递的,而引用数据类型在方法参数传递时是按引用传递的。

    • 当将基本数据类型作为方法参数传递时,传递的是实际的值的副本。在方法内部对参数进行修改不会影响原始值。
    • 当将引用数据类型作为方法参数传递时,传递的是引用的副本。在方法内部对参数进行修改会影响原始对象。
  8. 内存管理:基本数据类型的变量直接存储数据值,内存管理由编译器或解释器处理;而引用数据类型的变量存储对象的引用,对象的创建和销毁由开发人员手动管理或由垃圾回收器自动处理。

    • 基本数据类型的变量在栈上分配内存,其生命周期由程序控制。
    • 引用数据类型的对象在堆上分配内存,其生命周期由开发人员手动管理或由Java的垃圾回收器自动处理。

    需要注意的是,Java中的基本数据类型包括boolean、byte、short、int、long、float、double和char,而其他所有的类型都属于引用数据类型,包括类、接口、数组和枚举等。

    this关键字的内存原理

    作用: 用于区分局部变量和成员变量

    this的本质: 所在方法调用者的地址值

    在Java中,this关键字表示当前对象的引用。它可以在实例方法和构造方法中使用,用于引用当前正在执行方法的对象。

    this关键字的内存原理如下:

  9. 当创建一个对象时,Java虚拟机会在堆上为该对象分配内存空间,并将对象的实例变量存储在该内存空间中。

  10. 当调用对象的实例方法时,Java虚拟机会将当前对象的引用作为隐藏参数传递给方法。这个隐藏参数就是this关键字所表示的当前对象的引用。

  11. 在方法内部,可以使用this关键字来访问当前对象的实例变量和实例方法。通过this关键字,可以明确地指定当前对象的成员,避免与局部变量或参数发生命名冲突。

  12. 当方法执行完毕后,this关键字的作用也就结束了。它不会占用额外的内存空间,而是在方法调用结束后被释放。

需要注意的是,每个实例方法都有一个隐含的this参数,但它并不会显式地出现在方法的参数列表中。编译器会自动将this参数添加到方法的参数列表中,以便在方法内部使用。

总结起来,this关键字在Java中用于引用当前对象,它并不占用额外的内存空间,而是作为方法的隐含参数传递给实例方法。通过this关键字,可以访问当前对象的实例变量和实例方法。

成员变量和局部变量的区别

在Java中,成员变量(也称为实例变量)和局部变量是两种不同类型的变量,它们有以下区别:

  1. 作用域:成员变量定义在类中,可以在整个类中的各个方法中访问。而局部变量定义在方法、代码块或构造函数中,仅在其所在的作用域内有效。

  2. 生命周期:成员变量的生命周期与对象的生命周期相同,当对象创建时被初始化,直到对象被销毁。而局部变量的生命周期仅限于其所在的作用域,在离开作用域后,局部变量将被销毁。

  3. 默认值:成员变量会被赋予默认值,例如,整数类型的成员变量默认值为0,布尔类型的成员变量默认值为false。而局部变量没有默认值,必须在使用之前显式初始化。

  4. 访问修饰符:成员变量可以使用不同的访问修饰符(如public、private、protected)进行访问控制,以控制其可见性。而局部变量不能使用访问修饰符,它们的可见性仅限于其所在的作用域内。

  5. 内存分配:成员变量在对象创建时分配内存空间,每个对象都有一份成员变量的拷贝。而局部变量在方法调用或代码块执行时分配内存空间,每次调用或执行都会创建一个新的局部变量。

需要注意的是,成员变量和局部变量可以同名,但在同一作用域内,局部变量会覆盖同名的成员变量。如果需要访问成员变量,可以使用关键字"this"来引用当前对象的成员变量。

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

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

相关文章

C#探索之路基础篇(1):编程中面向过程、数据、对象的概念辨析

文章目录 C#探索之路基础篇(1)&#xff1a;编程中面向过程、数据、对象的概念辨析1 面向过程编程1.1 概念1.2 示例代码&#xff1a;1.3 使用范围与时机&#xff1a;1.4 注意事项&#xff1a;1.5 通俗讲法 2 面向对象编程2.1 概念2.2 示例代码2.3 使用范围2.4 注意事项2.5 通俗讲…

软考高级:UML定时图概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

每天学习一个Linux命令之useradd

每天学习一个Linux命令之useradd 介绍 Linux操作系统提供了许多命令来管理用户和用户组。其中一个重要的命令是useradd&#xff0c;它用于在系统中创建新用户。useradd命令提供了许多选项来控制创建用户的行为。本文将逐一介绍useradd命令的所有可用选项。 可用选项 userad…

Java部署运维

1.docker Docker&#xff08;一&#xff09;&#xff1a;安装、命令、应用Docker(二)&#xff1a;数据卷、Dockefile、Docker-composeDocker(三) 通过gitlab部署CICD Docker超详细教程——入门篇实战 Docker教程 2.nginx 3.keepalived 4.k8s 5.jekenis

KW音乐搜索参数

声明&#xff1a; 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 逆向目标: …

Pytorch之Dataset和DataLoader的注意事项

1、数据集的保存形式&#xff1a;一行一行的。 比如说预测两个值的加法&#xff1a;abc&#xff0c;那么传进Dataset的形式应该是 a1,b1,c1 a2,b2,c2 ... an,bn,cn 2、代码 import numpy as np import pandas as pd import torch from torch.utils.data import DataLoader, D…

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统&#xff0c;用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建&#xff0c;现已成为开源软件开发中最流行的版本控制系统&#xff0c;没有之一。Git允许多人同时在不同的分支上工作&…

【leetcode热题】轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

Linux配置bond(网卡绑定)

Linux配置bond&#xff08;网卡绑定&#xff09; 最近需要搭建测试环境&#xff0c;为了保证带宽不成为瓶颈&#xff0c;就需要使用bond来提升网络带宽 1 概念、原理、工作模式 1.1 概念&#xff1a;网卡捆绑 网卡绑定,也称作网卡捆绑。就是将两个或者更多的物理网卡绑定成一…

Leetcode 200. 岛屿数量

心路历程&#xff1a; 在没有看图论这一章之前看这道题没什么直接的思路&#xff0c;在看完图论之后&#xff0c;学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅&#xff0c;但是需要处理的细节第一次没怎么处理好&#xff0c;花了很多…

[C语言]手动实现strcat strcmp strcpy strstr strtok(静态全局指针初始化方式)代码

strcat strcmp strcpy strstr strtok这些代码均存储在c语言的头文件<string.h>中&#xff0c;如果要使用的话直接调用即可&#xff0c;但是为了增加我们对代码的理解&#xff0c;我们看一下如何手动实现这些代码吧&#xff01; strcat strcat是在字符串后面增加上自己想…

Postgresql数据库入门简介

Postgresql入门 1.Postgresql数据库简介 PostgresQL是一个功能强大的开源数据库系统。经过长达15年以上的积极开发和不断改进&#xff0c;PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSql可以运行在所有主流操作系统上&#xff0c;包括Linux…

WebGIS管线在线编辑器(电力、水力、燃气、热力、热能管线)

随着GIS等信息技术的发展&#xff0c;地下管线管理也从二维平面向三维立体管理迈进。传统管线信息管理系统将管线及其附属设施抽象成二维平面内的点、要素&#xff0c;并使用各类点符号、不同颜色线段进行表达。虽能一定程度上满足城市智慧运行的需要&#xff0c;但不能很直观的…

分布式锁简单实现

分布式锁 Redis分布式锁最简单的实现 想要实现分布式锁&#xff0c;必须要求 Redis 有「互斥」的能力&#xff0c;我们可以使用 SETNX 命令&#xff0c;这个命令表示SET if Not Exists&#xff0c;即如果 key 不存在&#xff0c;才会设置它的值&#xff0c;否则什么也不做。 …

mpyboard开发板使用REPL

文章目录 WindowsMacOS XLinux使用REPL提示符重启开发板 REPL是指交互式解释器&#xff08;Read Evaluate Print Loop&#xff09;&#xff0c;就是一种命令输入交互模式&#xff0c;可以使用命令行的方式与pyboard进行交互。REPL是测试代码和运行命令最简单的方式之一&#xf…

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板&#xff0c;13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题&#xff0c;标注&#xff0c;未来主义和线条标题&#xff0c;下三分之一&#xff0c;霓虹灯&#xff0c;带数字的标题&#xff0c;倒计时&#xff0c;表格&#xff0c…

【爬虫】Selenium打开新tab页截图并关闭

如果说 你曾苦过我的甜 我愿活成你的愿 愿不枉啊 愿勇往啊 这盛世每一天 山河无恙 烟火寻常 可是你如愿的眺望 孩子们啊 安睡梦乡 像你深爱的那样 &#x1f3b5; 王菲《如愿》 在自动化测试和网页抓取中&#xff0c;Selenium WebDriver 是一个强大的工具&…

【Mock|JS】Mock的get传参+获取参数信息

mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…

【RH134问答题】第十三章 运行容器(下)

系列文章 第一章 提高命令行生产效率 第二章 计划将来的任务 第三章 调优系统性能 第四章 使用ACL控制对文件的访问 第五章 管理SELinux安全性 第六章 管理基本存储 第七章 管理逻辑卷 第八章 实施高级存储功能 第九章 访问网络附加存储 第十章 控制启动过程 第十一章 管理网络…

每天学习一个Linux命令之passwd

每天学习一个Linux命令之passwd 简介 passwd是Linux下用于修改用户密码的命令。它允许系统管理员或用户修改自己的密码&#xff0c;提供了很多选项以满足不同的需求。 命令选项 passwd命令有以下可用选项&#xff1a; -a&#xff1a;显示密码的更改时间和上一次更改密码的…