6. 面向对象(重点)

1 面向对象

1.1 了解对象

  • 学习面向对象编程都先我们需要先思考三个问题:

1.1.1 面向对象的好处?

  • Java作者詹姆斯.高斯林说过**万物皆对象**
  • 汽车的数据可以找汽车对象处理
  • 手机数据可以找手机对象处理
  • 学生的数据可以找学生对象处理
  • 使用面向对象编程符合人类思维习惯, 就好比谁的事情谁负责.

1.1.2 程序中的对象到底是什么?

  • 对象其实就是一个具体的东西,可以使用属性(变量)和行为(方法)对其进行具体描述
  • 比如说下面汽车和学生具有的属性和行为

1.1.3 对象是怎么出来的?

  • 对象是由类创建出来的,类是创建对象的模板,对象是类的具体实现。

1.1.4 总结

  1. 在Java中一切对象
  2. 对象是一个具体的东西, 是可以属性(变量) 和行为(方法) 对其进行具体描述.
  3. 类和对象的关系: 类是对象创建的模板, 对象是类的具体实现.
  4. 目前要设计一辆车,牌子是奥迪,颜色是红色,功能是拉货, 按照面向对象的思想,应该怎么实现?
    • 首先创建一个Car的类,
    • 定义属性: String brand; String color;
    • 创建一个拉货的方法
    • 在main() 方法中创建Car类的对象, 并给对象属性赋值
    • 使用对象调用拉货方法

1.2 使用对象

1.2.1 案例: 打印出学生的总成绩、平均成绩

  • 先看看面向过程编程
  • 开发一个一个的方法,有数据要处理了,我们就调方法来处理。
public class Demo {public static void main(String[] args) {printTotalScore("播妞", 100, 100);printAverageScore("播妞", 100, 100);System.out.println("-------------------------");printTotalScore("播仔", 59, 99);printAverageScore("播仔", 59, 99);}public static void printTotalScore(String name, double chinese, double math){System.out.println(name + "同学的各科总分是:" + (chinese + math));}public static void printAverageScore(String name, double chinese, double math{System.out.println(name + "同学的各科平均分是:" + (chinese + math) / 2.0);}
}
  • 再看看面向对象编程
  • 开发一个一个的对象来处理数据,把数据交给对象,再调用对象的方法来完成对数据的处理。(谁的事情谁来做,谁的数据谁负责)

public class Student {String name;// 姓名double chinese; // 语文成绩double math; // 数学成绩public void printTotalScore(){System.out.println(name + "同学的各科总分是:" + (chinese + math));}public void printAverageScore(){System.out.println(name + "同学的各科平均分是:" + (chinese + math) / 2.0);}
}public class Test {public static void main(String[] args) {Student s1 = new Student();s1.name = "播妞";s1.chinese = 100;s1.math = 100;s1.printTotalScore();s1.printAverageScore();Student s2 = new Student();s2.name = "播仔";s2.chinese = 59;s2.math = 99;s2.printTotalScore();s2.printAverageScore();}
}
  • 这么一写突然发现有一点点的麻烦啊
  • 那么要进行一个班同学的成绩打印, 那么使用面向对象编程, 是不是就容易非常多了

1.2.2 总结:

  1. 面向对象思想主张: 谁的事情谁做, 谁的数据谁负责
  2. 类是创建对象的模板, 它里面包含的两项主要元素是: 属性(bianliang) 和行为(方法)
public class 类名{// 1、属性: 变量, 用来描述对象可以处理什么数据// 2、动作: 方法,描述对象有什么功能
}
  1. 有了类, 如何创建一个对象
    • 类名 对象名 = new 类名();
  2. 一个类可以创建多个对象

1.3 案例练习

1.3.1 类和对象的一些注意事项

  • 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car…
  • 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为).
  • 成员变量本身存在默认值,同学们在定义成员变量时一般来说不需要赋初始值(没有意义).
数据类型明细默认值
基本类型byte, short, char, int, long0
基本类型float, double0.0
基本类型booleanfalse
引用类型数组, Stringnull
  • 对象名要求和类名相似,但是需要首字母小写,建议和类名同名.
  • 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须成为代码文件名.

