Bootstrap

Java开发从入门到精通(七):Java的面向对象编程OOP:类的定义语法、类对象、属性、方法、实例化、this关键字、构造器

(一)Java的面向对象编程

1.1 什么是面向对象

在 Java 中,面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将程序设计的重点放在对象和它们之间的关系上。对象是程序
中用来表示现实世界中的实体或概念的实体,例如人、动物、汽车、账户等。

1.2 面向对象和面向过程的区别

面向对象和面向过程是两种不同的编程范式,它们在编程思路和代码组织方式上有所不同。

  • 面向过程编程(Procedure-OrientedProgramming)是一种以过程为中心的编程方式,它将问题分解为一系列步骤或函数,并按照顺序执行这些步骤来解决问题。在面向过程编程中,程序由一系列函数组成,每个函数执行一个特定的任务。
  • 相比之下,面向对象编程强调以对象为中心,将问题抽象为对象,并通过对象之间的交互来解决问题。在面向对象编程中,程序由一系列对象组成,每个对象具有自己的属性和行为。

以下是面向对象编程和面向过程编程之间的一些主要区别:

  • 编程思路:面向对象编程更注重模拟现实世界中的事物和关系,将问题抽象为对象;而面向过程编程更注重问题的步骤和算法。
  • 代码组织:面向对象编程将代码封装在对象内部,通过对象之间的交互来组织代码;而面向过程编程将代码组织为一系列函数。
  • 数据封装:面向对象编程将数据和相关的操作封装在一起,对象对其内部数据进行保护;而面向过程编程中,数据通常以全局变量或参数的形式在函数之间传递。
  • 代码重用:面向对象编程通过继承和多态性实现代码重用;而面向过程编程中,代码重用通常通过函数的调用和参数传递来实现。
  • 可维护性:面向对象编程的代码更容易理解和维护,因为它更贴近现实世界的概念;而面向过程编程的代码可能更容易理解和维护,因为它更关注问题的步骤和算法。

1.3 面向对象开发设计特征

  • 开发的过程:其实就是不断的创建对象,使用对象, 指挥对象 ,做事情。
  • 设计的过程:其实就是在管理和维护对象之间的关系。

面向对象的特征:

  • 封装(encapsulation)
  • 继承(inheritance)
  • 多态(polymorphism)

面向对象编程的优点

  • 提高代码复用性。
  • 使用者无需关心具体细节。
  • 转变程序员角色,更加符合人的思维习惯。

1.4 面向对象语法

  • 创建对象模板,用来供不同的对象调用
  • 然后开发一个一个的对象,把数据交给对象,再调用对象的方法来完成对数据的处理
  • 属性: 对应类中的成员变量。
  • 行为: 对应类中的成员函数。

类的语法格式:

  • 定义类其实在定义类中的成员(成员变量和成员函数)
public class Student {  //声明类
    String name;  //定义成员变量
    public void printTotalScore() {  //成员方法
        System.out.println();
    }
}

面向对象案例解释:

  • 计算机是用来处理数据的
  • java使用变量来存储单个数据,数组存储多个数据
  • 在处理波妞的数据时需要先创建波妞对象,再赋值数据给她,这就需要用到OOP

在这里插入图片描述

1.4.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);
    }
}

1.4.2 实例化对象

实例化对象向模板传递不同的对象数据,让模板来处理,然后返回我们要的结果

public class Test {
    public static void main(String[] args) {
        // 目标: 面向对象编程快速入门。// 1、创建一个学生对象,封装播妞的数据
        Student s1 = new Student();
        s1.name = "播妞";
        s1.chinese = 100;
        s1.math = 100;
        s1.printTotalScore();s1.printAverageScore();


        // 2、再创建一个学生对象,封装播仔的数据
        Student s2 = new Student();s2.name ="播仔";
        s2.chinese = 59;
        s2.math = 100;
        s2.printTotalScore();
        s2.printAverageScore();
    }
}
  • 这种编程套路是怎么出来的?有什么好处呢?

在这里插入图片描述

  • 汽车的数据 找汽车对象处理
  • 手机的数据 找手机对象处理
  • 学生的数据 找学生对象处理
  • 符合人类思维习惯,编程更简单、更直观

1.4.3 对象又该怎么理解?

  • class也就是类,也称为对象的设计图 (或者对象的模板)也就是表的设计者 整个代码就是写了一个表的模板

在这里插入图片描述

  • public class student 表示设计的表是一个学生表
  • string name 表示表的字段内容
  • viod printAverageScore 表示怎么处理表的数据 (求和 平均值)

在这里插入图片描述

  • 对象其实就是一张表
  • 对象本质上是一种特殊的数据结构
  • 实例化对象其实就是给这个表填上数据,
  • 方法就是处理这个成绩 算出这个成绩的平均分 总和

在这里插入图片描述

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

