java基础之面向对象的思想

news2024/11/24 2:37:32

一、面向对象和面向过程的编程思想对比

  • 面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的(自己干活)。

  • 面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的功能,(指挥对象干活)​。

面向对象和面向过程是相辅相成的,考虑问题的时候,通常采用面向对象的思想,​解决问题的时候通常采用面向过程的思想。

​一个注重整体,一个注重细节。

举例1:吃一盘菜。

​ 面向过程:所有的步骤,我们都需要关心,都需要知道是如何实现的。重点在于过程。

​ 面向对象:先思考,谁可以干炒菜这件事情。我发现,女朋友可以干这件事情,饭店里面的厨师也可以干这件事情,谁可以干,就让谁去干,我们不关心过程,只关心结果。

​ 利用面向对象思想,可以指挥女朋友去炒菜,也可以指挥厨师去炒菜。

​ 举例2:洗衣服

​ 面向过程:每一步都需要我们自己关心,要先泡衣服,再洗衣服,再拧干,再晾起来等等。重点在于过程。

​ 面向对象:先思考,谁可以干洗衣服这件事情。我发现,女朋友可以干这件事情,洗衣机也可以干这件事情,谁可以干,就让谁去干,我们不关心,对象是如何洗衣服,我们不关心过程,只关心结果。

​ 利用面向对象思想,可以指挥洗衣机去洗衣服,也可以指挥女朋友去洗衣服。

 二、面向对象思想的好处

不需要我们去干了,直接指挥对象做事情,我们从实现者,变成了指挥者​

比如我们要获取一个随机数,我们没有自己书写数学中的随机算法,而是思考在java中谁可以干这件事,发现Random可以干这件事情,那我们就让Random去做,​我们不关心实现的过程,只关心最终的结果。

​面向对象,不关心过程,只关心结果。

三、类和对象

类和对象的关系​:

什么是对象?  客观存在的事物皆为对象 ,所以我们也常说万物皆对象

什么是类? 类是对客观世界中的一类具有共同属性和行为的事物的抽象

类与对象之间的关系?

可以将类理解成一张设计图,根据设计图可以创建出具体存在的事物。即根据类去创建对象。

类是对事物的一种描述,对象则为具体存在的事物。

类由什么组成?

  • 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)

  • 行为:指事物能执行的操作,例如:手机事物(打电话,发短信)

类的定义​:

​类的组成是由属性和行为两部分组成

  • ​属性:在类中通过成员变量来实现,(类中方法外的变量)

  • 行为:在类中通过成员方法来实现(和前面的方法相比去掉static关键字)

类的定义步骤:

​ ① 定义类

​ ② 编写类的成员变量

​ ③ 编写类的成员方法

public class Student {
    // 属性 : 姓名, 年龄
    // 成员变量: 跟之前定义变量的格式一样, 只不过位置发生了改变, 类中方法外
    String name;
    int age;

    // 行为 : 学习
    // 成员方法: 跟之前定义方法的格式一样, 只不过去掉了static关键字.
    public void study(){
        System.out.println("学习");
    }
}

对象的创建和使用

  • 创建对象的格式:

    类名 变量名 = new 类名();  

    此时的变量名也叫做对象名。

  • 调用成员的格式:

    对象名.成员变量

    对象名.成员方法();

public class TestStudent {
    /*
        创建对象的格式:
                类名 对象名 = new 类名();
        调用成员变量的格式:
                对象名.变量名
        调用成员方法的格式:
                对象名.方法名();
     */
    public static void main(String[] args) {
        // 类名 对象名 = new 类名();
        Student stu = new Student();
        String name; null
        int age; 0 
         
        // 对象名.变量名
        // 默认初始化值
        System.out.println(stu.name);  // null
        System.out.println(stu.age);   // 0
​
        stu.name = "张三";
        stu.age = 23;
​
        System.out.println(stu.name);  // 张三
        System.out.println(stu.age);   // 23
​
        // 对象名.方法名();
        stu.study();
        // com.itheima.object1.Student@b4c966a
        // 全类名(包名 + 类名)
        System.out.println(stu);
    }
}

 案例 手机类的创建和使用

需求 :首先定义一个手机类,然后定义一个手机测试类,在手机测试类中通过对象完成成员变量和成员方法的使用

分析 :

  • 成员变量:品牌, 价格

  • 成员方法:打电话, 发短信

  • 示例代码:

public class Phone {
    // 品牌, 价格
    String brand;
    int price;

    // 打电话, 发短信
    public void call(String name){
        System.out.println("给"+name+"打电话");
    }

