开发一个一个的对象,把数据交给对象,在调用对象的方法来完成对数据的处理
面向对象编程有啥好处?
万物皆对象,符合人类思维习惯,编程更简单、更直观
程序中的对象到底是什么?如何得到?
对象的本质上是一种特殊的数据结构
对象是用类new出来的,有了类就可以创建出对象(类名 对象名 = new 类名();)
//class就是类,也称为对象的设计图(或者对象的模板)
public class 类名{
1.变量,用来说明对象可以处理什么数据
2.方法,描述对象有什么功能,也就是可以对数据进行什么样的处理
}
一. 面向对象基础
1.1 对象在计算机中的执行原理
Student s1 = new Student();
每次new Student(),就是在堆内存中开辟一块内存区域代表一个学生对象
s1变量里面记住的是学生对象的地址,因此变量s1也称为引用类型的变量
(变量里存储的是一个对象的地址,那么这个变量就是引用类型的变量)
1.2 类和对象的一些注意事项
· 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如Student、Car……
· 类中定义的变量也成为成员变量(对象的属性),类中定义的方法也成为成员方法(对象的行为)
· 成员变量本身存在默认值,在定义成员变量时一般来说不需要赋初始值(没有意义)
· 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须称为代码文件名
· 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响
public static void main(String[] args) {
// //两个变量分别指向不同的对象,不会有影响
// Student bo1 = new Student();
// bo1.name = "波妞";
// Student bo2 = new Student();
// bo2.name = "波仔";
// System.out.println(bo1.name);
//多个变量指向同一个对象,相互影响
Student bo1 = new Student();
bo1.name = "波妞";
Student bo2 = bo1;
bo2.name = "波仔";
System.out.println(bo1.name);
}
· 如果某个对象没有一个变量引用它,则该对象无法被操作,会成为所谓的垃圾对象
(当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的垃圾,Java存在自动垃圾回收机制,会自动清楚掉垃圾对象)
1.3 this
this就是一个变量(保存当前对象的内存地址,指向对象本身),可以用在方法中,来拿到当前对象
this的应用场景
this主要用来解决对象的成员变量和方法的内部变量的名称一致时,导致访问冲突问题的
//demo
public class demo {
public static void main(String[] args) {
Student s1 = new Student();
s1.score = 79;
s1.isPass(60);
}
}
//Student类
public class Student {
String name;
double score;
public void isPass(double score){
//如果不加this,第一个score也会代表形参里的score
if(this.score > score){
System.out.println("恭喜您通过了");
}else{
System.out.println("很遗憾没通过");
}
}
}
1.4 构造器
构造器是一种特殊的方法,这个方法没有返回值类型,方法的名字必须要与所在的类名一模一样
对象在创建的时候,可以指定对象去调用哪个构造器执行
构造器的特点
创建对象的时候,对象会自动去调用构造器
构造器的常见应用场景
创建对象时,完成对对象成员变量(属性)的初始化赋值
//demo
public class demo {
public static void main(String[] args) {
//创建对象的时候会触发构造器
Student s = new Student();
Student s1 = new Student("张三",98);
System.out.println(s1.name+" "+s1.score);
}
}
//Student类
public class Student {
String name;
double score;
//构造器可以重载
//无参数构造器
public Student(){
System.out.println("无参数构造器被触发执行");
}
//有参数构造器
public Student(String name, double score){
System.out.println("有参数构造器被触发执行");
this.name = name;
this.score = score;
}
}
构造器的注意事项
· 类在设计时,如果不写构造器,Java是会为类自动生成一个无参数构造器的
· 一旦定义了有参数构造器,Java就不会帮我们的类自动生成无参数构造器了,此时建议自己手写一个无参数构造器出来
1.5 封装
面向对象的三大特征:封装、继承、多态
什么是封装?
就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去
封装的设计规范
合理隐藏 合理暴露
代码如何控制对象的成员公开或隐藏?
公开成员,用public(公开)进行修饰;隐藏成员,用private(私有)进行修饰
//demo
public class demo {
public static void main(String[] args) {
Student s = new Student();
s.setScore(99);
System.out.println(s.getScore());
}
}
//Student类
public class Student {
//隐藏成员变量,通过暴露方法来对数据进行操作
private double score;
//接收数据
public void setScore(double score){
if(score>=0 && score<=100){
this.score = score;
}else{
System.out.println("数据非法");
}
}
//取数据
public double getScore(){
return score;
}
private void printIsPass(){
System.out.println((score>=60)?"pass":"fail");
}
}
1.6 实体JavaBean
什么是实体类?
这是一种特殊形式的类。
1. 这个类中的成员变量都要私有,并且要对外提供相应的getXxx、setXxx方法
2. 类中必须要有一个公共的无参的构造器
实体类应用场景:
实体类只负责数据存取,而对数据的处理交给其他类来完成,以实现数据和数据业务处理的分离
//demo
public class demo {
public static void main(String[] args) {
Student s = new Student();
s.setName("张三");
s.setScore(99);
System.out.println(s.getName());
System.out.println(s.getScore());
StudentOperator sor = new StudentOperator(s);
sor.printPass();
}
}
//Student
public class Student {
//实体类要求:
//隐藏成员变量,对外提供相应的get和set方法
//必须为类提供一个公开的无参数构造器
private String name;
private double score;
//如果不写构造器,Java默认提供一个无参数构造器
//如果写了有参数构造器,则需要再写一个无参数构造器(Java不提供无参构造器)
//自动生成无参数构造器 右键->生成->构造函数->取消选择
public Student() {
}
//自动生成有参数构造器 右键->生成->构造函数->选择参数
public Student(String name, double score) {
this.name = name;
this.score = score;
}
//自动生成get和set方法,右键->生成->getter and setter->->选择参数
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
//StudentOperator
public class StudentOperator {
private Student student;
public StudentOperator(Student student) {
this.student = student;
}
public void printPass(){
System.out.println((student.getScore() >= 60)?student.getName()+"Pass":student.getName()+"Fail");
}
}
1.7 面向对象编程综合案例
//demo
public class demo {
public static void main(String[] args) {
Movie[] arr_m = new Movie[3];
arr_m[0] = new Movie(10000,"少年",30,8.7,"张三");
arr_m[1] = new Movie(10001,"三个锅",95.96,9.4,"陈五");
arr_m[2] = new Movie(10002,"长",52.52,8.0,"赵四");
MovieOperator mo = new MovieOperator(arr_m);
// mo.showAll(); //系统全部电影信息……
// mo.showById(01); //系统中无此编号
// mo.showById(10000); //编号:10000 名称:少年 价格:30.0 评分:8.7 主演:张三
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("电影信息系统");
System.out.println("1.查看全部电影信息");
System.out.println("1.根据id查看某部电影信息");
System.out.println("----------------------------");
System.out.println("请输入您选择的操作(1 or 2):");
int x = sc.nextInt();
switch (x){
case 1:
mo.showAll();
break;
case 2:
System.out.println("请输入id:");
int user_choose_id = sc.nextInt();
mo.showById(user_choose_id);
break;
default:
System.out.println("无此操作");
break;
}
}
}
}
//Moive
public class Movie {
private int id; //编号
private String name; //名称
private double price; //价格
private double score; //评分
private String star; //主演
public Movie() {
}
public Movie(int id, String name, double price, double score, String star) {
this.id = id;
this.name = name;
this.price = price;
this.score = score;
this.star = star;
}
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 double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getStar() {
return star;
}
public void setStar(String star) {
this.star = star;
}
}
//MovieOperator
public class MovieOperator {
private Movie[] movies;
public MovieOperator(Movie[] movies) {
this.movies = movies;
}
//展示全部电影信息
public void showAll(){
System.out.println("-----系统全部电影信息-----");
for (int i = 0; i < movies.length; i++) {
Movie m = movies[i];
System.out.println("名称:"+m.getName()+" 价格:"+m.getPrice()+" 评分:"+m.getScore());
}
}
//根据编号id搜索展示详情
public void showById(int id){
boolean flag = false;
for (int i = 0; i < movies.length; i++) {
if(movies[i].getId() == id){
flag = true;
Movie m = movies[i];
System.out.println("编号:"+m.getId()+" 名称:"+m.getName()+" 价格:"+m.getPrice()+" 评分:"+m.getScore()+" 主演:"+m.getStar());
break;
}
}
if(flag == false){
System.out.println("系统中无此编号");
}
}
}
1.8 成员变量和局部变量的区别
区别 | 成员变量 | 局部变量 |
类中位置不同 | 类中,方法外 | 常见于方法中 |
初始化值不同 | 有默认值,不需要初始化赋值 | 无默认值,使用之前必须完成赋值 |
内存位置不同 | 堆内存 | 栈内存 |
作用域不同 | 整个对象 | 在所属的大括号中 |
生命周期不同 | 与对象共存亡 | 随着方法的调用而生,随着方法的运行结束而亡 |