· 学习参考资料:
· 学习内容
Java面向对象基础:以人体BMI为案例了解学习Java对象
· 知识呈现&细化总结:
#Java面向对象基础
一、提出问题#
Q: 面对对象编程有什么好处?
A:凡是找对象的编程套路,更加符合人类思维习惯,编程也会更直观
Q:对象是什么? 如何得到?
A:对象就是一种特殊的数据结构
A:对象是用类new出来的,有了类就可以创建对象,代码如下:public class 类名 {
1.变量//用来说明对象可以处理什么数据
2.方法//描述对象有什么功能
}
以创建个人信息personInfo类示例:
// [ 为什么要私有成员变量下文会提 ]public class personInfo { //1.必须私有成员变量 private String name;//姓名 private int age;//年龄 private double height;//身高 private double weight;//体重 private double Bmi;//BMI指数 }
二、原理&关键部分#
1.多个对象在计算机中的执行原理:
如图所示(此图来源于文初学习参考资料中)
该原理与数组类似,以指针指向存储地址进行读取操作。
2. 类与对象的一些注意事项:
1) 类名建议使用英文单词,首字母大写,满足驼峰模式,具有意义。
2)类中定义的变量称为成员变量(对象的属性),类中定义的方法也称为成员方法。(对象的行为)
3)成员变量本身存在默认值,在定义成员变量时一般不需要赋初始值。(无意义)
4)一个代码文件中,可以写多个class类,但只有一个能用public修饰,且public修饰的类名必须为代码文件名。
5)对象和对象之间的数据不会相互影响,但多个变量指向同一个变量时就会影响。
6)如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象。(Java存在自动垃圾回收机制,无须担心!)
3. this关键字
Q:"this"有什么应用场景呢?
A:主要用来解决变量名称冲突问题。
实际上,简单理解this可以从字面出发,this起指代作用,可以用在方法中来获取当前对象,哪个对象调用方法,this就指向哪个对象,也就是拿到哪个对象。//具体运用会在下文提及
4.构造器
我长什么样? 示例:public class personInfo { //无参数构造器 public personInfo(){ } //有参数构造器 public personInfo(String name, int age, double height, double weight){ this.name = name; this.age = age; this.height = height; this.weight = weight; } }
创建对象时,对象会去调用构造器,如:
//无参数构造器调用 personInfo p1 = new personInfo(); //有参数构造器调用 personInfo p2 = new personInfo("小王",8,1.60,60)
而它的结构其实我们非常熟悉,还记得这个吗?
Scanner s = new Scanner(System.in);
是不是还挺像的?
构造器应用在创建对象时,同时完成对对象成员变量(属性) 的初始化赋值
需要注意的是,如果不写构造器,java会自动为类生成一个无参数构造器,而一旦定义了有参数构造器,java就不会帮我们的类自动生成,需要我们自己手写一个出来
5.封装
Q:什么是封装?
A:封装就是指用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。应当遵循 合理隐藏(private),合理暴露(public) 的原则。
本文第一部分中在各成员变量前附上private关键字,即是对这些属性进行封装,使之不能直接被外界修改访问。
而这就不得不提到一种特殊的类——实体JavaBean(实体类)
这种类有两个特点1.这个类中的成员变量都要私有,并且要对外提供相应的get/set方法
2. 类中必须要有一个公共的无参数构造器举个例子,对于类personInfo中的name属性,我们需要提供相应的get/set方法如下:
public String getName() { return name; } public void setName(String name) { this.name = name; }
tips: 在IDEA中可以通过右键generate自动生成成员变量的get/set方法
而如果现在我们想要得到 or 修改 p1中的name值//错误做法 System.out.println(p1.name); p1.name = "小红"; //正确做法 System.out.println(p1.getName()); p1.setName("小红")
三、代码呈现#
为了更加清晰的构造,我们将整个程序分成三个 class 并集合在同一个 package 下,如图:
其中, ① personInfo 用于存储个人信息package Person_Bmi_Operate; public class personInfo { //1.必须私有成员变量 private String name;//姓名 private int age;//年龄 private double height;//身高 private double weight;//体重 private double Bmi;//BMI指数 //2.必须为类提供一个公开无参数构造器 public personInfo(){ } //可附上公开有参数构造器 public personInfo(String name, int age, double height, double weight){ this.name = name; this.age = age; this.height = height; this.weight = weight; } //为每个成员构造get/set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } //为了节约空间 其他成员变量的get/set方法构造省略噜 <3
② personOperator 则用于构造一系列对于对象所要实施的方法
如下图的 calcBmi() 和 judgeBmi() 方法package Person_Bmi_Operate; public class personOperator { //1.初始化&私有成员变量 private personInfo person; //2.为personOperator类提供一个构造器 public personOperator(personInfo person){ this.person = person; } //3.计算对象person的Bmi值,并写入对象person的属性中 public void calcBmi(){ double height = person.getHeight(); double weight = person.getWeight(); System.out.println(person.getName() + "的BMI指数为:"); person.setBmi(weight / Math.pow(height,2)); System.out.println(person.getBmi()); } //4.比较对象person的Bmi值,并根据标准输出反馈 public void judgeBmi(){ if (0 < person.getBmi() && person.getBmi()< 18.5){ System.out.println(person.getName() + "的BMI偏低,体重过低!"); } else if (18.5 <= person.getBmi() && person.getBmi()<= 24){ System.out.println(person.getName() + "的BMI正常,体重处于平均水平!"); } else if (person.getBmi() > 24){ System.out.println(person.getName() + "的BMI偏高,体重过高!"); } else{ System.out.println(person.getName() + "的BMI值异常 请检查输入是否有误!"); } } }
最后,③ personTest 用于输出和执行一系列操作
public class personTest { public static void main(String[] args) { personInfo p1 = new personInfo("小王",18,1.89,60); personOperator po1 = new personOperator(p1); System.out.println("------------------------------------"); //输出p1对象的属性 System.out.println("以下是" + p1.getName() + "的个人信息" ); System.out.println("姓名: " + p1.getName()); System.out.println("年龄: " + p1.getAge()); System.out.println("身高: " + p1.getHeight()); System.out.println("体重: " + p1.getWeight()); System.out.println("------------------------------------"); //更改p1对象的属性 p1.setName("小美"); p1.setAge(15); p1.setHeight(1.65); p1.setWeight(50); System.out.println("以下是" + p1.getName() + "的个人信息" ); System.out.println("姓名: " + p1.getName()); System.out.println("年龄: " + p1.getAge()); System.out.println("身高: " + p1.getHeight()); System.out.println("体重: " + p1.getWeight()); System.out.println("------------------------------------"); //对p1对象进行一系列操作 po1.calcBmi(); po1.judgeBmi(); } }
这样,一个以 人体BMI为主题进行一系列操作的对象构造 就完成了~~~
总结来说,这样的一种编程思路,使结构更加清晰,将代码区块化,也更易于理解。
· 学习总结:
本周对于Java面向对象基础有了初步的探索
并用学到的知识进行了对人体BMI案例的代码实现
2023/12/15
Author:渡 U1ysses #