    public void sendMessage(){
        System.out.println("群发短信");
    }
}
public class TestPhone {
    public static void main(String[] args) {
        // 1. 创建对象
        Phone p = new Phone();
        // 2. 给成员变量进行赋值
        p.brand = "大米";
        p.price = 2999;
        // 3. 打印赋值后的成员变量
        System.out.println(p.brand + "..." + p.price);
        // 4. 调用成员方法
        p.call("阿强");
        p.sendMessage();
    }
}

​四、一个对象的内存图

五、二个对象的内存图

六、成员变量和局部变量的区别

故事记忆法:把这五个特点,编成一个小故事去记忆。

小明家,养了一条狗,而且这条狗是一条母狗。有一天,母狗怀小狗了。

小红跟小明说:你家的狗生了吗?

小明说:未生出

:谐音记忆(位置

代码中位置不同:

成员变量在是类中,方法外 ; 局部变量在方法里面或者方法声明上(形参)。

内存中位置不同:

成员变量在堆里面中对应的对象中的; 局部变量在栈里面的。

生命周期

成员变量跟对象有关的。当对象在堆中的空间被开辟出来后,成员变量就存在了。当对象被垃圾回收器回收从内存中消失的时候,成员变量就消失了。

局部变量跟方法有关的。当方法被调用进栈的时候,局部变量就存在了。当方法里面的代码执行完毕了,就要出栈,一旦出栈,方法里面的局部变量就会从内存中消失。

作用范围:

成员变量:整个类中有效 ; 局部变量:只在当前的方法中有效。

:谐音记忆(初始化

成员变量:有初始化值。

局部变量:没有初始化值的,想要使用,必须要先赋值才能使用。

七、private关键字

private关键字和public关键字

都是权限修饰符

  • private​:私有的可以修改成员变量和方法,一旦修饰后只能在本类中使用

  • ​public:公共的可以修饰成员变量和方法,一点修饰后可以在人员地方使用

为什么要用private修饰??

如果没有用private修饰,那么在外界可以获取成员变量的值,也可以直接对成员变量赋值,太危险,不安全,容易把不合理的值赋值给成员变量

为什么要写get和set方法​??

set方法是给成员变量赋值的,可以在set方法中写过滤条件

/*
    学生类
 */
public class Student {
    //成员变量
    private String name;
    private int age;

    //提供get/set方法
    public void setAge(int a) {
        if(a<0 || a>120) {
            System.out.println("你给的年龄有误");
        } else {
            age = a;
        }
    }

    public int getAge() {
        return age;
    }
}
/*
    学生测试类
 */
public class StudentDemo {
    public static void main(String[] args) {
        //创建对象
        Student s = new Student();
        //给成员变量赋值
        s.name = "林青霞";
        s.setAge(30);
       
    }
}

八、就近原则

​当局部变量跟成员变量重名的时候,在使用时,优先使用距离比较近的那个变量

public class Student {
    //姓名 和 年龄
    private String name;
    private int age;

    //name的get和set
    //起变量名的时候,需要见名知意
    //就近原则:
    //当局部变量跟成员变量重名的时候
    //优先使用,距离最近的那个变量
    public void setName(String name){
        //此时有了一个局部变量name跟成员变量重名
        //那么下面这行代码,在使用name的时候,优先使用距离最近的name
        //其实就是把形参name的值,再赋值了给自己。
        //在这个过程,根本没有成员变量name的参与
        name = name;
    }

    public String getName(){
        //此时没有叫做name的局部变量
        //所以下面的return的时候,使用的是成员变量name
        return name;
    }

    //age的get和set
    public void setAge(int age){
        age = age;
    }

    public int getAge(){
        return age;
    }
}

九、this关键字

解决就近原则导致的问题:

当成员变量和局部变量重名的时候,我们可以在成员变量的前面加一个前缀this.

一旦加上了this.变量,就表示当前变量使用成员位置的变量。

public class Student {
    private String name;
    private int age;
​
    public void setName(String name) {
        this.name =  name; //这时候使用d饿就是成员变量的name​
    }
​
    public String getName() {
        return name;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public int getAge() {
        return age;
    }
​
    public void show() {
        System.out.println(name + "," + age);
    }
}

十、封装思想

面向对象的三大特征之一(封装、继承、多态),封装就是隐藏该隐藏的暴露该暴露的。

​封装的好处:通过方法来控制成员变量的操作,提高代码的安全性,把代码用方法进行封装,提高代码的复用性。

十一、构造方法

构造方法的格式和执行时机

  • 格式注意 :

    • 方法名与类名相同,大小写也要一致

    • 没有返回值类型,连void都没有

    • 没有具体的返回值(不能由retrun带回结果数据)

  • 执行时机 :

    • 创建对象的时候调用,每创建一次对象,就会执行一次构造方法

    • 不能手动调用构造方法。 手动调用指的是构造方法不能像其它方法一样通过对象名.方法名调用。

  • 示例代码

class Student {
    private String name;
    private int age;

    //构造方法
    public Student() {
        System.out.println("无参构造方法");
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}
/*
    测试类
 */
public class StudentDemo {
   
}

​构造方法的作用(用于给对象的数据(属性)进行初始化


​
public class Student {
    /*
        格式:
               1. 方法名需要跟类名相同, 大小写也要一致
               2. 没有返回值类型, 连void都没有
               3. 没有具体的返回值(不能由return带回具体的结果)
     */
​
    private String name;
    private int age;
​
    // 1. 如果一个类中没有编写任何构造方法, 系统将会提供一个默认的无参数构造方法
    public Student(){}
​
    // 2. 如果手动编写了构造方法, 系统就不会再提供默认的无参数构造方法了
    public Student(String name, int age){
        this.name = name;
        this.age = age;
        System.out.println("我是Student类的构造方法");
    }
    
     public Student(String name){
        this.name = name;
    }
  
    public void show(){
        System.out.println(name + "..." + age);
    }
}


public class TestStudent {
    public static void main(String[] args) {
        Student stu1 = new Student("张三",23);
        stu1.show();

        Student stu2 = new Student();
    }
}

十二、一个类的标准创建方式

/*
    JavaBean类: 封装数据
 */
public class Student {
    private String name;
    private int age;
//无参构造方法
    public Student() {
    }
//全参构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
//get/set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class TestStudent {
    public static void main(String[] args) {
        // 1. 无参数构造方法创建对象, 通过setXxx方法给成员变量进行赋值
        Student stu1 = new Student();
        stu1.setName("张三");
        stu1.setAge(23);
        stu1.show();

        // 2. 通过带参数构造方法, 直接给属性进行赋值
        Student stu2 = new Student("李四",24);
        stu2.show();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5. 简单说一说uniapp中的语法吧

前言 如果你 知道Vue3并且对Vue3的语法有一定了解&#xff0c;请跳过这一章&#xff0c;由于后续项目主要是基于Vue3TypeScript&#xff0c;因此提前简单概述一些Vue3的基础语法~ 本文的目的是 期望通过对本文的阅读后能对Vue3的每个语法有一个简单的印象&#xff0c;至少要知…

【Linux】动态库与静态库的底层比较

送给大家一句话&#xff1a; 人生最遗憾的&#xff0c;莫过于&#xff0c;轻易地放弃了不该放弃的&#xff0c;固执地坚持了不该坚持的。 – 柏拉图 (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) 底层比较 1 前言2 编译使用比较2 如何加载Than…

连升三级!openGauss单机版从2.1.0经停3.0.0升级至5.0.0

前言 如前文所述&#xff0c;我们的小demo项目起初安装了openGauss的2.1.0版本&#xff0c;由于2.1.0不是长期维护&#xff08;LTS&#xff09;版本&#xff0c;所以要升级到5.0.0LTS。考虑到虽然是DEMO项目&#xff0c;但也有些体验用户&#xff0c;所以为了保障业务连续性&a…

网络基础-Telnet协议

Telnet&#xff08;Telecommunication Network&#xff09;是一种基于文本的远程终端协议&#xff0c;允许用户通过网络连接到远程计算机&#xff0c;并在远程计算机上执行命令&#xff1b;它使用TCP作为传输层协议&#xff0c;并依赖于网络连接在客户端和服务器之间进行通信&a…

商务分析方法与工具(九):Python的趣味快捷-Pandas处理公司财务数据集思路

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Linux部署

先把需要的东西准备好&#xff1a; 第一步解压tomcat&#xff1a; tar -zxvf apache-tomcat-8.5.20.tar.gz 第二步解压jdk: tar -zxvf jdk-8u151-linux-x64.tar.gz 第三步配置Java环境变量&#xff1a; vim /etc/profile 把下面代码放进去&#xff1a; export JAVA_HOME/root…

定时任务的几种实现方式

定时任务实现的几种方式&#xff1a; 1、JDK自带 &#xff08;1&#xff09;Timer&#xff1a;这是java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行&#xff0c;但不能在指定时间运行。…

基于SpringBoot+Vue社区老人健康信息管理系统

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统社区老人健康信息管理系统信息管理难度大&#xff0c;容错…

网络爬虫概述与原理

网络爬虫概述与原理 网络爬虫简介狭义上理解功能上理解常见用途总结 网络爬虫分类通用网络爬虫聚焦网络爬虫增量网络爬虫深度网络爬虫 网络爬虫流程网络爬虫采集策略深度有限搜索策略广度优先搜索策略 网络爬虫简介 通过有效地获取网络资源的方式&#xff0c;便是网络爬虫。网…

【SpringBoot】解锁后端测试新境界:学习Mockito与MockMvc的单元测试魔法

文章目录 前言&#xff1a;Java常见的单元测试框架一.Junit5基础二.SpringBoot项目单元测试1.添加依赖2.SpringBoot单元测试标准结构3.SpringBoot单元测试常用注解 三.单元测试中如何注入依赖对象1.真实注入&#xff08;AutoWired、 Resource&#xff09;2.Mock注入2.1.前言2.2…

数据结构复习指导之树、森林

文章目录 树、森林 考纲内容 复习提示 1.树的存储结构 1.1双亲表示法 1.2孩子表示法 1.3孩子兄弟表示法 2.树、森林、与二叉树的转换 2.1树转换为二叉树 2.2森林转换为二叉树 2.3二叉树转换为森林 3.树和森林的遍历 3.1树的遍历 3.2森林的遍历 树、森林 考纲内容…

开源推荐榜【FunClip是一款完全开源、本地部署的自动化视频剪辑工具】

FunClip是一款完全开源、本地部署的自动化视频剪辑工具&#xff0c;通过调用阿里巴巴通义实验室开源的FunASR Paraformer系列模型进行视频的语音识别&#xff0c;随后用户可以自由选择识别结果中的文本片段或说话人&#xff0c;点击裁剪按钮即可获取对应片段的视频&#xff08;…

zookeeper安装集群模式

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 ZooKeeper是一个分…

JeeSite V5.7.0 发布,Java快速开发平台,Vite5、多项重构重磅升级

JeeSite V5.7.0 发布&#xff0c;Java快速开发平台&#xff0c;Vite5、多项重构重磅升级 升级内容 新增 参数配置 IP 地址黑白名单过滤器动态参数 新增 侧边栏是否展开第一个菜单的开关 first-open 新增 AesTypeHandler 处理字段数据加密解密或脱敏 新增 JsonTypeHandler …

247 基于matlab的梁的振型仿真

基于matlab的梁的振型仿真。利用有限元理论&#xff0c;求二维梁的固有频率和振型。短边固定&#xff0c;给定长度、横截面积&#xff0c;弹性模量及材料密度已知。并对比理论计算结果进行分析。各参数自己设定。程序已调通&#xff0c;可直接运行。 247 梁的振型仿真 固有频率…

Linux环境下parted工具使用

在工作中&#xff0c;我们经常会遇到大于分区大于2T的磁盘&#xff0c;由于系统盘最大不能超2T&#xff0c;我们会在做raid时将划分VD来进行装系统&#xff0c;但系统自动安装后无法将磁盘全部识别出来&#xff0c;管理员有时会要求手动对分区进行挂载&#xff0c;这个文档介绍…

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下 1、收放卷+排线控制 收放卷+排线控制系统框图-CSDN博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代…

将python库下载到本地安装—Pypi官网wheel版本选择详解—小白详解版

python库—本地安装文件下载&#x1f680; 在项目中需要在内网环境下配置python的环境&#xff0c;因此需要将用于安装python库的文件下载到本地传到内网环境当中然后再安装&#xff0c;通过这契机我开始了解了一下如何离线下载安装python的第三方库&#xff0c;以及配置本地的…

【Docker】Ubuntu下Docker的基本使用方法与常用命令总结

【Docker】docker的基本使用方法 镜像image与容器container的关系基本命令- 查看 Docker 版本- 拉取镜像- 查看系统中的镜像- 删除某个镜像- 列出当前 Docker 主机上的所有容器&#xff0c;包括正在运行的、暂停的、已停止的&#xff0c;以及未运行的容器- 列出当前 Docker 主机…

Matlab 验证 复数的幂计算规则

复数的幂计算规则 close all a9; b0:0.1:5;result1 exp(1j*2*pi*a.*b); result2 (exp(1j*2*pi*a)).^b; idxfind(result1result2); b_idxb(idx);figure plot(b,angle(result1(:)),-r*) hold on plot(b,angle(result2(:)),bo) grid on