当前位置: 首页 > news >正文

JAVA语法基础 day05-面向对象

一、面向对象基本概念

/*
面向对象编程的步骤:
1.先设计对象的模板,也就是一个类class
生成一个新类的语句是:public class 类名,就跟python中class 类名一样
2.通过new关键字生成具体的对象,每new一次代表创建了的一个新的对象*//*
跟python相似,java里的类也可以定义类方法
属性定义完后,定义方法*/
public class Student{String name;int age;double height;double weight;double math_grade;double english_grade;public void showAllGrade(){System.out.println(name + "的总成绩是" + (math_grade + english_grade));}
}
/*
这里有点像python中的init方法,指明类的属性有哪些。
但是不用xiangpython那样,self.name = name,java中指明有name就行了
即 String name*/

类定义好了之后,再新建一个文件,创建具体的对象

/*
这个demo用于创建Student类下的一个具体对象
创建对象的语法:
类名 对象名 =new 类名();*/
public class Demo {public static void main(String[] args) {// 这里跟python有点像,通过 对象名.属性 的方式给对象初始化Student XiaoMing = new Student();XiaoMing.name = "小明";XiaoMing.age = 18;XiaoMing.height = 175.0;XiaoMing.weight = 74.3;XiaoMing.english_grade = 144;XiaoMing.math_grade = 125.5;System.out.println("小明的总成绩是" + (XiaoMing.math_grade + XiaoMing.english_grade));System.out.println("----------------");XiaoMing.showAllGrade(); //直接调用类方法,跟在对象里调用一样的}}

二、对象到底是什么

对象实质上是一个数据结构,jvm里有栈内存,堆内存和方法区,

对象名(XiaoMing)存在栈里,是一个地址,这个地址指向一个具体的对象,对象的属性存在堆里,对象的方法存在方法区里。

执行一个,从栈中弹出一个,直至结束,栈清空。

三、类的基本语法

类的语法,是为了更好的设计出类

3.1构造器

构造器是一种特殊方法,没有返回值,名称必须跟类名一致。

构造器可以有参数,也可以没有参数,构造器可以重载。

它的语法如下:

public class Student {public Student() {}
}
// 构造器就是类里的一个特殊方法
//构造器的常见应用场景:在创建对象时,同时完成对象属性的初始化赋值,有点像init方法
//如此一来,创建对象时,传入相应参数即可,跟python的类创建一样了
public class Student {int age;String name;String gender;public Student() {//这是一个无参构造器System.out.println("Student Constructor");}public Student(int age , String name , String gender) { // 有参数构造器age = age;name = name;gender = gender;System.out.println("年龄:" + age);}}

demo:

public class Demo {public static void main(String[] args) {test();}public static void test() {Student s1 = new Student(); //创建对象时,会立即调用构造器Student s2 = new Student(18,"小明","男");}
}

tips:

定义一个类时,就默认有了一个无参数构造器,定义了有参构造器后,无参构造器就没有了。

此时若还想再用无参构造器,就必须自己显式的定义一个出来。

有参构造器,可以使java像python那样新建一个对象,即:类名(参数列表),直接就把对象创建好了,参数列表中为对象的各个属性。

而如果使用无参构造器,就必须通过 “ 类名 对象名 = new 类名()"来创建一个对象,创建后再

"对象名.属性  = 多少"的方式,去初始化对象的各个属性。

因此实际中无参构造器和有参构造器一般都同时创建或都不创建。

3.2 this关键字

This就是一个变量,用在方法中,用来拿到当前对象。

创建一个新的类:

public class Teacher {String name;public void print(){//this 是一个变量,用于拿到当前对象的地址,哪个对象调用这个方法,this就拿到哪个对象System.out.println(this);//把this 打印出来,发现其是一个地址System.out.println(this.name);}public void printFavoriteSong(String name){ //设计一个方法,打印老师最喜欢的歌曲名字/* System.out.println(name + "最喜欢的歌名是" + name); 
这就导致冲突了,输出的是“歌名 最喜欢的歌名是 歌名” */System.out.println(this.name + "最喜欢的歌名是" + name);}
}

生成一个对象:

public class Teacher {String name;public void print(){//this 是一个变量,用于拿到当前对象的地址,哪个对象调用这个方法,this就拿到哪个对象System.out.println(this);//把this 打印出来,发现其是一个地址System.out.println(this.name);}
}

This的作用:解决变量名称冲突的问题,用this来指代对象,this.属性就是拿到对象的各种属性

回过头再审视一下3.2中有参构造器的写法,发现上面那么写其实是导致了变量名冲突的,因此改进如下

public class Student {int age;String name;String gender;public Student() {//这是一个无参构造器System.out.println("Student Constructor");}public Student(int age , String name , String gender) { // 有参数构造器this.age = age;this.name = name;this.gender = gender;System.out.println("年龄:" + this.age);}}

这就越来越像python了,有参数构造器就是init方法,this就是self,python里初始化都是self.name = name , java 里就是 this.name = name。(当然,这并不严谨)

对象的变量叫做成员变量(比如Teacher类的名字),方法中的变量叫做局部变量。

3.3封装

面向对象的三大特征:封装,多态,继承

封装要求我们合理隐藏,合理暴露。如下所示

/*
1.如何隐藏?
使用private关键字来修饰成员变量,令其只能在本类中被直接访问
其他任何地方无法访问,也就是在外部不能用 对象名. 的方式去修改*/
public class Student {private String name;private int age;
/*
2.如何暴露?
龟腚:
使用public修饰的set和get方法,来对成员变量赋值和取值,这是公开的方法
所谓公开,就是任何地方可以访问*/public void setName(String name){this.name = name;}public void setAge(int age){if (age > 0 & age < 200){this.age = age;}else{System.out.println("请输入正确的年龄!");}}public String getName(){return name;}public int getAge(){return age;}
}
public class Test {public static void main(String[] args) {Student s1 = new Student();s1.setAge(150);s1.setName("Ronnie");System.out.println(s1.getName());System.out.println(s1.getAge());}
}

从今往后,都要按这种习惯写代码!

成员变量私有化,不让直接赋值,而是通过设计公开的赋值取值方法,来赋值和取值

3.4JavaBean实体类

什么是实体类?满足以下两个要求的就是实体类:

第一,类中的成员变量全部私有,并且提供公开的set和get方法

第二,类中必须提供一个无参构造器,有参构造器可选

生成一个实体类:

//实体类,可以提供有参数构造器
public class Student {//1.私有化成员变量private String name;private int age;private double math;//提供一个无参构造器:必须public Student() {}//提供一个有参构造器:可选public Student(double math, int age, String name) {this.math = math;this.age = age;this.name = name;}/*2.提供公开的set 和 get 方法,事实上右键-generate 可以自动生成*/public double getMath() {return math;}public void setMath(double math) {this.math = math;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

实体类的作用:

实体类只负责数据的存取,而业务的其他需求,由其他的类的对象来实现,从而实现数据存取和业务处理的分离。

public class StudentOperator {//必须要拿到待操作的学生对象private Student s; // 定义了一个变量s,类型是Student,用来记住等会要操作的成员变量public StudentOperator(Student s) { //StudentOperator的有参构造器 ,this.s = s;}public void printTotalGrade() {System.out.println("总成绩是" + (s.getMath() + s.getEnglish()));}}
public class StudentOperator {//必须要拿到待操作的学生对象private Student s; // 定义了一个变量s,类型是Student,用来记住等会要操作的成员变量public StudentOperator(Student s) { //StudentOperator的有参构造器 ,this.s = s;}public void printTotalGrade() {System.out.println("总成绩是" + (s.getMath() + s.getEnglish()));}}
public class Test {public static void main(String[] args) {Student s1 = new Student(89.0,18,"张三",144);System.out.println(s1.getName());System.out.println(s1.getAge());System.out.println("=====================");//创建一个学生的操作对象,专门用来完成需求StudentOperator s1_op = new StudentOperator(s1);s1_op.printTotalGrade();}
}

相关文章:

JAVA语法基础 day05-面向对象

一、面向对象基本概念 /* 面向对象编程的步骤&#xff1a; 1.先设计对象的模板&#xff0c;也就是一个类class 生成一个新类的语句是&#xff1a;public class 类名,就跟python中class 类名一样 2.通过new关键字生成具体的对象&#xff0c;每new一次代表创建了的一个新的对象*…...

关于RabbitMQ重复消费的解决方案

一、产生原因 RabbitMQ在多种情况下可能会出现消息的重复消费。这些情况主要包括以下几个方面&#xff1a; 1. 网络问题 网络波动或中断&#xff1a;在消息处理过程中&#xff0c;由于网络波动或中断&#xff0c;消费者向RabbitMQ返回的确认消息&#xff08;ack&#xff09;…...

【SSM-Day2】第一个SpringBoot项目

运行本篇中的代码&#xff1a;idea专业版或者idea社区版本&#xff08;2021.1~2022.1.4&#xff09;->这个版本主要是匹配插件spring boot Helper的免费版(衰) 【SSM-Day2】第一个SpringBoot项目 框架->Spring家族框架快速上手Spring BootSpring Boot的作用通过idea创建S…...

【PyTorch】张量操作与线性回归

张量的操作 Tensor Operation 拼接与切分 1.1 torch.cat() torch.cat(tensors, dim0, outNone)功能&#xff1a;将张量按维度dim进行拼接 tensors&#xff1a;张量序列dim&#xff1a;要拼接的维度 1.2 torch.stacok() torch.stack(tensors, dim0, outNone)功能&#xf…...

情感类智能体——你的微信女神

智能体名称&#xff1a;你的微信女神 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/agent/preview/RulbsUjIGj4wsinydlBH7AR3NQKFungt 简介 “你的微信女神”是一个直率的智能体&#xff0c;她用犀利而真实的言辞帮助用户…...

基于SpringBoot+Vue+MySQL的养老院管理系统

系统展示 管理员界面 家属界面 系统背景 随着全球人口老龄化的加速&#xff0c;养老院管理面临着前所未有的挑战。传统管理方式存在信息不透明、效率低下、资源分配不均等问题&#xff0c;难以满足日益增长的养老服务需求。因此&#xff0c;开发一套智能化、高效的养老院管理系…...

大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍

文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、​​​​​​​语法结构 三、​​​​​​​​​​​​​​WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器&#xff0c;其作为源表时&#xff0c;扮演的就是flink cdc的角色。 一、特色功能 MySQ…...

FutureTask源码分析

Thread类的run方法返回值类型是void&#xff0c;因此我们无法直接通过Thread类获取线程执行结果。如果要获取线程执行结果就需要使用FutureTask。用法如下&#xff1a; class CallableImpl implements Callable{Overridepublic Object call() throws Exception {//do somethin…...

Highcharts甘特图基本用法(highcharts-gantt.js)

参考官方文档&#xff1a; https://www.highcharts.com/docs/gantt/getting-started-gantt https://www.highcharts.com/demo/gantt/project-management https://www.hcharts.cn/demo/gantt 链接在下面按需引入 https://code.highcharts.com/gantt/highcharts-gantt.js htt…...

【Linux庖丁解牛】—Linux基本指令(上)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a; Linux庖丁解牛 &#x1f516;克心守己&#xff0c;律己则安 目录 1、 pwd命令 2、ls 指令 3、cd 指令 4、Linux下的根目录 5、touch指令 6、 stat指令 7、mkdi…...

node.js 中的进程和线程工作原理

本文所有的代码均基于 node.js 14 LTS 版本分析 概念 进程是对正在运行中的程序的一个抽象&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;操作系统的其他所有内容都是围绕着进程展开的 线程是操作系统能够进行运算调度的最小单位&#xff0c;其是进程中的一个执…...

Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)

发布版本链接 通过百度网盘分享的文件&#xff1a;TCP调试助手V1.zip&#xff08;含客户端与服务器&#xff09; 链接&#xff1a;https://pan.baidu.com/s/14LTRPChPhYdwp_s6KeyBiA?pwdcedu 提取码&#xff1a;cedu 基于Qt/C实现了一款功能丰富的TCP服务器与客户端调试助手…...

DNS解析流程

DNS解析流程&#xff1a; 浏览器DNS缓存&#xff1a; 当我们在浏览器中访问某个域名时&#xff0c;浏览器首先会检查自己内部的DNS缓存&#xff0c;看是否有该域名的对应IP地址。如果有&#xff0c;直接使用缓存中的IP地址&#xff0c;跳过后续步骤。 本地系统DNS缓存&#xf…...

[PTA]7-1 藏头诗

[PTA]7-1 藏头诗 本题要求编写一个解密藏头诗的程序。 注&#xff1a;在 2022 年 7 月 14 日 16 点 50 分以后&#xff0c;该题数据修改为 UTF-8 编码。 输入格式&#xff1a; 输入为一首中文藏头诗&#xff0c;一共四句&#xff0c;每句一行。注意&#xff1a;一个汉字占三…...

每日OJ题_牛客_WY22 Fibonacci数列(斐波那契)

目录 牛客_WY22 Fibonacci数列&#xff08;斐波那契&#xff09; 解析代码 牛客_WY22 Fibonacci数列&#xff08;斐波那契&#xff09; Fibonacci数列_牛客题霸_牛客网 解析代码 求斐波那契数列的过程中&#xff0c;判断⼀下&#xff1a;何时 n 会在两个 fib 数之间。 #in…...

SQL 查询语句汇总

在软件开发和数据分析中&#xff0c;SQL&#xff08;结构化查询语言&#xff09;是与数据库交互的重要工具。为了更好地理解 SQL 查询语句的使用&#xff0c;本文将设计一个简单的数据库&#xff0c;包括几张表&#xff0c;并通过这些表展示各种 SQL 查询的应用。 一、背景信息…...

封装一个语言识别文字的方法

语音识别 需求&#xff1a; 参考官方文档&#xff0c;整合语音识别apicallback 的写法改为 Promise 的版本 在startRecord中&#xff1a; 参考文档实例化-开启转换将录制的内容传递给录音识别回调函数中的 Log&#xff0c;改为 Logger 在closeRecord&#xff1a; 结束识别…...

解决 iOS App Tracking Transparency 权限问题

解决 iOS App Tracking Transparency 权限问题 在 iOS 14 及更高版本中&#xff0c;Apple 引入了 App Tracking Transparency (ATT) 框架&#xff0c;要求应用在跟踪用户之前必须获得用户的明确许可。这通常涉及到访问用户的广告标识符&#xff08;IDFA&#xff09;。如果没有…...

ClickHouse 的底层架构和原理

ClickHouse 是一个用于实时分析和处理大规模数据的列式数据库&#xff0c;其设计目标是高效地处理海量数据的查询需求。它特别适合 OLAP&#xff08;Online Analytical Processing&#xff09;场景&#xff0c;能够在不依赖复杂的索引结构的情况下&#xff0c;实现极快的查询速…...

rtmp推流

获取摄像头名称 打开命令行工具&#xff0c;运行以下命令以列出所有可用的视频设备&#xff1a; ffmpeg -f dshow -list_devices true -i dummy查找输出中的“Video devices”部分&#xff0c;记录下你的摄像头名称。 构建推流命令 ffmpeg -f dshow -i video"摄像头名称…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...