1.3.2 案例一 面向对象编程练习——掌握类和对象的使用

  • 定义一个“手机(Phone)”类,有以下成员:

    • 成员属性:品牌(brand)、颜色(color)、价格(price)
    • 成员方法:打电话(call)、发短信(sendMsg)
  • 定义测试类,创建两个手机对象,并调用两个方法!

    • 正在使用价值2999.0的黑色华为手机打电话
    • 正在使用价值1999.0的粉色小米手机发短信
  • 完整代码:

package com.itheima.b_case;/*定义一个“手机(Phone)”类,有以下成员:成员属性:品牌(brand)、颜色(color)、价格(price)成员方法:打电话(call)、发短信(sendMsg)定义测试类,创建两个手机对象,并调用两个方法!正在使用价值2999.0的黑色华为手机打电话正在使用价值1999.0的粉色小米手机发短信
*//*** @ClassName Phone* @Author LXHYouth* @Date 2024/3/14 19:57* @Version: 1.0* @Description 创建手机类, 定义其属性和行为**/public class Phone {String brand;String color;double price;public void call(){System.out.println("正在使用价值"+price+"的"+color+brand+"手机打电话");}public  void sendMassage(){System.out.println("正在使用价值"+price+"的"+color+brand+"手机发短信");}}
/*** @ClassName Test* @Author LXHYouth* @Date 2024/3/14 19:56* @Version: 1.0* @Description 测试类, 创建对象, 对对象属性赋初始值, 并调用方法**/
class Test{public static void main(String[] args) {// 创建两个手机对象Phone phone = new Phone();Phone phone2 = new Phone();// 对两个对象属性赋初始值phone.brand="华为";phone.color="黑色";phone.price=2999;phone2.brand="小米";phone2.color="粉色";phone2.price=1999;// 通过对象调用方法phone.call();phone2.sendMassage();}
}

1.4 内存图

1.4.1 对象在计算机中的执行原理

1.4.2 如果某个对象没有任何变量指向它了, 需要注意什么?

  • 注意:当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
  • Java存在自动垃圾回收机制,会自动清除掉垃圾对象,程序员不用操心。

1.4.3 总节:

  1. Student s1 = new Student()在计算机中的执行原理是
  • 每次new Student(),就是在堆内存中开辟一块空间,代表一个学生对象
  • s1变量里面记住的是学生对象的内存地址值
  1. 如何识别一个变量是引用类型的变量?
  • 这个变量中如果存储的是内存的地址值,那么他就是一个引用类型的变量
  1. 执行Student s1 = null 在计算机中会发生什么?
  • 变量s1中保存的内存地址值会被设置为null
  • 地址值对应的内存区域如果没有其它变量引用,就会被垃圾回收器自动回收

2 封装

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

2.1 封装理论

2.1.1 什么是封装

  • 在面向对象的程序设计中,应当把对象属性和行为设计到对象内部去,而且对象中的数据不能被随意访问。
public class Student {String name;// 姓名double chinese; // 语文成绩double math; // 数学成绩public void printTotalScore(){System.out.println(name + "同学的各科总分是:" + (chinese + math));}public void printAverageScore(){System.out.println(name + "同学的各科平均分是:" + (chinese + math) / 2.0);}
}

2.1.2 为什么要封装

  • 在类中默认定义的变量是随时可被其他类访问、修改,是不安全的

2.1.3 封装的设计规范

  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 将成员属性修饰为“private”,表示“私有”

  • 可以被本类其它成员访问,但不能被其它类访问.

  • 不能直接访问Student对象的属性

  • 只能通过get/set方法间接访问!!!

  • 如果熟练书写了get/set方法, 就可以使用IDEA自动生成

  • 在参数下面一行, 鼠标右键, 选择Generate

  • 选择 Getter and Setter

  • 键盘按住 Shift ,鼠标点击左后一个属性, 进行全选, 然后点击OK

  • 这样就自动生成所有属性的get和set方法了

2.1.4 总结

