封装,static,代码块,对象的打印

封装,static,代码块,对象的打印

  • 1. 封装
    • 1.1 封装的概念
    • 1.2 包的概念
    • 1.3 访问修饰限定符
    • 1.4 被封装的属性如何set和get?
  • 2. static
    • 2.1 再谈学生类
    • 2.2 static修饰成员变量
    • 2.3 static修饰成员方法
    • 2.4 static成员变量初始化
  • 3. 代码块
    • 3.1 普通代码块
    • 3.2 构造代码块(实例代码块)
    • 3.3 静态代码块
    • 3.4 执行顺序
  • 4. 对象的打印

1. 封装

面向对象语言的三大特性是:封装,继承,多态。下面我们就来了解一下其中的封装

1.1 封装的概念

什么是封装?顾名思义,就是将一个东西用包装纸包起来,不让外界所看到。而在面向对象的编程语言中,封装的含义亦是如此,将一个类中的东西私密化,使只有类中才能使用它,类外则无法访问。封装的实际意义就是,将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

1.2 包的概念

在一个项目中,经常分给很多个人来分工完成,为了防止因为类名相同而冲突,因此引入了包,在不同的包,类名可以相同。包相当于电脑里的文件夹,给电脑里的文件进行分类。那么如何去创建一个包呢?

演示:
在这里插入图片描述
再输入包的名字,这样一个包就创建完成了


当我们在创建的一个包里创建一个Java文件时,最上面会自动出现一行代码
在这里插入图片描述
这就代表这个Java文件在这个包底下


当我们需要在一个包底下调用另一个包里的一个类时,就需要引入这个包下的类,这时就需要使用到import关键字
在这里插入图片描述

当我们点击方框时,编译器就会自动帮我们在这个Java文件的最上面加上一行代码
在这里插入图片描述
这就代表了引入这个包底下的这个类。引入时要么具体到类,要么在包路径最后加*(代表引入包里的所有类),更建议使用第一种,具体到类

1.3 访问修饰限定符

在类和对象一文中,我们经常使用到的public,其实就是一个访问修饰限定符。当然,访问修饰限定符不止public一个,还有private,default,protected。他们可以用来修饰变量、方法、类,来限定他们所能被访问的权限,权限如图:

在这里插入图片描述

其中,被private修饰的变量,只能在同一个包的同一个类中,才能被访问,这也就达到了封装的效果!

1.4 被封装的属性如何set和get?

通过前面,我们了解到,被封装的属性只能在类中才能去访问,如果想在类外进行访问,该怎么办呢?我们可以通过setter方法或者构造方法去给设置属性,可以通过getter方法取得属性

如何快速生成构造方法在上一篇文章已经讲解了,下面来演示如何快速生成getter和setter方法

第一步,按住alt + insert
在这里插入图片描述
第二步,选择是只生成setter,还是只生成getter,还是都生成!
在这里插入图片描述
第三步,选择需要生成方法的属性即可

生成结果:

public class Student {
    private String name;
    private int age;

    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;
    }
}

2. static

在之前的C语言的学习中,我们也同样学习了static关键字,static就是静态的意思。被static修饰的变量、方法具有静态属性。当你想将一个属性/方法设置为这个类所公有的,而不是具体地属于某一个对象,这时就可以将其设置为静态的

2.1 再谈学生类

我们再以学生类为例,比如有三个学生对象,他们各有各的姓名、年龄,但是他们在同一个教室上课,而教室并不是某一个学生对象所特有的,而是公共的资源,这时就可以将教室这一属性设置为静态成员变量

public class Student {
    public String name;
    public int age;
    public static String classroom = "1班";//static修饰的成员变量

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void Sleep() {
        System.out.println("睡觉");
    }
}
public class Test3 {
    public static void main(String[] args) {
        Student student = new Student("zhangsan", 18);
        System.out.println(student.name + " " + student.age + " " + student.classroom);
    }
}

2.2 static修饰成员变量

被static修饰的成员不属于对象,而是属于类,因此又叫做类变量。类变量存储在方法区,而不是堆区,这也是为什么类变量属于类,而不属于对象。尽管既可以通过实例化对象来访问类变量,又可以通过类,又可以使用类名来直接访问类变量,但更推荐使用通过类名直接访问类变量!

