1 面向对象
1.1 了解对象
- 学习面向对象编程都先我们需要先思考三个问题:
1.1.1 面向对象的好处?
- Java作者詹姆斯.高斯林说过**
万物皆对象
** - 汽车的数据可以找汽车对象处理
- 手机数据可以找手机对象处理
- 学生的数据可以找学生对象处理
- 使用面向对象编程符合人类思维习惯, 就好比谁的事情谁负责.
1.1.2 程序中的对象到底是什么?
- 对象其实就是一个具体的东西,可以使用属性(变量)和行为(方法)对其进行具体描述
- 比如说下面汽车和学生具有的属性和行为
1.1.3 对象是怎么出来的?
- 对象是由类创建出来的,类是创建对象的模板,对象是类的具体实现。
1.1.4 总结
- 在Java中一切对象
- 对象是一个具体的东西, 是可以属性(变量) 和行为(方法) 对其进行具体描述.
- 类和对象的关系: 类是对象创建的模板, 对象是类的具体实现.
- 目前要设计一辆车,牌子是奥迪,颜色是红色,功能是拉货, 按照面向对象的思想,应该怎么实现?
- 首先创建一个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 总结:
- 面向对象思想主张: 谁的事情谁做, 谁的数据谁负责
- 类是创建对象的模板, 它里面包含的两项主要元素是: 属性(bianliang) 和行为(方法)
public class 类名{
// 1、属性: 变量, 用来描述对象可以处理什么数据
// 2、动作: 方法,描述对象有什么功能
}
- 有了类, 如何创建一个对象
- 类名 对象名 = new 类名();
- 一个类可以创建多个对象
1.3 案例练习
1.3.1 类和对象的一些注意事项
- 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如:Student、Car…
- 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为).
- 成员变量本身存在默认值,同学们在定义成员变量时一般来说不需要赋初始值(没有意义).
数据类型 | 明细 | 默认值 |
---|---|---|
基本类型 | byte, short, char, int, long | 0 |
基本类型 | float, double | 0.0 |
基本类型 | boolean | false |
引用类型 | 数组, String | null |
- 对象名要求和类名相似,但是需要首字母小写,建议和类名同名.
- 一个代码文件中,可以写多个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 总节:
- Student s1 = new Student()在计算机中的执行原理是
- 每次new Student(),就是在堆内存中开辟一块空间,代表一个学生对象
- s1变量里面记住的是学生对象的内存地址值
- 如何识别一个变量是引用类型的变量?
- 这个变量中如果存储的是内存的地址值,那么他就是一个引用类型的变量
- 执行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 总结
- 什么是封装?
- 在程序设计中,应当把对象属性和行为设计到对象内部去,而且对象中的数据不能被随意访问.
- 为什么要封装?
- 在类中默认定义的变量是随时可被其他类访问、修改,是不安全的
- 如何封装?
- 使用private修饰成员变量(public进行修饰公开成员,private 进行修饰私有成员)
- 封装之后如何访问数据
- 提供对应变量的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 总结
- this关键字是什么?
- this就是一个变量, 可以用在方法中 ,用来代表调用当前方法的对象;
- 哪个对象调用方法,this就指向哪个对象,也就是拿到哪个对象。
- this关键字在实际开发中常用来干啥?
- 用来解决对象的成员变量与方法内部变量的名称一样时,导致的访问冲突问题
- 成员变量和局部变量的区别
- 类中位置、初始化值、内存位置、作用域、生命周期
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 总结
- 书写格式
public class Student {
/** 构造器 */
public Student() {
//...
}
}
- 方法名必须和类名保持一致
- 方法没有返回值,也不能使用void修饰
- 创建对象时,构造方法会被自动调用
- 一个类中,如果没有任何的构造方法,Java会自动生成一个无参构造
- 应用场景
- 可以使用全参构造器在创建对象的时候完成对变量的赋值
- 注意事项
- 一个类中,如果没有任何的构造方法,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 总结:
- 实体类的作用和注意点是什么
- 实体类是用来保存数据的java类,可以用它创建对象,保存某个事物的数据。
- 实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离。
- 实体类有啥特点?
- 成员变量必须私有,且要为他们提供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 get
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 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());
}
}
-
- 到此教程就结束了.
- 转载: 请附上本文链接.
- 如果文章对你有帮助, 可以点赞收藏一下, 以防下次需要可以快速找到.