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 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());}
}
-
- 到此教程就结束了.
- 转载: 请附上本文链接.
- 如果文章对你有帮助, 可以点赞收藏一下, 以防下次需要可以快速找到.