下面来看一段代码,深入来理解类变量属于类,而不是对象

public class Student {
    public String name;
    public int age;
    public static String classroom = "1班";

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student student = null;
        System.out.println(student.classroom);
        //System.out.println(student.name);//报错!
        //System.out.println(student.age);//报错!
    }
}

运行上述代码,可以发现,尽管student为null,但是依然可以使用student去访问classroom,而普通成员变量则不行!

这是因为,静态的成员变量是不依赖于对象的,因此,即使对象未实例化,或者为null,依然可以访问;但普通的成员变量依赖于对象,如果对象未实例化就去访问,就会出现”空指针“异常(NullPointerException)。

2.3 static修饰成员方法

static不仅可以用来修饰成员变量,也可以用来修饰成员方法,被static修饰的成员方法又叫做类方法,同样地,类方法不属于对象,而是属于类!

当我们将类变量封装起来,如果在类外想去访问时,就需要用到setter或者getter,我们用IDEA自动生成的代码来看看

public class Student {
    private String name;
    private int age;
    private static String classroom = "1班";

    public static String getClassroom() {
        return classroom;
    }

    public static void setClassroom(String classroom) {
        Student.classroom = classroom;
    }
}

不难发现,与普通成员变量生成的setter和getter有所不同,多了个static,这就是类方法!与类变量一样,类方法既可以通过对象的引用去访问,也可以通过类名直接去访问,更推荐第二种。

我们也可以把static去掉,这样也可以,如果这样,这就是非静态方法了,如果需要去访问这个方法时,就必须先要实例化这个对象,然后只能通过对象的引用去调用这个方法了!

注:

  • 静态方法中,不能直接使用非静态的成员变量和方法,也不能出现this
  • 而在非静态的方法中,可以直接调用静态方法和静态成员变量
  • 静态方法无法重写,无法用来实现多态

如果在静态方法中要使用非静态的成员变量和方法,必须先实例化对象,再通过对象的引用来访问
在这里插入图片描述
在这里插入图片描述

2.4 static成员变量初始化

静态成员的初始化可以通过两种方式:

  1. 就地初始化,即在定义静态成员时,就进行初始化
  2. 通过静态块进行初始化

3. 代码块

代码块是使用用{}定义的一段代码,代码块可分为:

  • 普通代码块
  • 构造代码块(实例代码块)
  • 静态代码块

3.1 普通代码块

普通代码块定义在方法中,例如:

public class Test1 {
    public static void main(String[] args) {
        {
            int a = 100;
            System.out.println("a = "+a);
        }
        int a = 200;
        System.out.println("a = "+a);
    }
}

main方法里的花括号里的就是一个普通代码块,有没有发现 “好像a被定义了两次” ,实际上并不是这样的,第一个a相对于第二个a来说就是局部变量,当出了花括号后,变量a就会被销毁,然后再去定义a,也就不会报错了,这可在一定程度上避免因重复定义同一个变量而报错的情况

本质上,定义在main方法里的代码都是普通代码块,而main方法里大括号里的时普通代码块里的普通代码块。

普通代码块用的比较少!

3.2 构造代码块(实例代码块)

构造代码块,有的书上也叫实例代码块,是定义在类中,方法外的代码块,一般用来初始化实例成员变量,例如:

在这里插入图片描述
注意普通代码块与实例代码块的区别:

  • 普通代码块是定义在方法中的
  • 而实例代码块是定义在类中,方法外的

3.3 静态代码块

静态代码块定义在类中,方法外,一般用来初始化静态的成员变量。当类被加载时,静态代码块就会被触发!

例如:

public class Student {
    private String name;
    private int age;
    private static String classroom;
    
    //静态块
    static {
        classroom = "1班";
    }
}

3.4 执行顺序

先看代码:

public class A {
    {
        System.out.println("A中的构造块");
    }
    public A() {
        System.out.println("A中的构造方法");
    }
    static {
        System.out.println("A中的静态块");
    }
}
public class Test {
    public Test() {
        System.out.println("Test中的构造方法!");
    }
    {
        System.out.println("Test中的构造块");
    }
    static {
        System.out.println("Test中的静态块");
    }
    public static void main(String[] args) {
        A a = new A();
    }
}

