面向对象、封装、就近原则及this关键字

news2025/2/10 8:15:18

面向:拿、找;
对象:能干活的东西;
面向对象编程:拿东西过来做对应的事;
即,分别找对应的“对象”完成对应的“事件”。因此学习内容包括:
①学习各种已存在的对象并使用;
②学习设计对象并使用。

面向对象的三大特征:

  1. 封装;
  2. 继承;
  3. 多态。

一、 类和对象

(设计图):是对象共同特征的描述
对象:是真实存在的具体东西
在Java中,必须先设计类,才能获得对象。
在这里插入图片描述

  • 用来描述一类事物的类,专业叫做: Javabean类
    在Javabean类中,是不写main方法的。
  • 在以前,编写main方法的类,叫做测试类
    我们可以在测试类中创建javabean类的对象并进行赋值调用。
    在这里插入图片描述
    在这里插入图片描述

二、封装

封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。

2.1 封装

在这里插入图片描述

Javabean类:

public class BoyFriend {

    //属性
    String name;
    int age;
    String gender;
    
    //行为
    public void sleep(){
        System.out.println("男朋友在睡觉");
    }
    public void eat(){
        System.out.println("男朋友在吃饭");
    }
}

测试类:

public class BoyFriendTest {
    public static void main(String[] args) {
        BoyFriend bf1 = new BoyFriend();
        bf1.name = "陆沉";
        bf1.age = 26;
        bf1.gender = "男";
        System.out.println(bf1.name);
        System.out.println(bf1.age);
        System.out.println(bf1.gender);
        bf1.eat();
        bf1.sleep();
        System.out.println("==================");
        BoyFriend bf2 = new BoyFriend();
        bf2.name = "萧逸";
        bf2.age = 23;
        bf2.gender = "男";
        System.out.println(bf2.name);
        System.out.println(bf2.age);
        System.out.println(bf2.gender);
        bf2.eat();
        bf2.sleep();
    }
}

但仅这样如果出现差错是很难检查出来的,每次输入都用if判断又很麻烦,因此可考虑使用private关键字进行权限修饰。

2.2 private关键字

  • private关键字是一个权限修饰符
  • 可以修饰成员(成员变量和成员方法)
  • 被private修饰的成员只能在本类中才能访问
  • 针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
  • 提供“setXxx(参数)”方法,用于给成员变量赋值,方法用public修饰
  • 提供“getXxx()”方法,用于获取成员变量的值,方法用public修饰
package onClass;

public class BoyFriend {
    //编写女朋友类,创建女朋友类的对象给女朋友的属性赋值并调用女朋友类中的方法。
    //自己思考,女朋友类中有哪些属性,有哪些行为?

    //属性
    private String name;
    private int age;
    private String gender;
    
    // set(给成员变量赋值)和get(对外提供成员变量的值)方法
    public void setName(String n){
        name = n;
    }
    public String getName(){
        return name;
    }
    public void setAge(int a){
        if (a>=18&&a<=28){
            age =a ;
        }else {
            System.out.println("非法参数");
        }
    }
    public int getAge(){
        return age;
    }
    public void setGender(String g){
        if (g=="男"){
            gender = g;
        }else {
            System.out.println("非法参数");
        }
    }
    public String getGender(){
        return gender;
    }


    //行为
    public void sleep(){
        System.out.println("男朋友在睡觉");
    }
    public void eat(){
        System.out.println("男朋友在吃饭");
    }
}

test:

package onClass;

public class BoyFriendTest {
    public static void main(String[] args) {
        BoyFriend bf1 = new BoyFriend();
        bf1.setName("陆沉");
        bf1.setAge(26);
        bf1.setGender("男");
        System.out.println(bf1.getName());
        System.out.println(bf1.getAge());
        System.out.println(bf1.getGender());
        bf1.eat();
        bf1.sleep();
        System.out.println("==================");
        BoyFriend bf2 = new BoyFriend();
        bf2.setName("萧逸");
        bf2.setAge(23);
        bf2.setGender("男");
        System.out.println(bf2.getName());
        System.out.println(bf2.getAge());
        System.out.println(bf2.getGender());
        bf2.eat();
        bf2.sleep();
    }
}

三、就近原则和this关键字

成员变量:定义在类里面的变量;
局部变量:定义在方法里的变量。
在这里插入图片描述
当成员变量和局部变量名字重合时,则会触发“就近原则”,即,离谁近,就用谁。
当不想触发就近原则时,可使用this关键字。“this.变量名”。
因此上面setname部分的代码就可进行优化(因为那里用了n,不符合定义变量“见名知意”的规定):

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

name作为setName方法的局部变量,接收的是test类传过来的String,然后将其赋值给" this.name ",即类里面的成员变量name。
这样就既能“见名知意”,又不会被就近原则影响产生歧义了。

四、构造方法概述

构造方法也叫作构造器、构造函数。
作用:在创建对象的时候给成员变量进行赋值的。

在这里插入图片描述
在这里插入图片描述
总结
1.构造方法的作用?
创造对象的时候,由虚拟机自动调用,给成员变量进行初始化的。

