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

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

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

相关文章

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

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

java第十七课 —— 递归

方法递归调用 递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题,同时可以让代码变得简洁。 递归重要规则 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。方…

922. 按奇偶排序数组 II - 力扣

1. 题目 给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。 你可以返回 任何满足上述…

微服务架构-异步消息传递设计模式

微服务架构-异步消息传递设计模式 异步消息允许服务发送消息后立即返回,而不需要等待消息被处理完毕,这种异步方式可以大大提高系统的处理速度、和吞吐量。 微服务架构,通常涉及多个服务之间的相互调用,如果通信只是在少数几个微…

lama-cleaner中的Paint-by-Example使用

Lama Cleaner是一个免费的、开源的、完全自托管的修复工具,里面提供了很多最前沿的AIGC模型。可以使用它从图片中删除任何不需要的物体、缺陷、人物,或删除和替换图片上的任何内容。本文章详细介绍了该工具的所有功能,并体验了下每个功能的实…

Shell编程之正则表达式与文本处理器

一、正则表达式 之前学习了 Shell 脚本的基础用法,已经可以利用条件判断、循环等语句编辑 Shell 脚本。接下来我们将开始介绍一个很重要的概念——正则表达式(RegularExpression,RE)。 1.1正则表达式概述 下面先来了解一下正则表…

BUUCTF---web---[BJDCTF2020]ZJCTF,不过如此

1、点开连接,页面出现了提示 传入一个参数text,里面的内容要包括I have a dream。 构造:?/textI have a dream。发现页面没有显示。这里推测可能得使用伪协议 在文件包含那一行,我们看到了next.php的提示,我们尝试读取…

卢文岩博士受邀参与中国科学院大学校友论坛 解码DPU核心价值

近日,第五届中国科学院大学校友创新论坛正式举行,本次论坛聚焦科技前沿领域,旨在搭建高端对话平台,促进产学研深度融合。在大算力时代——AI技术前沿沙龙上,中科驭数高级副总裁、CTO卢文岩博士受邀分享《DPU——连接算…

Mac | Mac 移动硬盘无法分区问题

现象问题 电脑配置:MacBook Pro M1,系统 Sonoma Mac 系统新升级了 Sonoma,结果出现各种问题。外接屏幕居然不能旋转 90 ,查了一下是Sonoma系统导致的,以及莫名发热的问题。想着要么回退一下系统算了,于是网…

unity3D获取某天的0点和23点59分59秒

系列文章目录 unity工具 文章目录 系列文章目录unity工具 👉一、前言👉二、获取某一天的0点和23点59分59秒1-1.代码如下1-2.调用方法如下1-2-1.获取当天的时间1-2-2.获取某一天的时间 👉三、当月第一天0时0分0秒👉四、当月最后一…

3D点云焊缝提取 平面交线 投影

文章目录 1. 效果2. 思路3. 源码 1. 效果 2. 思路 计算点云法向量;计算点云位姿Pose;翻转Pose中的Z轴方向,使其一致;通过Pose的Z轴对点云进行方向过滤;对点云聚类;根据目标点云的高度提取目标点云;提取两块…

从 0 开始实现一个博客系统 (SSM 项目)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS pom 文件我就不放出来了, 之前用的 jdk8 做的, MySQL 用的 5.7, 都有点老了, 你们自己看着配版本就好 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截…

外汇天眼:风险预警!以下平台监管牌照被撤销!

监管信息早知道!外汇天眼将每周定期公布监管牌照状态发生变化的交易商,以供投资者参考,规避投资风险。如果平台天眼评分过高,建议投资者谨慎选择,因为在外汇天眼评分高不代表平台没问题! 以下是监管牌照发生…

DISCO: Disentangled Control for Realistic Human Dance Generation

NTU&Microsoft CVPR24https://github.com/Wangt-CN/DisCo 问题引入 提高human motion transfer模型的泛化性;给出 f , g f,g f,g作为参考图片的前背景,然后给出单个pose p p t pp_t ppt​或者pose序列 p { p 1 , p 2 , ⋯ , p T } p \{p_1,p_2…

流水账(CPU设计实战)——lab3

Lab3 Rewrite V1.0 版本控制 版本描述V0V1.0相对V0变化: 修改了文件名,各阶段以_stage结尾(因为if是关键词,所以module名不能叫if,遂改为if_stage,为了统一命名,将所有module后缀加上_stage&a…

杭州威雅学校:在学业与生活平衡中找到更好的自己

进入威雅杭州校园, 沿湖边小道步行约5分钟, 四栋寄宿学院与教学区隔湖相望, 威雅人更喜欢叫他们: 「Cavell」&「Dove」 「Elgar」&「Hawking」 提起「寄宿制」,人们本能地会把它和「住校」划等号。 这种…

css中实现背景方格

background: rgba(241,241,241,0.1); background-image:linear-gradient(90deg, rgba(241,243,244,1) 10%, transparent 0),linear-gradient(rgba()241,243,244,1 10%, transparent 0); background-size: 10px 10px; 表现出来的样子就是这个样子

96.网络游戏逆向分析与漏洞攻防-ui界面的设计-角色管理功能的界面设计

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

机器之心 | 清华接手,YOLOv10问世:性能大幅提升,登上GitHub热榜

本文来源公众号“机器之心”,仅用于学术分享,侵权删,干货满满。 原文链接:清华接手,YOLOv10问世:性能大幅提升,登上GitHub热榜 相同性能情况下,延迟减少 46%,参数减少 2…

超市进销存|基于SprinBoot+vue的超市进销存系统(源码+数据库+文档)

超市进销存系统 目录 基于SprinBootvue的超市进销存系统 一、前言 二、系统设计 三、系统功能设计 1 登录注册 2 管理员功能模块 3员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&#x…