运行结果:
在这里插入图片描述
这说明其先后顺序为:静态块 -> 构造块 -> 构造方法,当主类中有静态块时,静态块会优先于main方法执行,因为静态块在Test类被加载时就会执行!

这时有人就会有疑问,为什么Test中的构造方法和构造块没有执行呢?这是因为,构造方法和构造块在创建对象时才会执行,且只执行一次,而main方法内并没有创建Test的对象,就不会调用构造方法和构造块了!

public class Test {
    public Test() {
        System.out.println("Test中的构造方法!");
    }
    {
        System.out.println("Test中的构造块");
    }
    static {
        System.out.println("Test中的静态块");
    }
    public static void main(String[] args) {
        Test test = new Test();
        A a = new A();
    }
}

如果实例化Test类,就会执行构造方法和构造块!

运行结果:
在这里插入图片描述

4. 对象的打印

先看代码:

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student student = new Student("zhangsan", 18);
        System.out.println(student);
    }
}

运行结果:
在这里插入图片描述
我们知道,student是对象的引用,保存的是该对象的”地址“,因此,直接打印对象的引用得到就是一个”地址“

那么,如何去打印一个对象的具体属性呢?可以在Student中重写toString()方法
在这里插入图片描述
按住alt+insert,选择toString()
在这里插入图片描述
点击OK即可!

生成的代码:
在这里插入图片描述
当我们再次运行代码时,就会发现输出的不再是一个”地址“了,而是成员的具体属性。本质上就是输出toString()方法的返回值!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python的k-means聚类分析算法的实现与应用,可以用在电商评论、招聘信息等各个领域的文本聚类及指标聚类,效果很好

以微博考研话题为例 思路步骤: 数据清洗: 使用pandas读取数据文件,并进行数据清洗和预处理,包括去除重复值、数据替换等。 数据处理实现: 数据处理的过程如下: 数据清洗主要包括去重和数据转换两个步骤…

C++的第一道门坎:类与对象(二)

一.类中生成的默认成员函数详解 0.类的6个默认成员函数 编译器会给类生成六个默认成员函数,在类中即使我们什么都不做,也会自动生成。 默认成员函数:用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。 下面我们逐…

ubuntu 配置用户登录失败尝试次数限制

前言: 通过修改pam配置来达到限制密码尝试次数! 1:修改 /etc/pam.d/login 配置(这里只是终端登录配置,如果还需要配置SSH远程登录限制,只配置下面的 /etc/pam.d/pam.d/common-auth 即可) vim…

如何克隆非默认分支

直接git clone下来的我们知道是默认分支,那如何克隆其他分支呢: 比如这个,我们想克隆AdvNet。 我们可以在本地文件夹打开Git Bash 依次输入: git clone --branch AdvNet https://github.com/wgcban/SemiCD.git cd SemiCD git b…

【全开源】旅游系统源码(Uniapp+FastAdmin+ThinkPHP)

一款基于UniappFastAdminThinkPHP开发的旅游系统,包含消费者端(手机端)、机构工作人员(手机端)、机构端(PC)、平台管理端(PC)。机构可以发布旅游线路、景点项目&#xff…

计算机网络学习笔记——网络层(b站)

目录 网络层概述 网络层提供的两种服务 ①面向连接的虚电路服务 ②无连接的数据报服务 IPv4 路由选择 路由器转发IP数据报 静态路由选择 动态路由选择 路由信息协议RIP 开放最短路径优先OSPF(Open Shortest Path First) 内部网关协议IGP&…

【MATLAB】数字滤波器的设计

一、引言 在信号处理过程中,所处理的信号往往混有噪声,从接收到的信号中消除或减弱噪声是信号传输和处理中十分重要的问题。根据有用信号和噪声的不同特性,提取有用信号的过程称为滤波,实现滤波功能的系统称为滤波器。在以往的模拟电路中用的…

10.RedHat认证-Linux文件系统(上)