2.构造方法有几种,各自的作用是什么?
无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。·有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。

3.构造方法有哪些注意事项?
任何类定义出来,默认就自带了无参数构造器,写不写都有。
一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写无参数构造器了。
建议在任何时候都手动写上空参和带全部参数的构造方法

五、标准的javabean类

5.1 基本内容

  1. 类名需要见名知意
  2. 成员变量使用private修饰
  3. 提供至少两个构造方法
    ① 无参构造方法
    ②带全部参数的构造方法
  4. 成员方法
    提供每一个成员变量对应的setXxx()/getXxx()如果还有其他行为,也需要写上

5.2 快捷键和插件

使用alt+insert可以进行快捷插入空参、全部参数的构造、set和get方法。
插件“setting-plugin”找ptg,安装,这样在写好属性部分以后,就可以右键直接“Ptg to Javabean”。

5.3 标准Javabean的示例

包括:属性、空参的构造、全部参数的构造、属性分别的set和get方法。

public class User {
    //属性
    private String username;
    private String password;
    private String email;
    private String gender;
    private int age;

    //快捷键:alt+insert
    
    //空参
    public User() {
    }
    
    //全部参数的构造
    public User(String username, String password, String email, String gender, int age) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.gender = gender;
        this.age = age;
    }
    
    //set和get
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

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

六、内存情况

6.1 三种情况

6.1.1 一个对象的内存图

在这里插入图片描述
方法执行完以后就会出栈。

6.1.2 两个对象的内存图

在这里插入图片描述

6.1.3 两个引用指向同一个对象

在这里插入图片描述

6.2 基本数据类型和引用数据类型

基本数据类型:
整数类型
浮点数类型
布尔类型
字符类型

引用数据类型:
除了基本数据类型外的其他

在这里插入图片描述

6.3 this的内存原理

在这里插入图片描述

6.4 成员变量和局部变量

在这里插入图片描述

七、练习与补充

7.1 键盘录入的两套体系

两套体系不能混用,会出现错误。

package ArrayTest;

import java.util.Scanner;

public class KeyInput {
    public static void main(String[] args) {
        //nextInt(); 该方法只能接收Int类型的数据
        //nextDouble();接收小数
        //next();接收字符串
        //遇到空格,制表符,回车就停止接受。这些符号后面的数据就不会接受了

        //第二套体系:
        //nextLine();接收字符串

        //第一套体系:如果空格则直接把空格后的内容给下一个键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入第一个数:");
        int num1 = sc.nextInt();  //假设录入"123 456"
        System.out.println(num1); //这里输出"123"
        System.out.println("请录入第二个数:");
        int num2 = sc.nextInt(); //这里不会让你再录入了,而是直接把空格后赋给num2
        System.out.println(num2);//456
        //第一套体系的nextDouble()和next()都是这样

        //第二套体系:遇到回车才停止
        System.out.println("请录入第一个字符串:");
        String str1 = sc.nextLine();// 录入abc bcd
        System.out.println(str1);//打印abc bcd
        System.out.println("请录入第二个字符串:");
        String str2 = sc.nextLine();//需要继续录入
        System.out.println(str2);
    }
}

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

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

相关文章

DAY21:二叉树(十一)二叉搜索树中的搜索+验证二叉搜索树(坑比较多,复盘)

文章目录 700.二叉搜索树中的搜索二叉搜索树概念二叉搜索树的搜索方式补充总结 思路递归法迭代法注意这里写if-if和if-else if的区别为什么if-if会访问空的root&#xff1f;if-if结构和if-else if-else的区别 迭代法修改结果&#xff1a; 98.验证二叉搜索树&#xff08;坑比较多…

Java小知识

一、lambda ()->{} ()中为接口唯一方法中的参数&#xff0c;可以任意取 {}为接口唯一方法中的执行语句&#xff0c;返回的结果类型必须符合接口中方法返回值的定义 原理理解&#xff1a; Public interface Printable{ String print(String suffix);} 在函数式编程中有一个方…

【哈佛积极心理学笔记】第6讲 乐观主义

第6讲 乐观主义 How can we create consciously and subconsciously a positive environment, where we actually can take out the most moral, the most successful self to appreciate that self. Create a powerful positive situation to bring out the best in people.…

STM32——08-STM32感应开关盖垃圾桶

项目二&#xff1a;感应开关盖垃圾桶 项目需求 检测靠近时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c; 2 秒后关盖 发生震动时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c; 2 秒后关盖 按下按键时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c; 2 秒后…

DAY19:二叉树(九)路径总和+已知中后序构造二叉树

文章目录 112.路径总和思路伪代码完整版写法1写法1必须分开两个函数的原因注意点 完整版写法2写法2不涉及到回溯的原因 106.中序和后序遍历构造二叉树思路伪代码后序数组如何切割出左右区间写法注意区间切割注意中序和前序如何唯一构造二叉树后序和前序能否唯一构造二叉树&…

03-踏入程序诗意:Golang 流程控制的优雅律动

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

