Java学习----类和对象与封装

news2024/11/26 16:27:29

目录

  • 一、面向对象和面向过程
  • 二、类
    • 类的定义
    • 类的实例化
    • this引用(这一块一定要看懂哦)
    • 类的构造方法
    • 成员变量的初始化
  • 三、封装
    • 常见的包
  • 四、关于static
    • 初始化
  • 五、代码块
  • 六、对象的打印--toString

一、面向对象和面向过程

众所周知,Java语言是面向对象的语言,那么什么是面向对象呢?面向对象(OOP)的世界中,一切皆对象。面向对象是解决问题的一种思想,注重于对象与对象之间的交互。相反,还有一个词,大家一定很熟悉,面向过程,这个顾名思义,注重于过程。
拿洗衣服举例子,面向对象我只要准备好脏衣服,洗衣机,洗衣粉就可以,主要为对象之间的交互。而面向过程,我需要准备好盆子,然后倒水,然后放衣服再放洗衣粉再洗再倒脏水再放干净水再拧干…等等,注重每一个过程。
面向对象和面向过程两者没有谁更好一说,只是根据场景来决定用哪种。

二、类

类的定义

类是用来描述一个实体的,描述实体有什么属性,有什么功能。

class 类名 {
	//属性(成员变量);
	//行为(成员方法);
}

举例如下:

class Data {
    private int x;
    private int y;

    public Data(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

}

下面我们来说注意点!

  1. 一个Java文件中可以有多个类,但是只可以有一个类带public,并且public修饰的类名需要和java文件名相同。(建议一个Java文件只有一个类)
  2. 类名的定义要采用大驼峰形式。
  3. 局部变量必须初始化,但在类中定义的变量可以不进行初始化,如果没有给定初始值系统会分配默认值。
  4. 成员变量是定义在方法外面,定义在类里面。
  5. 成员变量分为两种:静态成员变量(带static)和普通成员变量。
  6. 成员方法(行为)也分为两种:静态成员方法和普通成员方法。

类的实例化

我们可以理解为定义了一个类,等同于创造了一个自定义的类型,类似于基本数据类型。那么我们就可以用自己定义的类类型去创建实例(对象)这也就称为类的实例化。这个要用到关键字new搭配自定义的类名实例化。

class Student {
    public int age;
    public String name;
}
public class JavaSE729 {
    public static void main(String[] args) {
    //类的实例化
        Student student = new Student();
        Student student1 = new Student();
        student.age = 18;
        student1.name = "lay";
    }
}
  • 类的实例化离不开关键字new
  • 使用.可以访问自定义的类中的成员变量和成员方法
  • 自定义的类可以实例化多次
  • 类的实例化会进行两步操作:为对象分配内存空间;调用合适的构造方法。
    为了方便大家理解,这里我画一下大致的内存图:
    在这里插入图片描述
    大家可能会有疑问,我上面的代码有的并没有进行赋值,为啥仍有值呢?这就和下面这一块有关系了。

this引用(这一块一定要看懂哦)

Java中为什么会用到this呢?我给大家放一段代码:

class Student {
    public int age;
    public String name;
    public void study(String name) {
        name = name;
    }
    public void printName() {
        System.out.println(name);
    }
}
public class JavaSE729 {
    public static void main(String[] args) {
        Student student = new Student();
        Student student1 = new Student();
        student.study("hh");
        student.printName();
    }
}

在上述代码,我想完成的是:通过study方法将形参传给成员变量,然后再通过printName()方法将名字打印出来,但是,打印出来的结果是null。

问题出现在成员方法study内,不难发现,形参和成员变量名字一样,但我们都知道,范围小的变量会优先使用,所以,方法中的name = name等于自己给自己赋值,并没有给成员变量赋值。出了方法后,变量失效了。打印成员变量,由于没有给他值,所以系统会提供默认值。

在这里插入图片描述