10.RedHat认证-Linux文件系统(上) ⽂件系统,顾名思义,是⼀个组织⽂件的“系统(system)”。file system ⽂件系统是⽤来组织⽂件的,通俗⼀点理解的话,⽂件系统是⽤来存储⽂件的。 硬盘是不能直接存放⽂件或数据。 我们通过将硬…

美光EMMC芯片丝印型号查询 8LK17/D9PSK, OXA17/JY997

问题说明 最近在使用美光EMMC的时候,发现通过芯片丝印查询不到 芯片的规格说明书; 经过查阅资料,发现美光的EMMC芯片 “由于空间限制,FBGA 封装组件具有与部件号不同的缩写部件标记”,需要通过官网查询丝印的FBGA cod…

百度智能云千帆AppBuilder升级!开放多源模型接入,思考模型再次加速!

>>【v0.5.4版本】 上线时间:2024/5/24 关键发版信息: 大模型优化:开放多源模型接入,思考模型再次加速! Agent思考模型:新增AppBuilder专用版模型ERNIE Speed-AppBuilder,自主任务规划…

Euler 欧拉系统介绍

Euler 欧拉系统介绍 1 简介重要节点与版本EulerOS 特色EulerOS 与 openEuler 区别联系Euler 与 HarmonyOS 区别联系 2 openEuler特色支持 ARM,x86,RISC-V 等全部主流通用计算架构融入 AI 生态嵌入式实时能力提升引入 OpenHarmony 一些突出功能 参考 1 简…

BIO/NIO学习

在传送文件的时候常常出现这么一个问题,就是当客户端的文件全部传送完了之后,服务器没有接收到客户端那边传过的停止信号,所以服务器也就跟着客户端停止运行了,我们可以使用 try {socket.shutdownOutput();} catch (IOException e…

VSCode安装platformio插件

文章目录 一、安装VSCode二、安装platformio(一)整理文件夹(二)整理Python环境(三)安装platformio 三、创建ESP8266项目四、使用命令行创建项目五、创建项目太久怎么办六、参考链接 一、安装VSCode VSCode…

这款网站测试工具,炫酷且强大!【送源码】

随着互联网的普及和发展,Web 应用程序的数量也越来越多,各种网络问题也是层出不穷,因而监测这些 Web 应用程序的性能和可用性变得非常重要。 今天的文章,了不起和大家分享一款十分好用的的网站分析项目 - Web-Check。 项目简介 …

xss-labs之level9、level10

一、level9 1、测试分析 尝试了之前的payload,发现都不行,看源码发现多了个strpos函数, strpos() 是一个在 PHP 中用于查找子串首次出现位置的函数。它接受两个参数:要搜索的字符串(主字符串)和要查找的子…

【PHP【实战训练】系统性学习】——最经典的web端头像上传,数据库内容安全精简

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

DSP6657 GPIO中断学习

1 简介 使用创龙板卡的KEY2按键通过中断的方式控制LED3的亮灭 2 中断学习 在C665x设备上,CPU中断是通过C66x CorePac中断控制器进行配置的。该中断控制器允许最多128个系统事件被编程到任意12个CPU可屏蔽中断输入(CPUINT4至CPUINT15)、CPU…

Spring:事务

1. 简介 spring对jdbc进行封装&#xff0c;简化对数据库的操作 2. HelloWorld 1. 搭建模块 2.加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>s…

5.28OpenMV入门

10分钟快速上手 OpenMV中文入门教程 使用的元件 先安装好&#xff0c;上述链接上手 IDE显示颜色阈值&#xff0c;同时也配有示例文件&#xff0c;如下图打开&#xff0c;helloworld 你好&#xff0c;世界&#xff01; OpenMV中文入门教程&#xff0c;在官方也有每一个的详细…

那智不二越机器人维修案例分享

那智不二越工业机器人在工业范围内广泛应用于各种生产领域。其示教器作为人机交互的重要设备&#xff0c;常常需要定期维护和Nachi不二越机械手示教盒修理。 【Nachi不二越机器人示教器维修步骤】 1. 关闭电源 在进行任何那智不二越机器人维修操作之前&#xff0c;务必确保机器…