Linux 安装Docker完整教程(六)

文章目录 背景一、Docker简介二、docker desktop 和 docker engin 区别三、Linux 安装Docker1. 安装docker的前置条件&#xff1a;2. 查看Docker版本3. 检查是否安装过Docker4. Docker的自动化安装 (不想自带化安装的可跳过本步骤&#xff0c;选择手动安装)5. Docker手动安装&a…

第二章CompletableFuture

文章目录 Future和Callable接口FutureTask实现类为什么引出FutureTask Future到CompletableFutureFuture优点Future的缺点get()阻塞isDone()轮询Future应用现状 CompletableFuture基本介绍CompletionStage核心的四个静态方法&#xff08;分为两组&#xff09;runAsync无返回值s…

数字人解决方案——实时对话数字人源码与环境配置

前言 1.从技术角度来看&#xff0c;现在的数学人就是一个缝合怪&#xff0c;把各种技术点都整合在一起&#xff0c;用来实现直播、对话等数字人。技术流程大概如下图&#xff1a; 其实最重要的一环应该属于LLM(大型语言模型)&#xff0c;LLM相当于一个人的意识&#xff0c;如果…

外卖订单管理系统(Javaweb+Mysql)

程序源码 可以通过上方代码包.rar文件下载&#xff0c;也可以在下方链接下载 链接: https://pan.baidu.com/s/1OruBEcEK70DtUbvA8UIE-w?pwddkdg &#xff08;数据库sql文件在项目根目录下data -> sql&#xff09; 设计报告 【金山文档】 外卖订单管理系统设计报告 http…

编译原理期末速成–正规式、NFA转DFA、DFA的简化

编译原理期末速成–正规式、NFA转DFA、DFA的简化 文章目录 编译原理期末速成--正规式、NFA转DFA、DFA的简化什么是DFA、NFA&#xff1f;看个题消化一下步骤一&#xff1a;步骤二&#xff1a;步骤三&#xff1a;步骤四&#xff1a;步骤五&#xff1a;步骤六&#xff1a;步骤七&a…

POJ The Game

原题目&#xff1a;传送锚点 1.题目 The Game Description A game of Renju is played on a 19*19 board by two players. One player uses black stones and the other uses white stones. The game begins in an empty board and two players alternate in placing black …

面对工作中的失误:从错误中学习与成长

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

C99的一些新特性记录

固长类型头文件<stdint.h> 由于历史原因&#xff0c;C语言中实现的整型数只保证了在不同硬件体系中的最小长度&#xff0c;因此在使用时&#xff0c;需要根据代码实际运行的平台来确定类型的长度&#xff0c;这导致代码非常不方便移植。C99标准通过增加固长类型头文件引入…

【Unity3D】屏幕深度和法线纹理简介

1 前言 1&#xff09;深度纹理和法线纹理的含义 深度纹理本质是一张图片&#xff0c;图片中每个像素反应了屏幕中该像素位置对应的顶点 z 值相反数&#xff08;观察坐标系&#xff09;&#xff0c;之所以用 “反应了” 而不是 “等于”&#xff08;或 “对应” &#xff09;&am…

chatgpt赋能python:Python浮点型转换为整型的方法和应用场景

Python浮点型转换为整型的方法和应用场景 介绍 Python的浮点型和整型在数值计算中应用广泛。有时候我们需要将一个浮点数转换为整数&#xff0c;这时候就需要使用Python提供的一些函数来完成转换。本文将介绍Python浮点型转换为整型的方法和应用场景。 浮点型和整型的区别 …

初探MyBatis实现简单查询

一、创建数据库与表 1、创建数据库 在Navicat里创建MySQL数据库 - testdb&#xff0c;采用utf8mb4字符集 2、创建用户表 CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(50) DEFAULT NULL,age int(11) DEFAULT NULL,address varchar(255) DEFAULT…

SpringBoot的日志文件

文章目录 前言日志怎么用自定义打印日志⽇志级别 - 了解⽇志持久化Lombok提供的方法 前言 上文讲述了 SpringBoot项目的构建 与配置文件的使用 ,下面来介绍 SpringBoot 的日志文件 , 日志在程序 中起到的作用是很大的 , 谁写的程序能不报错误呢, 日志就是一种让你快速找到错误…

Linux环境变量配合权限维持手法

前言&#xff1a; 权限维持的时候有其中有两种&#xff0c;一种是alias别名、第二种是prompt_command&#xff0c;这里我们可以将其添加到环境变量中&#xff0c;每次运行的时候都可以使用&#xff0c;从而达到权限控制的效果&#xff0c;而不是临时执行的效果。 环境变量&am…

harbor仓库的搭建

harbor仓库的搭建 前言一、准备二、registry私有仓库拉取registry镜像上传镜像下载镜像添加私有仓库解析配置使用非加密端口拉取镜像 三、仓库加密域名保持一致部署客户端证书&#xff0c;不然会报错验证仓库认证删除registry&#xff0c;重建登录仓库&#xff0c;不然无法上传…