  1. 什么是封装?
  • 在程序设计中,应当把对象属性和行为设计到对象内部去,而且对象中的数据不能被随意访问.
  1. 为什么要封装?
  • 在类中默认定义的变量是随时可被其他类访问、修改,是不安全的
  1. 如何封装?
  • 使用private修饰成员变量(public进行修饰公开成员,private 进行修饰私有成员)
  1. 封装之后如何访问数据
  • 提供对应变量的set/get方法

2.2 this关键字

2.2.1 this是什么

  • this就是一个变量,可以用在方法中,用来代表当前方法所属的对象。
  • 打印出来的内存地址是相同的

2.2.2 this的应用场景

  • This可以用来: 区别成员变量和局部变量
public class Student {String name;double score;public void checkPass(double score){if(this.score >= score){System.out.println("恭喜您,考上哈佛,走向巅峰~~~");}else {System.out.println("不好意思,您没有考上~~~");}}
}

2.2.3 成员变量和局部变量的区别

区别成员变量局部变量
类中位置不同类中,方法外常见于方法中(形参或单独定义)
初始化值不同有默认值, 不需要初始化赋值没有默认值,使用之前必须完成赋值
内存位置不同堆内存栈内存
作用域不同整个对象在所归属的大括号中
生命周期不同与对象共存亡随着方法的调用而生,随着方法的运行结束而亡

2.2.4 this的执行原理

2.2.6 总结

  1. this关键字是什么?
  • this就是一个变量, 可以用在方法中 ,用来代表调用当前方法的对象;
  • 哪个对象调用方法,this就指向哪个对象,也就是拿到哪个对象。
  1. this关键字在实际开发中常用来干啥?
  • 用来解决对象的成员变量与方法内部变量的名称一样时,导致的访问冲突问题
  1. 成员变量和局部变量的区别
  • 类中位置、初始化值、内存位置、作用域、生命周期

2.3 构造器

2.3.1 知识理解

  • 构造器,又叫构造方法,用于创建对象,它有下面几个特点

    • 方法名必须和类名保持一致
    • 方法没有返回值,也不能使用void修饰
    • 创建对象时,构造方法会被自动调用 Student s = new Student();
    • 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
  • 应用场景

    • 创建对象时,同时完成对对象成员变量(属性)的初始化赋值。
    • Student s = new Student(“张三”,12);
  • 注意事项

    • 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
    • 一个类中,一旦有了有参构造方法,Java将不会再生产无参构造,此时如果需要无参构造,可以自行创建
  • 构造器想要自动生成也是跟之前get和set一样.

  • 也是右键点击选择Generate, 然后选择Constraintor

  • 无参构造直接选择 Select None

  • 再重复上述操作, 键盘按住 Shift ,鼠标点击左后一个属性, 进行全选, 然后点击OK

  • 这样就自动生成了无参和全参构造方法啦, 如果不需要全部参数的话, 在选择时可以只选择需要的参数, 然后就会生成对应的含参构造方法.

2.3.2 总结

  1. 书写格式
public class Student {/** 构造器 */public Student() {//...}
}
  • 方法名必须和类名保持一致
  • 方法没有返回值,也不能使用void修饰
  • 创建对象时,构造方法会被自动调用
  • 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
  1. 应用场景
  • 可以使用全参构造器在创建对象的时候完成对变量的赋值
  1. 注意事项
  • 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
  • 一个类中,一旦有了有参构造方法,Java将不会再生产无参构造,
  • 此时如果需要无参构造,可以自行创建

2.4 案例练习

2.4.1 案例: 请以“封装”的思想定义学生类,并为其定义构造方法

  • 完整代码
package com.itheima.f_case;/*** @author: LXHYouth* @date: 2024/3/14 21:18* @Version:    1.0* @Description*//*
为“学员管理系统”设计一个“学员类(Student)”:成员属性:学号(id)、姓名(name)、性别(sex)、年龄(age)成员方法:打印学员信息(print)、学习(study)
*/
public class Student {private int id;private String name;private char sex;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/** @Author LXHYouth* @Date 16:14 2024/3/12* @Param []* @return* @Description 无参构造器**/public Student(){}/** @Author LXHYouth* @Date 16:20 2024/3/12* @Param [id, name, age, sex]* @return* @Description  全参构造器**/public Student(int id,String name,int age,char sex ){this.id=id;this.name=name;this.age=age;this.sex=sex;}public void print(){System.out.println("姓名: " +name);System.out.println("年龄: "+age);System.out.println("学号: "+ id);System.out.println("性别: "+ sex);}public void study(){System.out.println("我正在学习, 以后挣多多的钱");}
}class test{public static void main(String[] args) {Student student=new Student(01,"LXHYouth",26,'男');}
}

3 JavaBean

3.1 介绍

3.1.1 什么是JavaBean?