  1. 也正是因为有个隐藏参数,所以不同对象传递不同参数,执行不同操作的时候不会出错。
  2. this引用的是调用成员变量的方法,哪个对象调用就是哪个对象的引用类型。
  3. this只可以用到成员方法中。
  4. 用this的时候主要为了解决成员变量和形参名字相同的情况。但建议最好能习惯用this,不论名字相同还是不相同,最好都加上。
  5. this还可用在构造方法中。

类的构造方法

构造方法为特殊的成员方法,名字必须和类名相同,在实例化的时候编译器会自动调用。在对象的生命周期内只调用一次(实例化的时候)。

  1. 构造方法没有返回值,设置成void也不可以。
  2. 构造方法一般用public修饰。
  3. 那么我们为什么会用到构造方法呢?简单来说,我们用构造方法就是为了更快的给成员变量赋值并不开辟空间。
  4. 在我们没有编写构造方法的时候,计算机会默认提供一个无参构造方法。(计算机默认添加的,在自己的代码上看不到)
//这种是计算机默认提供的
    public PetDog() {       
    }
  1. 构造方法可以重载,一个类中可以有很多构造方法。可以根据自己的需要来确定构造方法的参数。
    public PetDog() {

    }
    public PetDog(int num) {
        this.num = num;
    }
    public PetDog(int num, int age) {
        this.num = num;
        this.age = age;
    }
  1. 只要我们自己编写了构造方法后,系统将不会再提供构造方法给我们。
  2. this可以用到构造方法中,此时this的作用是调用其他构造方法来简化代码。
    public PetDog() {
        this(15);//使用了this(),传了一个整数,调用了下面的构造方法。
    }
    public PetDog(int num) {
        this.num = num;
    }
  1. 对于this()这个语句必须放到构造方法的第一句中。并且不可以形成环。如下:
    public PetDog() {
        this(15);//这调用了含有一个参数的构造方法
    }
    public PetDog(int num) {
        this();//在这调用了无参的构造方法
        this.num = num;
    }
  1. 大多数情况下使用public修饰构造方法,但有时候会用到private。(这个目前了解一下就行)

成员变量的初始化

对于局部变量,我们必须初始化才可以使用,但对于成员变量,我们可以不进行初始化就能使用。当我们不进行初始化的时候,计算机会将对应类型的默认值赋值给成员变量。基本数据类型默认值如下图,引用类型的默认值均为null。
在这里插入图片描述

  1. 可以就地初始化。在定义成员变量的时候进行赋值。
class PetDog {
    int num = 18;
    int age = 22;
    }
  1. 通过构造方法进行初始化。构造方法可以重载,选用合适的构造方法。
class{
	int num;
	int age;
    public PetDog(int num, int age) {
        this.num = num;
        this.age = age;
    }
}
public class JavaSE729 {
    public static void main(String[] args) {
        PetDog petDog = new PetDog(18,29);//进行初始化
    }
 }
  1. 通过普通成员方法进行初始化。
class PetDog {
    int num ;
    int age ;
    public void Study(int num) {
        this.num = num;
    }
}
public class JavaSE729 {
    public static void main(String[] args) {
        PetDog petDog = new PetDog();
        petDog.Study(10);
    }
  }
  • 通过set方法进行初始化。set方法和普通成员方法一样,只不过名字特殊了一些。

三、封装

面向对象的三大特性:继承,封装,多态。我们在这里首先来讲讲封装。封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和一些操作细节,仅对外公开接口。
Java中主要通过类和访问限定修饰符来进行封装。类可以将数据和操作数据的方法放在一起,而限定修饰符则用来控制是否能被别人看到。
在这里插入图片描述

  • default表示当什么都不写的时候。
  • 访问权限既可以控制类还可以控制成员变量,成员方法。
  • 一般情况下,将成员变量属性设置为private,成员方法设置为public

在这里包有什么意思呢?并不是我们女生喜欢买的那个包包哦。简单来说,包呢,我们可以理解为创建的文件夹。我们都会将电脑中的内容进行分类,创建不同的文件夹。包的概念也就由此产生了。为了更好的管理类,把多个类收集在一起成为一组,称为软件包。

