3.2 构造器、this、包机制、访问修饰符、封装
构造器
构造器:在实例化的一个对象的时候会给对象赋予初始值,因此我们可以通过修改构造器,来改变对象的初始值,构造器是完成对象的初始化,并不是创建对象
我们也可以创建多个构造器实现不同的初始化,即构造器的重载
默认初始化:
- 数字: 整形是0 浮点型是0.0
- char:u0000
- boolean:false
- 引用: null
一个类即使什么也不写,它的class文件也会自带一个构造方法,这个方法也叫构造器;当然我们也可以直接在java文件里写一个构造器
构造器的规则:
- 方法的名字必须和类名相同
- 不能有返回值 也不能写void
构造器的作用:
- 使用new的时候必须要有构造器,本质是在调用构造器
- 构造器一般用来初始化值
默认的无参构造器:(下图为隐式无参构造)
修改后的无参构造器:(下图为显式无参构造)
有参构造:
一旦定义了有参构造,无参构造就必须显式定义,否则new一个无参的对象时会报错
有参构造的使用如下图:
对象创建的流程: (下图出自B站韩顺平教育,韩老师yyds!!)
- 加载Person类信息(Person.class)
- 在堆中分配空间
- 完成对象初始化
- 默认初始化age=0 name=null
- 显示初始化 age=90,name=null
- 构造器的初始化 age=20,name=“小倩”
- 把对象在堆中的地址返回给 p(p是对象名,也可以是对象的引用)
this
先来一个小实验:
这时候this就很有用了。使用this可以解决构造器中的age、name是局部变量而不是属性的问题
再来一个小实验:
结论:当我们new了很多个对象时,每个对象都有自己的this,this指向堆中的对象本身,简单来说,那个对象调用,this就代表哪个对象
this的注意事项和使用细节:
- this关键字可以用来访问本来的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问同类中其他方法的语法:this.方法名(参数列表);
- 访问构造器语法:this(参数列表)(参数列表不用写参数类型);注意只能在构造器中使用,且必须是第一条语句(即只能在构造器中访问另外一个构造器)
- this不能再类定义的外部使用,只能在类定义的方法中使用
包机制
包的本质就是创建文件夹来存放类
一般利用域名倒置作为包名
定义包:package pkg1.pkg.2 必须写在最上面 package是关键字;一个类中最多只有一个package
为了使用某个包的成员,需要在java程序中导入这个包 用import pkg1.pk2 import必须在定义包的下面 如: import com.ohj.* 导入com.ohj这个包下所有的类;
若使用两个包中相同名字的类时,第一个使用的类import导入包,第二个使用的类不能通过import,而是通过直接通过路径加上类来使用
使用哪个类,就导入哪个类,不建议用 *
包命名规范:
- 包名只能是数字、字母、下划线、小圆点,数字不开头,不能是关键字
- 一般都是小写
- 一般写成: com.公司名.项目名.业务模块名
常用的包:
- java.util.* //util包,系统提供的工具包,工具类
- java.net.* //网络包,网络开发
- java.awt.* //做java页面开发的,GUI
访问修饰符
访问修饰符用于控制方法和属性以及类的访问权限,分为4种:
- public:公开级别,对外公开
- protected:受保护级别,对子类和同一个包中的类公开
- default:默认级别,直接没有修饰符号就是default,向同一个包中的类公开
- private:私有级别,只有类本身可以访问,不对外公开,外面需要通过get、set方法来进行使用
方法和属性的修饰符能用上面的四种,但是类的只能用public和默认
封装
封装的好处:
- 隐藏实现细节
- 可以对数据进行验证,保证安全合理
封装也就是避免直接访问对象中数据的实际表示,通过操作接口来访问
封装大多数是对于属性来进行操作的,也就是属性私有,关键字private;通过封装可以让别的类无法使用自己的私有属性。
通过在设置属性的时候在前面加上private关键字 让属性变得私有。
private与public 是对立的
既然属性已经私有了,那么别的类想用这个属性的时候,必须在属性所在的类里提供一些可以操作这个属性的方法,也就是get和set
get:可以获得这个属性 get的时候也有驼峰命名法,规则就是get+大写属性的一个字母
set:可以给这个属性设置值 set的时候也有驼峰命名法,规则就是set+大写属性的一个字母 set方法是void类型,且必须要有个参数
若定义了有参构造器,有参构造器避开了set方法,避开了数据的验证,那么我们可以在有参构造器中调用set方法,这样数据就不会通过构造器规避了数据验证
我们可以通过在set方法里设置一些判断,来规避掉不合理的值
操作如下图:
封装可以提高程序的安全性,保护数据;可以隐藏代码的实现细节;统一了接口也就只用get、set
3.2 构造器、this、包机制、访问修饰符、封装的更多相关文章
- java的访问控制(包、访问修饰符、修饰符)
一. java的类包 编写好一个源程序后,首先要执行javac命令进行编译源文件,并生成与源文件同名后缀为“.class”的字节码文件(类文件),该类文件与源文件默认在同一个目录中.该类文件是 ...
- static,final,包,访问修饰符,内部类
static 关键字可以修饰成员变量,被static修饰的成员变量归属于类static关键字可以修饰成员方法:被static修饰的成员方法可以直接使用类名调用,也可以通过对象调用,建议使用类名.非静态 ...
- IT第九天 - 包、访问修饰符、变量的内存分配、String类中常用方法
IT第九天 上午 包 1.包的命名规则:域名.项目名称.模块名 2.如:Wfei.com.windows.login 访问限制符 1.四种访问限制符分别对应为: (1)default:默认的,默认为p ...
- 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)
译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...
- JAVA中的访问修饰符和包
一.JAVA访问修饰符 访问修饰符,用来控制类中成员的可见性 有四个访问修饰符,分别是:default,private,public,protected 1.default(默认):默认权限,不用写的 ...
- java:包、继承,访问修饰符
包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看出目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [3] 更好的保护类.属 ...
- Java基础内部类、包的声名、访问修饰符、代码块整理
内部类 14.1内部类概念 将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类.其他类也称为外部类. 内部类分为成员内部类与局部内部类. 我们定义内部类时,就 ...
- Java包、权限访问修饰符、封装性
包 概念: 物理上是文件夹:逻辑上是有逻辑关系的类的集合 作用: 避免类重名:控制访问权限 命名规范: 在包名中,可以使用.号来区分包的级别:包名一般情况下是小写 第一级 指该项目的类型,如com,o ...
- C#继承机制 继承与访问修饰符
继承与访问修饰符 访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性.类的继承中有四个访问修饰符: public protected internal private.使用这些访问修饰符可指定 ...
- java入门---修饰符&访问修饰符&非访问修饰符
Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class ...
随机推荐
- MySql5.7基础配置
MySql5.7基础配置 [client] #设置mysql客户端的字符集 default-character-set=utf8 [mysqld] #设置mysql端口为3306 port = 330 ...
- MyBatis-Plus插入值后返回主键
LZ做练手设计的时候有这样一个订单需求,先插入订单表数据(t_order),再写入订单详情表(t_orderDetail),详情表需要有一个与t_order的外键约束 t_order ( oid ...
- 《Unix/Linux系统编程》第八周学习笔记
<Unix/Linux系统编程>第八周学习笔记 时钟服务函数 gettimeodfay() 获取系统时间 settimeofday() 设置系统时间 time() 以秒为单位返回当前时间 ...
- java8 stream按某个字段分组,允许分组字段是null
Map<String, List<Dto>> deviceMap = deviceList.stream().collect(Collectors.groupingBy(Dto ...
- Centos7安装nodejs(npm)
执行命令: 设置yum安装源> curl --silent --location https://rpm.nodesource.com/setup_14.x | sudo bash (14是大的 ...
- typescript 的动态引入组件
环境: Arco Pro + Vue3 vite自身对动态字符串形式的组件引入是有限制的, 以下写法会报错 官方文档中也对此有做说明, 只能通过固定形式去引用 以下形式不会报错, 但这种固定格式的局限 ...
- 有时候用uniapp写项目时发现,Map组件在安卓真机可以缩放和移动,但是在ios真机就不行
如果你的地图组件是放到popup组件里,是用弹框打开的,如何ios端不能缩放, 那你一定要看下这个弹框的层级是否比地图层级要高 z-index. 如果高于地图层级,那地图肯定是不能移动和缩放的
- OSPF v3与v2的区别
- Javaweb基础复习------Filter相关应用+登录验证案例的使用
Filter(过滤器) 基本步骤: 1.定义类,实现Filter接口,并重写其所有方法 2.配置Filter拦截资源的路径,在类上定义2 WebFilter注解(WebFilter配置的路径,是拦截资 ...
- GaussDB(DWS)运维:导致SQL执行不下推的改写方案
摘要:本文就针对因USING子句的书写方式可能导致MERGE INTO语句的执行不下推的场景,对USING子句的SQL语句进行改写一遍,整个SQL语句可以下推. 本文分享自华为云社区<Gauss ...