  • JavaBean,又叫实体类,就是一种特殊形式的类。

3.1.2 实体类怎么使用?

  • 实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。
public class Student {private String name;private double score;// getter setter方法// 打印成绩是否及格的方法// 打印成绩等级的方法// ... 
}public class StudentOperator {private Student s;public StudentOperator (Student s){this.Student = s;}
}

3.1.3 总结:

  1. 实体类的作用和注意点是什么
  • 实体类是用来保存数据的java类,可以用它创建对象,保存某个事物的数据。
  • 实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。
  1. 实体类有啥特点?
  • 成员变量必须私有,且要为他们提供get、set方法
  • 必须有无参数构造器, 可以有带参构造

3.2 练习案例

案例: 面向对象综合案例-模仿电影信息系统

  • 需求
    • 展示系统中的全部电影(每部电影展示:名称、价格)。
    • 允许用户根据电影编号(id)查询出某个电影的详细信息。
  • 目标
    • 使用所学的面向对象编程实现以上2个需求。
  • 完整代码
package com.itheima.lx;/*** @author: LXHYouth* @date: 2024/3/14 20:31* @Version:    1.0* @Description*//*** 实体类 javaBean* 负责数据存 -set 取 -get*/
public class Movie {//    成员属性,必须私有private int id;private String name;private String director;private double price;
//    创建set  getpublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDirector() {return director;}public void setDirector(String director) {this.director = director;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}//    无参构造器public Movie() {}public Movie(int id,String name, String director, double price) {this.id = id;this.name = name;this.director = director;this.price = price;}
}
package com.itheima.lx;/*** @author: LXHYouth* @date: 2024/3/14 20:31* @Version:    1.0* @Description*//*** 电影的操作类**/
public class MovieOperator {Movie[] arr = {new Movie(1,"出拳吧,妈妈","康晓白",100),new Movie(2,"一点就到家", "许宏宇",79),new Movie(3,"月球陨落","罗兰",100),new Movie(4,"奇幻冒险","思明",60),new Movie(5,"长津湖","徐克",90)};/*** 查询所有电影*/public void findAll(){
//        遍历数组for (int i = 0; i < arr.length; i++) {System.out.println(arr[i].getName()+"价格:"+arr[i].getPrice());}}/*** 根据id 查询电影详情* @param id* @return*/public Movie getMovieById(int id){//        遍历数组for (int i = 0; i < arr.length; i++) {if(id==arr[i].getId()){
//                找到id对应的电影return arr[i];}}return null;}
}
package com.itheima.lx;/*** @author: LXHYouth* @date: 2024/3/14 20:31* @Version:    1.0* @Description*/public class MovieTest {public static void main(String[] args) {//        调用行为对象MovieOperator movieOperator = new MovieOperator();
//        调用行为movieOperator.findAll();System.out.println("=============================");Movie movie = movieOperator.getMovieById(2);System.out.println(movie.getName()+",价格:"+movie.getPrice());}
}

  • 到此教程就结束了.
  • 转载: 请附上本文链接.
  • 如果文章对你有帮助, 可以点赞收藏一下, 以防下次需要可以快速找到.

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

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

相关文章

MISC-Catflag

前言 开始拿到这道题&#xff0c;以为是要识别文件类型&#xff0c;后面发现不是&#xff0c;kali识别为ascii文本文件。而用010editor打开&#xff0c;又是一堆看不懂的码 后面发现有很多重复内容1B 5B 43等等&#xff0c;再看题目type flag or cat flag可以联想linux的cat命…

月结常见工单异常情况处理

1. 上月已经结算的工单&#xff0c;本月打开投料或者报工&#xff0c;或者增加产出 或者撤销报工修正报工 如果针对结算的订单&#xff0c;打开重新投料。 月末对工单重新结算&#xff0c;转出差异 KKS2单个处理&#xff08;KKS1集中处理&#xff09; 差异计算 KO88单个结算…

机械女生,双非本985硕,目前学了C 基础知识,转嵌入式还是java更好?

作为单片机项目开发的卖课佬&#xff0c;个人建议&#xff0c;先转嵌入式单片机开发方向&#xff0c;哈哈。 java我也学过&#xff0c;还学过oracle、mysql数据库&#xff0c;只是当时没做笔记&#xff0c;找不好充分的装逼证据了。 从实习通过业余时间&#xff0c;学到快正式毕…

如何实现幂等性,java多线程面试题及答案整理

订单创建接口&#xff0c;第一次调用超时了&#xff0c;然后调用方重试了一次。是否会多创建一笔订单&#xff1f; 订单创建时&#xff0c;我们需要去扣减库存&#xff0c;这时接口发生了超时&#xff0c;调用方重试了一次。是否会多扣一次库存&#xff1f; 当这笔订单开始支…

智慧路灯杆AI监测应用,让高速出行更安全

高速公路是现代交通出行的重要组成&#xff0c;高速公路上的交通安全也一直是人们关注的焦点。针对更好监测和管理高速公路上的交通状况&#xff0c;可以基于智慧路灯杆打造AI交通监测应用&#xff0c;通过智能感知高速路段的路况、车况、环境状况&#xff0c;实现实时风险感知…

【SpringCloud微服务实战01】Eureka 注册中心

前言 在 Eureka 架构中&#xff0c;微服务角色有两类&#xff1a; EurekaServer &#xff1a;服务端&#xff0c;注册中心 记录服务信息 心跳监控 EurekaClient &#xff1a;客户端 Provider &#xff1a;服务提供者&#xff0c;例如案例中的 user-service …

工具篇--分布式定时任务 Xxl-job 与 ElasticJob的对比

文章目录 前言一、架构&#xff1a;二、作业&#xff1a;三、日志记录&#xff1a;总结 前言 本文对分布式调度任务 Xxl-job 与 ElasticJob的对比 进行介绍。 一、架构&#xff1a; Xxl-job &#xff1a; cs 架构 &#xff0c;分为客户端和服务端&#xff0c;是有中心的架构&…

Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%

亲爱的社区小伙伴们&#xff0c;我们很高兴地向大家宣布&#xff0c;在 3 月 8 日我们引来了 Apache Doris 2.1.0 版本的正式发布&#xff0c;欢迎大家下载使用。 在查询性能方面&#xff0c; 2.1 系列版本我们着重提升了开箱盲测性能&#xff0c;力争不做调优的情况下取得较好…

XIAO ESP32S3部署Edge Impulse模型

在上一篇文章中我们介绍了如何使用edge impulse训练一个图片分类模型并导出arduino库文件。在这篇文章中我们将介绍如何在esp32s3中部署这个训练好的图片分类模型。 添加进Arduino库 有两种方法将下载的文件添加进Arduino库。 在Arduino IDE程序中&#xff0c;转到项目选项卡…

YOLOv9改进策略:注意力机制 | EMA:基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;加入EMA注意力&#xff0c;一种基于跨空间学习的高效多尺度注意力&#xff0c;效果优于ECA、CBAM、CA等经典注意力。 yolov9-c-EMA summary: 970 layers, 51011154 parameters, 51011122 gradients, 238.9 GF…

C语言例:表达式(a=2,3),a+1的值

题目&#xff1a;设int a; 则表达式(a2,3),a1的值 #include<stdio.h> int main(void) {int a0;int b;int c;b (a2,4);c (a2,3),a1;printf("a1%d\n",a1); //a1 3;printf("a2,4的值为&#xff1a;%d\n",b); //a2,4的值为&…

如何实现高效的Web自动化测试?

随着互联网的快速发展&#xff0c;Web应用程序的重要性也日益凸显。为了保证Web应用程序的质量和稳定性&#xff0c;Web自动化测试成为必不可少的一环。然而&#xff0c;如何实现高效的Web自动化测试却是一个值得探讨的课题。 首先&#xff0c;选择合适的测试工具是关键。市面…