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

news2024/11/27 19:39:58

封装,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()方法的返回值!
在这里插入图片描述

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

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

相关文章

JVM、JRE 和 JDK 的区别,及如何解决学习中可能会遇到的问题

在学习Java编程的过程中,理解JVM、JRE和JDK之间的区别是非常重要的。它们是Java开发和运行环境的核心组件,各自扮演不同的角色。 一、JVM(Java Virtual Machine) 定义 JVM(Java虚拟机)是一个虚拟化的计算…

基于 vuestic-ui 实战教程 - 登录篇

1. 简介 登录做为一个系统的门面,也是阻挡外界的一道防线,那在vuestic-ui中如何做登录功能呢。在这里就之间沿用初始版本的Login页面,作为一个演示模板,后续需要改进的读者可以在此篇文章的基础上修改。 2. 登录接口相关api 与 t…

2024-5-28 石群电路-16

2024-5-28,星期二,20:14,天气:晴,心情:晴。今天没有什么特别的事情发生,不过返校假期已经开始啦,和女朋友逛了街,吃了好吃的,学习也当然不能落下啦&#xff0…

LeetCode/NowCoder-栈和队列OJ练习

孜孜不倦:孜孜:勤勉,不懈怠。指工作或学习勤奋不知疲倦。💓💓💓 目录 说在前面 题目一:括号匹配问题 题目二:用队列实现栈 题目三:用栈实现队列 题目四:设…

Javascript--词法作用域

词法作用域 词法阶段 大部分标准化语言编辑器的第一个工作阶段叫做词法化,词法化会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词语义。 简单来说,词法作用域就是在词法阶段的作用域, function fo…

《架演》共创者第一次线上沟通会议总结

《架演》共创者第一次线上沟通——启动会 会议主题:《架演》共创启动会议会议时间:2024年5月28日,20:00 - 21:00会议地点:腾讯会议主持人:寒山参会人员: 夏军、mirror、刘哥、悟缺席人员:可心、…

为表格添加背景色:\rowcolor, \columncolor,\cellcolor

设置行的背景 \rowcolor 是 LaTeX 中用于设置表格行的背景色的命令。它可以使表格更加美观和易于阅读。rowcolor 命令通常与 colortbl 宏包一起使用。 语法如下&#xff1a; \rowcolor{<color>}其中 表示要设置的背景色&#xff0c;可以是预定义的颜色名称&#xff08…

BIO/NIO学习

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

项目构建工具maven

一、概述 1、maven是apache的一个开源项目&#xff0c;是一个优秀的项目构建/管理工具 2、apache(软件基金会、非盈利组织、管理维护一些开源项目) 二、功能 1、管理项目中jar包和jar包与jar包之间的依赖 2、完成项目编译、测试、打包 三、核心文件 pom.xml:在里面配置相…

华为机考入门python3--(26)牛客26-字符串排序

分类&#xff1a;字符串 知识点&#xff1a; 字符串是否仅由字母构成 my_str.isalpha() 字母列表按小写排序 letters.sort(keylambda x: x.lower()) 题目来自【牛客】 def custom_sort(input_str):letters []non_letters []for char in input_str:if char.isalpha…

华语电影新力量用短片讲述:一部好电影,影响深远

近日&#xff0c;上汽大众杯澳涞坞全球青年电影短片大赛的公益短片《首映》在澳门澳涞坞首映发布&#xff0c;这一作品不仅展示了电影人的真实生活&#xff0c;更深刻地传达了对华语电影的敬意以及对青年电影人的殷切期望。 短片《首映》的制作团队堪称豪华。资深导演杨枫担任…

IT人的拖延——一放松就停不下来,耽误事?

拖延的表现 在我们的日常工作中&#xff0c;经常会面对这样一种情况&#xff1a;因为要做的Sprint ticket比较复杂或者长时间的集中注意力后&#xff0c;本来打算休息放松一下&#xff0c;刷刷剧&#xff0c;玩玩下游戏&#xff0c;但却一个不小心&#xff0c;没控制住时间&am…

IGMP——组播成员端网络协议

目录 一.IGMP基本概念 &#xff08;1&#xff09;组播转发困境 &#xff08;2&#xff09;感知组播成员方式 &#xff08;3&#xff09;IGMP版本 二.IGMP各版本的区别与联系 &#xff08;1&#xff09;IGMPV1 1.普遍组查询报文 2.成员关系报告报文 3.IGMPV1报文格式 4…

生成验证码的奥秘:从列表到字符串的魔法转换

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;验证码生成的背景与需求 二、生成验证码的方法一&#xff1a;列表生成…

ACM Proceedings Template 使用方法

模板导入 打开ACM Primary Article Template官网&#xff0c;可以看到自带overleaf模板&#xff0c;接下来我们使用overleaf来自动导入模板。 选择你需要的ACM Conference or Journals模板&#xff0c;然后Open as Template 栏目说明 接下来依次解释一下左边栏目的作用 …

装机必备——360压缩安装教程

装机必备——360压缩安装教程 软件下载 软件名称&#xff1a;360压缩 软件语言&#xff1a;简体中文 软件大小&#xff1a;3.38M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 下载通道①迅雷云盘丨…

14、类与对象(采用图解方式分析内存结构)①

在idea中创建一个新文件&#xff0c;名称为Hello.java 其中&#xff0c;Hello就是一个类&#xff0c;main是这个类里面的方法&#xff0c;这意味着我们在学习的时候已经在使用类了。 对象和类 一、概念二、⭐内存分配机制分析Ⅰ、基本内存结构⭐⭐Ⅱ、调用类方法的内存分析&am…

HCIP的学习(24)

第七章&#xff0c;VLAN—虚拟局域网 ​ 通过在交换机上部署VLAN技术&#xff0c;将一个规模较大的广播域在逻辑上划分成若干个不同的、规模较小的广播域。 ​ IEEE 802.1Q标准----虚拟桥接局域网标准----Dot1Q标准 标签协议标识符&#xff1a;0x8011&#xff08;代表数据帧是8…

MySQL数据库案例实战教程:数据类型、语法与高级查询详解

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【Python-OS】os.path.splitext()

作用&#xff1a;将文件路径分割成文件名和扩展名两部分。 slide_id, _ os.path.splitext(slide) print("slide:") print(slide) print("slide_id:") print(slide_id)注&#xff1a; slide是文件名&#xff0c;可以自行赋值