  1. 我们可以有相同名称的类,但必须得在不同的包中。
  2. Java中为我们提供了很多现成的包,我们使用的时候,需要导入包中相关的类
//比方说:
import java.util.Date
  1. 我们也可以导入包中所有类
import java.util.*
  1. 我们也可以导入静态方法和字段
import static java.util.*
  • 我们也可以定义自己的包,在我们编写的文件上添加package。或者我们在src下面先创建好包,再创建java文件,计算机会自动添加package语句。(若直接在src上创建java文件,代码不会自动有package语句,因为创建在了src下)

常见的包

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

四、关于static

在前面我们就谈到过成员变量有静态成员变量和普通成员变量,静态成员方法和普通成员方法。被static修饰的并不属于某个对象,而属于类,所有对象共享的。

  • 对于静态成员变量,其并不属于某个对象,而是属于类。所以并不存储到某个对象的空间内。
  • 访问的类变量或者类方法的时候,可以通过类名直接访问,也可通过对象来访问。建议通过类名访问。
  • 类变量存储到方法区中。
  • 类变量的生命周期是伴随类的一生。
  • 类方法中不可以访问任何非静态成员。
  • 类方法中不可以调用非静态成员方法。

初始化

  • 可以就地初始化
  • 通过静态代码块初始化

五、代码块

使用{}定义的一段代码称为代码块。代码块可以分为四种:普通代码块,静态代码块,构造块,同步代码块(这个后面在描述)。