程序在执行时先将test.class加载进方法区。接着读取Test类和mian方法到方法区,mian方法是要在栈内存中运行的,所以在栈内存中划出main方法的区域,把mian方法传送过去执行,接着读取发现使用到了学生类,就加载学生类到方法区,包括student的变量和方法,然后是创建s1学生变量,我们说过变量是在栈内存中运行的,所以在栈内存中开辟一个Student s1变量的空间,然后发现S1变量的右边是new 了一个studnet的对象,我们说过new是要在堆内存中运行,所以在堆内存中开辟一个student对象的空间,把对象的变量存储在里面,同时这个空间也会生成对象地址和一个类的地址,类地址指明当前对象是由那一个对象创建出来的,所以类对象会指向student.class 类,而S1存储就是对象的地址,所以当调用类方法时首先会按照s1指向的对象地址找到是哪个对象,然后再有对象地址找到类地址,由类地址指明是对象是哪个类创建的,在这个类中找到要执行的方法,产生结果
在这里插入图片描述

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

  • 类名建议用英文单词,首字母大写,满足驼峰模式,且要有意义,比如: Student、Car…
  • 类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)。
  • 成员变量本身存在默认值,同学们在定义成员变量时一般来说不需要赋初始值(没有意义)
    在这里插入图片描述
  • 一个代码文件中,可以写多个class类,但只能一个用public修饰,且public修饰的类名必须成为代码文件名.
  • 对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了。
  • 如果某个对象没有一个变量引用它,则该对象无法被操作了,该对象会成为所谓的垃圾对象
package com.qianxin.object;

public class Student {
//成员变量
    String name;  //变量初始值:null   自己设置初始值是没有意义的
    double chinese;//变量初始值:0.0
    double math;//变量初始值:0.0
//成员方法
    public void printTotalScore() {
        System.out.println(name + "的总成绩是:" + (chinese + math));
    }

    public void printAverageScore() {
        System.out.println(name + "的平均成绩是:" + (chinese + math) / 2.0);
    }

}

class Techer(){  //可以有多个类

}

1.5.1 多个变量指向同一个对象,需要注意什么?

在这里插入图片描述

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

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

在这里插入图片描述

1.6 This关键字

  • this就是一个变量,可以用在方法中,来拿到当前对象
  • 谁调用对象,这个this就是谁

在这里插入图片描述

public class StudentTest {
        double score;
        
        public void printThis(){
            System.out.println(this);
        }
        
        public void printPass(double score){
                if (this.score > score){
                    System.out.println("恭喜您,您成功考入了哈佛大学了~~");
                } else {
                    System.out.println("落选了~");
                }
        }
}
public class ThisTest {
    public static void main(String[] args) {
        StudentTest s1 = new StudentTest();
        s1.printThis();

        StudentTest s2 = new StudentTest();
        s2.printThis();

        StudentTest s3 = new StudentTest();
        s3.printPass(250);
    }
}

this是怎么获取对象呢
实际上它默认有个参数 (Student this)
在这里插入图片描述

1.7 构造器

在这里插入图片描述

构造器的定义:
在这里插入图片描述
构造器和类同名:

public class GouZaoQi {
    // 无参数构造器
    public GouZaoQi() {

    }

    // 有参数构造器
    public GouZaoQi(String name, double score) {

    }
}

构造器的特点:

  • 创建对象时,对象会去调用构造器
  • 创建对象时,传递值就调用有参数构造器
  • 创建对象时,没有值就调用无参数构造器
public class GouZaoQi {
    // 无参数构造器
    public GouZaoQi() {
		System.out.printn("无参数构造器被触发执行了~");
    }

    // 有参数构造器
    public GouZaoQi(String name, double score) {
		System.out.printn("有参数构造器被触发执行了~");
    }
}

实例化对象调用

public class GouZaoQiTest {
    public static void main(String[] args) {
        GouZaoQi gzq= new GouZaoQi(); //无参数 创建对象时,没有值就调用无参数构造器
    }
}
无参数构造器被触发执行了~
public class GouZaoQiTest {
    public static void main(String[] args) {
        GouZaoQi gzq= new GouZaoQi("潘仔",99);  //有参数 创建对象时,传递值就调用有参数构造器
    }
}
有参数构造器被触发执行了~

在这里插入图片描述

创建对象时,同时完成对对象成员变量(属性)的初始化赋值。

public class GouZaoQiTest {
    public static void main(String[] args) {
        GouZaoQi gzq= new GouZaoQi("小黑",99);  //初始化赋值。
        System.out.println(s2.name);
        System.out.println(s2.score);
        
    }
}
// 有参数构造器
public Student(String name,double score){
	System.out.println("有参数构造器被触发执行了~~");
	this.name = name;
	this.score =score;
}

构造器的注意事项

  • 类在设计时,如果不写构造器,Java是会为类自动生成一个无参构造器的
  • 一旦定义了有参数构造器,Java就不会帮我们的类自动生成无参构造器了,此时就建议自己手写一个无参数构造器出来了
;