面向对象的学习

news/2024/4/27 17:48:27/文章来源:https://blog.csdn.net/2301_80454352/article/details/137061024

封装

//用来描述一类事物的类,专业叫做:javabean类
//在javabean类是不写main方法的//一个java文件中可以定义多个类,且只能一个类是public修饰,而且public修饰的类名必须成为代码的文件名
://在类中一般无需指定初始化值 存在默认值//引用数据类型:类,接口,数组,String 初始化是NULLd//类名的首字母建议大写,驼峰

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

例子:门关门,圆画圆

封装的好处:有很多可以现成的已经封装的类,我们可以直接调用这些现成的类,可以极大方便与我们编写代码

Private关键字

  1. 是一个权限修饰符
  2. 可以修饰成员
  3. 被private修饰的成员只能早本类中才能访问

格式化代码:ctrl + alt + l  (注意需要关闭QQ,才能进行这个操作)

对于私有属性的成员变量往往需要一个set和get搭配使用才能对私有属性的变量进行赋值

下面是一个具体例子:
自己定义一个类(女朋友类型):

public class GirlFriend {//属性private String name;private int age;private String gender;//针对每一个私有变量,都需要提供get和set方法//set方法给成员赋值//get对外提供成员变量的值//作用:给成员变量name赋值public void setName(String n){name = n;}//作用对外提供方属性public String getName(){return name;}//age//setage:给成员变量age进行赋值的//getage对外提供成员变量age的值public void setAge(int a) {if (a >= 18 && a <= 50) {age = a;} else {System.out.println("非法数据\n");}}//get(获取)public int getAge() {return age;}//genderpublic void setGender(String g){gender = g;}public String getGender(){return gender;}}

女朋友类型的TEXT:

public class GirlFrindText {public static void main(String[] args) {//创建女朋友GirlFriend gfl = new GirlFriend();//赋值操作gfl.setName("郑美玲");gfl.setAge(18);gfl.setGender("女");System.out.println(gfl.getName());System.out.println(gfl.getAge());System.out.println(gfl.getGender());}
}

不难发现对于私有私有类型的成员变量我们需要使用类里面的方法进行赋值和得到答案

所以就需要set(赋值)和get(提供值)搭配使用

小结:

1.private关键字是一个权限修饰符

2.可以修饰成员变量

3.被private修饰的成员只能在本类中才能访问

4.针对private修饰的成员变量,如果需要被其他使用,需要提供相应的操作(set和get搭配使用)

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

6.提供”getXxx(参数)”方法,用于获取成员变量的值,方法使用public修饰

this关键字

成员变量和局部变量

如果我们把变量定义在方法里面 那么这个变量就叫做局部变量

如果我们把变量定义在类里面 那么这个就叫做成员变量

如下面这个:

public class GirlFrind{private int age;//成员变量public void method(){int age = 10;//局部变量System.out.println(age);}
}

这个代码并没有错误:这里的age的值究竟取决于谁呢? 这里讲究一个就近原则,打印的这个age谁离它近 那么这个age就是谁的值,很显然这个age离局部变量age = 10更近,所以这个age的值就是10

如果我就是想要打印成员变量的值 那么我们就需要在打印语句中加上this.age  这个时候打印的就是成员变量的值(后面会讲this在内存中的储存方式

public class GirlFrind{private int age;//成员变量public void method(){int age = 10;//局部变量System.out.println(this.age);}
}

下面这个是使用了this关键字进行的操作:

public void setAge(int age) {if (age >= 18 && age <= 50) {this.age = age;} else {System.out.println("非法数据\n");}
}

这个是将我们接受到的值赋给成员变量age。

小结:1.就近原则

System.out.println(age);

System.out.println(this.age);

构造方法

作用:在创建对象的时候给成员变量初始化的操作。

特点:

  1. 方法名和类名相同,大小写一致
  2. 没有返回值类型
  3. 没有具体得返回值(不能有return 带回结构数据)

执行时机:

  1. 创建对象得时候由虚拟机调用,不能手动调用构造方法
  2. 每创建一次对象,就会使用一次构造方法

犯下的错误:对于set类函数我们使用这个方法的时候必须要使这个方法的类型为void \

然后我们使用get类函数我们需要将这个方法的类型设置为变量自己的类型

System.out.println(stu1.setAge(19));

这个输出函数里面的类型是void类型,我竟然将这个函数里面的直接放在了输出函数里面了
 

当我们没有构造方法的时候系统会自动给我们初始化一个构造方法(这个构造方法没有含有任何的参数和变量)

 当我们定义了构造方法,系统将不再提供默认的构造方法

当我们将自定义的无参构造的构造方法给注释掉后,然后再在主类中的main的参数去掉后,就会发现程序已经报错了,所以当我们当我们定义了构造方法,系统将不再提供默认的构造方法。   所以这个我们自己定义一个无参构造是很有必要的。

构造方法的重载:

带参构造方法,和无参构造方法,两者方法名相同,但是参数不同,这就叫做构造方法的重载  (有点类似与C++里面的sort函数可以含多个变量)

推荐使用方法:

无论是否使用,都手动书写参数构造方法,和带全部参数的构造方法

小结:

  1. 创建对象的时候,由虚拟机自动调用,给成员变量进行初始化的
  2. 无参的构造方法:初始化对象的时候,成员的数据均采用默认值
    有参的构造方法:在初始化对象的时候,可以为对象进行赋值
  3. 任何类定义出来,默认就自带了无参构造器,写不写都有

 

标准的javabean类

用来描述一类事物的类,专业叫做:javabean
1.类名需要见民知意

2.成员变量需要使用private修饰

3.提供至少两个构造方法:第一个无参构造方法,第二个有参构造方法

4.成员方法:提供每一个成员变量对应的setXxx(),getXxx()  如还有其他行为也要写上

除此之外我们可以使用两个快捷方式生成标准的javabean

第一个就是

第一个就是:alt + insert
或者:alt + fn + insert

除了这个我们还可以使用一个插件自动生成标准的javabean,只需要在鼠标右键进行选择就可以了 或者是alt + shift + ' .'  这个样也可以生成一个标准的javabean

对象储存图

Java内存分配:1.栈  2.堆  3.方法区  4.本地方法区  5.寄存器

一个对象的内存图:就以student s = new Student();为例

电脑会做这些事情:

  1. 加载class文件
  2. 申明局部变量
  3. 在堆内存中开辟一个空间
  4. 默认初始化
  5. 显示初始化
  6. 构造方法初始化
  7. 将堆内存中的地址赋给左边的局部变量

     

 

我们需要知道的是:当有new这个关键字时,就意味着在堆内存中开辟了一块内存,这个内存会从方法区提取相关的模板然后并在相依的地址(名字)+ ‘.’地址所指向的属性(也就是具体的数据)   所以我们可以总结出一点就是每当我们看到一个new的时候就代表会在对区域开辟一个全新的空间(这也就意味这有几个对象)

变量名(相当于是一个地址):会被储存在栈内存中,当代码运行到这一行的时候,电脑就会循着地址在堆中找到相应的属性(具体数据)

 

可以看到这个代码只出现了一次new就说明了只有一个对象的内存被存放到了堆内存,而

Student stu2 = stu1    stu2和stu1都是指向了一个堆内存,当我们将stu1 赋值为NULL,这个时候stu1什么都不会指向,stu1就成为垃圾。

 基本数据类型和引用数据类型

基本数据类型:在变量存储的是真实的变量值,存储在栈内存

而引用数据类型在栈内存中存储的是一个地址值,真正的值是存放在堆内存中

如Student s = new Student();这个s就是引用数据类型(使用其他空间的数据)

数组也是一个引用数据类型。

 

基本数据类型:数据值是存贮在自己的空间中
特点;赋值给其他变量,也是赋得真实得值

引用数据类型;数据值是贮存在其他空间,通过调用地址来获取值。

This的内存原理:

This的本质:代表所在方法调用者的地址值,且这个储存在栈内存中

其作用:就是区分局部变量和成员变量的

成员变量:类中方法外的变量

局部变量:方法中的变量

 

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

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

相关文章

智慧光伏:企业无纸化办公

随着科技的快速发展&#xff0c;光伏技术不仅成为推动绿色能源革命的重要力量&#xff0c;更在企业办公环境中扮演起引领无纸化办公的重要角色。智慧光伏不仅为企业提供了清洁、可持续的能源&#xff0c;更通过智能化的管理方式&#xff0c;推动企业向无纸化办公转型&#xff0…

鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比(2)

askPool运作机制 图1 TaskPool运作机制示意图 TaskPool支持开发者在主线程封装任务抛给任务队列&#xff0c;系统选择合适的工作线程&#xff0c;进行任务的分发及执行&#xff0c;再将结果返回给主线程。接口直观易用&#xff0c;支持任务的执行、取消。工作线程数量上限为4。…

基于Python实现多功能翻译助手(下)

为了将上述步骤中的功能增强与扩展具体化为代码&#xff0c;我们将实现翻译历史记录功能、翻译选项配置以及UI的改进。 翻译历史记录功能 import json # 假设有一个用于存储历史记录的json文件 HISTORY_FILE translation_history.json # 初始化历史记录列表 translati…

Element-Plus下拉菜单边框去除教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

python中函数那点事

1.求一个十进制的数值的二进制的0、1的个数 。 2.实现一个用户管理系统(要求使用容器保存数据)[{name: xxx, pass: xxx, ... ... },{},{}] 3.求1~100之间不能被3整除的数之和 4.给定一个正整数N,找出1到N(含)之间所有质数的总和 5.计算PI(公式如下:PI4(1-1/31/5-1/71/9-1......…

简单了解原型模式

什么是原型模式 区别于单例模式&#xff0c;原型模式的一个类可以有多个实例化的对象。 原型模式通过拷贝来产生新的对象&#xff0c;而不是new&#xff0c;并且可以根据自己的需求修改对象的属性。 实现Cloneable接口实现拷贝 而拷贝又分为浅拷贝和深拷贝&#xff0c;两者在…

Codigger开发者篇:开启全新的开发体验(二)

在数字化浪潮中&#xff0c;开发者们始终在追求更加高效、便捷的开发工具与环境。Codigger&#xff0c;作为新一代开发、运营、使用私人应用的分布式操作系统&#xff0c;正是为这些追求者们量身打造的利器&#xff0c;Codigger是一个跨时代的颠覆式的创新。今天&#xff0c;我…

【python】flask执行上下文context,请求上下文和应用上下文原理解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE&#xff1a;java runtime environment JDK包含JRE java跨平台&#xff1a;因为java程序运行依赖虚拟机&#xff0c;虚拟机需要有对应操作系统的版本&#xff0c;而jre中有虚拟机。 当你想要在Linux系统下运行&#xff0c;则需要…

硅谷甄选项目笔记

硅谷甄选运营平台 此次教学课程为硅谷甄选运营平台项目,包含运营平台项目模板从0到1开发&#xff0c;以及数据大屏幕、权限等业务。 此次教学课程涉及到技术栈包含***:vue3TypeScriptvue-routerpiniaelement-plusaxiosecharts***等技术栈。 一、vue3组件通信方式 通信仓库地…

华为ensp中vrrp虚拟路由器冗余协议 原理及配置命令

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言————— VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议&#xff0…

9.HelloWorld案例常见问题

文章目录 一、BUG二、BUG的解决三、HelloWorld常见问题 一、BUG BUG&#xff08;小甲虫&#xff09;。计算机刚开始出现的时候&#xff0c;因为体积比较大&#xff0c;一些小虫子很容易转进去。有一天有一只蟑螂钻到了计算机当中&#xff0c;从而导致计算机不能正常运行&#…

SQLiteC/C++接口详细介绍sqlite3_stmt类(八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;九&#xff09; 27、sqlite3_column_int 函数 sqlite3_column_int 用于返…

[Flutter] Flutter多环境版本管理器Puro, 可是试试替换Fvm了

flutter2/3版本切换,除了fvm,还可以看看puro Puro官网 Mac安装方式 curl -o- https://puro.dev/install.sh | PURO_VERSION"1.4.5" bash因为puro安装flutter需要依赖git, 请确保mac支持git命令行 brew install git快速开始 先看效果 1.创建flutter环境 这里的…

Bayes-RF,基于贝叶斯Bayes优化算法优化随机森林RF数据回归预测(多输入单输出)-MATLAB实现

Bayesian optimization 是一种用于调节机器学习模型超参数的方法&#xff0c;而随机森林 (Random Forest, RF) 是一种强大的机器学习算法&#xff0c;常用于回归和分类任务。将它们结合起来可以提高模型性能&#xff0c;这就是 Bayes-RF 的基本思想。 下面是一个基于贝叶斯优化…

基于双vip+GTID的半同步主从复制集群项目(MySQL集群)

项目标题&#xff1a;基于keepalivedGTID的半同步主从复制MySQL集群 准备七台机器&#xff0c;其中有四台时MySQL服务器&#xff0c;搭建主从复制的集群&#xff0c;一个master&#xff0c;2个slave服务器&#xff0c;一个延迟备份服务器。同时延迟备份服务器也可以充当异地备…

Linux的介绍以及其发展历史

文章目录 前言一、技术是推动社会发展的基本动力1.人为什么能成为万物之长呢&#xff1f;2.人为什么要发明工具&#xff0c;进行进化呢&#xff1f;3.人是如何发明工具的&#xff1f;4.为什么要有不同的岗位和行业&#xff1f; 二、计算机(操作系统)发展的基本脉络1.第一台计算…

Java安全 反序列化(4) CC1链-LazyMap版

Java安全 反序列化(4) CC1链-LazyMap版 实验环境:存在漏洞的版本 commons-collections3.1-3.2.1 jdk 8u71之后已修复不可利⽤ 文章目录 Java安全 反序列化(4) CC1链-LazyMap版一.跟踪挖掘CC1_LazyMap原理二.完整CC1_Lazy版Poc 接着上一篇文章我们通过ChainedTransFormer实现任意…

面试算法-122-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {return dfs(…

在面对API的安全风险,WAAP全站防护能做到哪些?

随着数字化转型的加速&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为企业间和企业内部系统交互的核心组件。在应用程序开发过程中&#xff0c;API能够在不引起用户注意的情况下&#xff0c;无缝、流畅地完成各种任务。例如从一个应用程序中提取所需数据并传递给…