  • 普通代码块:定义在方法中的代码块
    public static void main(String[] args) {
        {
            int a = 1;
        }
        int b = 2;
    }
  • 构造代码块(实例代码块):定义在类中的代码块,一般用于初始化成员变量。
class Student {
    private int num;
    private String name;
    {
        this.name = "加油";
        this.num = 100;
    }
}
  • 静态代码块:用static修饰的代码块称为静态代码块,用于初始化静态成员变量
    private static int age;
    static {
        age = 18; 
    }
  1. 静态代码块只会执行一次,不管生成了多少对象。
  2. 静态成员变量是类的属性,是在JVM加载类时开辟空间并初始化的。
  3. 如果一个代码块中有多个同种类型的代码块,则会将其合并,并按照代码先后顺序依次执行。
  4. 实例代码块只有在创建对象的时候才会产生。
  5. 执行顺序
    静态代码块先执行,再执行构造代码块,再执行对应的构造方法。

六、对象的打印–toString

Java中给我们提供了一个toString方法,打印的东西是人家编写的,如果我们直接调用,则输出的并不是我们想要的,我们需要在对应类中重写toString方法,然后我们在别的地方调用这个类中toString方法才是我们想要的。

public class Person {
String name;
String gender;
int age;
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
@Override
public String toString() {
return "[" + name + "," + gender + "," + age + "]";
//重写toString我们只需要更改return后面的内容就行。
}
public static void main(String[] args) {
Person person = new Person("Jim","男", 18);
System.out.println(person);
}
}

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

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

相关文章

HomeServer平台选择,介绍常用功能

​​ 平台选择 HomeServer 的性能要求不高,以下是我的硬件参数,可供参考: ‍ 硬件: 平台:旧笔记本CPU:i5 4210u内存 8G硬盘:128G 固态做系统盘,1T1T 机械盘组 RAID1 做存储。硬…

计算机网络-七层协议栈介绍

之前介绍了网络世界的构成,从宏观角度介绍了网络设备和网络架构,链接: link,但是这种认识过于粗糙,过于肤浅。网络本质上是用于主机之间的通信,是端对端的连接通信,两台计算机可能距离很远,主机…

新书推荐:《码农职场:IT 人求职就业手册》——照亮你的职业道路

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PHP中关于排名和显示的问题

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

【LLM】五、open-webui+ollama搭建自己的RAG服务

系列文章目录 往期文章回顾: 【LLM】四、RAG简介 【LLM】三、open-webuiollama搭建自己的聊天机器人 【LLM】二、python调用本地的ollama部署的大模型 【LLM】一、利用ollama本地部署大模型 文章目录 ​​​​​​​ 目录 系列文章目录 文章目录 前言 一、RAG是…

计算机网络必会面经

1.键入网址到网页显示,期间发生了什么 2.在TCP/IP网络模型中。TCP将数据进行分段后,为什么还需要IP层继续分片 3.详细说明tcp三次握手,为什么是三次,若每次握手丢了,解决办法是什么 4.详细说明tcp四次挥手&#xff…

基于Docker搭建ELK

目录 1.系统操作 2.搭建es 3.kibana(新起终端跟es一起启动) 4.logstash(新起终端和es一起启动) 5.修改logstash配置文件 6. 创建索引 7. exit #退出容器 8. 在logstash节点插入数据,测试是否能拿取到(下面如果本身有数据…

前端如何实现更换项目主题色的功能?

1、场景 有一个换主题色的功能,如下图: 切换颜色后,将对页面所有部分的色值进行重新设置,符合最新的主题色。 2、实现思路 因为色值比较灵活,可以任意选取,所以最好的实现方式是,根据设置的…

springboot文献检索系统-计算机毕业设计源码48521

摘要 文献检索系统主要功能模块包括用户管理、公告信息、新闻资讯、文献信息等,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的…

[Git场景]常用工作场景演练

场景1:开发到一半的代码,还没提交,git拉下 对方的代码,但是其中有一个 commit 不想要怎么做 在 Git 中,如果你想拉取远程分支的代码,但不想要某个特定的提交,可以使用以下方法来解决: 方法1&a…

【Python】pandas:排序、重复值、缺省值处理、合并、分组

pandas是Python的扩展库(第三方库),为Python编程语言提供 高性能、易于使用的数据结构和数据分析工具。 pandas官方文档:User Guide — pandas 2.2.2 documentation (pydata.org) 帮助:可使用help(...)查看函数说明文…

Linux基于centOS7 【进度条】【Git】【gdb】学习

目录 进度条 进度条的前置准备 sleep (秒)& usleep(微秒) sleep加\n和不加\n的区别 IO函数的缓冲区 回车&换行 10秒倒计时 进度条编写 git的使用 为什么要有git(git版本控制器) git的主要…

外卖项目day10---缓存商品/Spring Cache初学、购物车功能

缓存菜品,只需要在DishController中修改一下代码即可 /*** 菜品管理*/ RestController RequestMapping("/admin/dish") Api(tags "菜品相关接口") Slf4j public class DishController {Autowiredprivate DishService dishService;Autowiredpri…

【排序算法】Java实现三大非比较排序:计数排序、桶排序、基数排序

非比较排序概念 非比较排序是一种排序算法,它不通过比较元素之间的大小关系来进行排序,而是基于元素的特征或属性进行排序。这种方法在特定情况下可以比比较排序方法(如快速排序、归并排序等)更有效率,尤其是在处理大…

时间序列分析方法之 -- 长短期记忆网络(LSTM)原理及Python代码示例

目录 原理 适用情况 Python示例代码 结论 原理 长短期记忆网络(LSTM,Long Short-Term Memory Networks)是一种特殊的递归神经网络(RNN),设计用于克服传统RNN在处理长序列数据时的梯度消失和梯度爆炸问…

如何在基于滤波框架的绝对定位系统中融合相对观测

文章目录 1 LIO、VIO propagation来代替IMU propagation2 TRO paper: Stochastic Cloning Kalman filter【有待填坑】 以无人驾驶定位系统为例,融合gnss,imu,轮速,camera LaneMatch(frame to map),lidar scan match(fr…

Qgis 插件升级:3.28到3.34

1、下载 osgeo4w-setup 安装包 下载 获取 osgeo4w-setup.exe 的安装软件,每次下一步就可以了,安装位置可以自己调整 osgeo4w:https://download.osgeo.org/osgeo4w/osgeo4w-setup.exe 2、安装3.34 开发包 搜索qigs,将 desktop,…

开始使用OKR创建注重结果的文化

亚马逊对客户很痴迷。Facebook 行动迅速。成功企业的文化是传说中的东西,而且是正确的。正如管理顾问的名言:文化把战略当早餐吃。 无论行业或规模如何,文化的主要目标是激发企业获胜所需的行为。越来越多的成功要求企业关注结果而非任务&am…

Kafka的入门及简单使用

文章目录 前言一、Kafka 的基本架构?1. Producer(生产者)2. Broker(代理/服务器)3. Consumer(消费者)4. Consumer Group(消费者组)5. Topic(主题)…

docker前端部署

挂载,把自己的目录位置,挂载到容器内的HTML