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();}
}

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

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

相关文章

俄罗斯OZON新生儿产品好不好卖,OZON新生儿产品

Top1 遥控水球坦克 Танк на радиоуправлении стреляющий орбизами PANAWEALTH 商品id&#xff1a;1384249985 月销量&#xff1a;692 欢迎各位OZON卖家朋友点击这里选品&#xff1a; &#x1f449; D。DDqbt。COm/74rD 遥控射击水…

Java中Set的巧妙用法---查找重复元素/去重/排序

目录 1. Set特性&#xff1a; 3. TreeSet 3.1定制排序&#xff08;比较器排序&#xff09; 3.2自然排序&#xff1a; 4. LinkedHashSet 在日常开发中不可避免会遇到需要去重&#xff0c;或者查找重复元素&#xff0c;下面给介绍一种效率比较高的方法&#xff0c;时间复杂度…

Git使用教程-将idea本地文件配置到gitte上的保姆级别教程

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

weblogic CVE-2018-2894 靶场攻略

漏洞描述 Weblogic Web Service Test Page中⼀处任意⽂件上传漏洞&#xff0c;Web Service Test Page 在 "⽣产模式"下默认不开启&#xff0c;所以该漏洞有⼀定限制。 漏洞版本 weblogic 10.3.6.0 weblogic 12.1.3.0 weblogic 12.2.1.2 28 weblogic 12.2.1.3 …

传统美业通过小魔推短视频矩阵系统,实现逆势增长?

许多美甲店在经营过程中常常陷入一个误区&#xff1a;他们认为自己缺少的是客户&#xff0c;但实际上&#xff0c;他们真正缺少的是有效的营销策略&#xff0c;美甲店经营者普遍面临的两大难题包括&#xff1a; 1. 高客户流失率&#xff1a; 据研究显示&#xff0c;约70%的顾…

初识linux(2)

接着上篇的初识linux(1)来接着说没看过的可以去看看 cp指令 语法&#xff1a;cp [选项] 源文件或目录 目标文件或目录 功能: 复制文件或目录 说明: cp指令用于复制文件或目录&#xff0c;如同时指定两个以上的文件或目录&#xff0c;且最后的目的地是一个已经存在的目录&#…

Python和C++及R相关系数数学统计学可视化和神经模型及评估指标

&#x1f3af;要点 较少统计样本显著性评估和变量关系梳理功能磁共振成像一致性分析检测非单调关联性结构随机变量动力学相关性热图和矩阵图基因疫苗非线性变量相关性 Python相关矩阵 相关矩阵 n n n 个随机变量 X 1 , … , X n X_1, \ldots, X_n X1​,…,Xn​ 的相关矩阵…

CTF流量分析题目一把梭,零基础入门到精通,收藏这一篇就够了

https://github.com/Arinue/CTF-NetA CTF-NetA是一款专门针对CTF比赛的网络流量分析工具&#xff0c;可以对常见的网络流量进行分析&#xff0c;快速自动获取flag。而且是有gui图形界面的&#xff0c;有了它即使小白也能轻松应对流量分析题目&#xff0c;不得不说这CTF工具太专…

论文笔记:交替单模态适应的多模态表征学习

整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation&#xff09;论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比&#xff0c;MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…

Java 多态(难)

1. 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。 2&#xff0e;一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多。 举例说明&#xff1a;新建两个类&#xff0c;Person类和Student类&#xff0c;Student类继承Person类&#xff1a…

【学习笔记】数据结构(六 ①)

树和二叉树 &#xff08;一&#xff09; 文章目录 树和二叉树 &#xff08;一&#xff09;6.1 树(Tree)的定义和基本术语6.2 二叉树6.2.1 二叉树的定义1、斜树2、满二叉树3、完全二叉树4、二叉排序树5、平衡二叉树&#xff08;AVL树&#xff09;6、红黑树 6.2.2 二叉树的性质6.…

Linux启动流程,0,1,2进程,init进程,idle进程,内核态到用户态的kernel_execve(一)

&#xff1f;是&#xff0c;如果定义了&#xff0c;就按Makefile的&#xff0c;如果如下make编译时&#xff0c;就按如下 linux内核入口 进程0在用户空间看不到&#xff0c;因为他是内核进程 进程2就是守护进程&#xff0c;维护内涵运转的 一生二&#xff0c;二生三&#xff…

Redis中Hash(哈希)类型的基本操作

文章目录 一、 哈希简介二、常用命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloathstrlen 三、命令小结四、哈希内部编码方式五、典型应用场景六、 字符串&#xff0c;序列化&#xff0c;哈希对比 一、 哈希简介 几乎所有的主流编程语言都提供了哈…

CANopen开源库canfestival的移植

本文记录将CANopen开源库CANfestival移植到GD32F470单片机的过程。CANopen协议理解请参考博客&#xff1a;CANopen协议的理解-CSDN博客 CANfestival开源库下载链接 CSDN链接&#xff1a; https://download.csdn.net/download/heqiunong/89774627 官网链接&#xff1a;https:/…

智能BI项目第五期

本期主要内容 系统问题分析异步化业务流程分析线程池讲解&#xff08;入门 原理 实战&#xff09;系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时&#xff0c;我们后端的 AI 处理能力有限&#xff0c;例如服务器的内存、CPU、网络带宽等资源有限&#xff0c…

基于微信小程序的游泳馆管理系统--论文源码调试讲解

2 关键技术介绍 2.1 SSM框架 开发信息管理系统的主流框架是SSM&#xff08;Spring Spring MVC MyBatis&#xff09;&#xff0c;SSM框架web层使用Spring MVC框架&#xff0c;使传输前后端数据变得简单&#xff1b;对于业务层使用Spring作为轻量级控制反转和面向切面的容器框…

redis分布式锁(看门枸机制)

分布式锁确保在同一时间只有一个节点能获得对共享资源的独占访问权限&#xff0c;从而解决并发访问问题。 Redisson锁(简称看门狗) 它可以实现锁的延长&#xff0c;确保某个线程执行完才能让其他线程进行抢锁操作 引入看门狗机制后 如何使用&#xff1f; 1、引入依赖包 <…

Java数据结构专栏介绍

专栏导读 在软件工程的世界里&#xff0c;数据结构是构建高效、可靠程序的基石。"Java数据结构"专栏致力于为Java开发者提供一个全面、深入的学习平台&#xff0c;帮助他们掌握各种数据结构的原理、实现及其在Java中的应用。通过这个专栏&#xff0c;读者将能够提升…

【第34章】Spring Cloud之SkyWalking分布式日志

文章目录 前言一、准备1. 引入依赖 二、日志配置1. 打印追踪ID2. gRPC 导出 三、完整日志配置四、日志展示1. 前端2. 后端 总结 前言 前面已经完成了请求的链路追踪&#xff0c;这里我们通过SkyWalking来处理分布式日志&#xff1b; 场景描述&#xff1a;我们有三个服务消费者…

Hive企业级调优[3]—— Explain 查看执行计划

Explain 查看执行计划 Explain 执行计划概述 EXPLAIN 命令呈现的执行计划由一系列 Stage 组成。这些 Stage 之间存在依赖关系&#xff0c;每一个 Stage 可能对应一个 MapReduce Job 或者一个文件系统的操作等。如果某 Stage 对应了一个 MapReduce Job&#xff0c;则该 Job 在 …