一个月学会Java 第9天 构造器与访问修饰符

Day9 构造器与访问修饰符

本来其实是想在Day8里面把这个构造器给讲掉的,但是发现篇幅有点长的,后面的内容也是稍微有一点点超纲了,所以就先把这个留着,现在再讲。

第一章 构造器

构造器,我们之前在讲类的时候其实是说过的,就是我们创建类的对象的时候会调用构造器,然后我们的构造器也可以有很多个,这个其实就得益于方法的重载

然后我们再看看构造器的结构他就是这样 [访问修饰符] [方法名==类名](参数列表){方法体}
他是没有返回值的一个方法,但他其实是会返回东西的,就是返回一个对象,这句话能理解吗,然后这个 类名==方法名
其实就是在说他的方法名要和类名一样,这样才能不需要返回值然后能变成构造器,上代码案例

public class Hello {public static void main(String[] args) {//还有就是方法的调用里面,他就只能在new的时候被调用,无法通过对象被调用Hello hello = new Hello();new Hello("123");//普通方法,就是需要对象去调用hello.Hello();}//最普通的构造器,无参构造器public Hello() {}//有参构造器public Hello(String str) {System.out.println(str);}//并非构造器,因为他有返回值类型,只不过返回值类型是不返回东西public void Hello() {System.out.println("void Hello()");}
}

在这里插入图片描述

再看看这个,其实构造器虽然是只能在创建对象的时候调用的方法,但是他还是可以和正常的方法一样执行东西的

import java.util.Arrays;public class Hello {public static void main(String[] args) {new Hello(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);}public Hello(int... ints) {System.out.println(Arrays.toString(ints));}}

在这里插入图片描述

但是不仅如此,构造器还有不少的东西,在介绍这个东西之前,我们得介绍一下一个关键字 this 看意思应该也能看懂一点就是 这个
的意思,实际是指本对象,就和我们之前使用的 Hello hello = new Hello() 里面的 hello 就是这个的当前对象,this就是在这个对象里面指自己

public class Hello {//咱们使用属性来搞一下,现在初始化为50public int i = 50;public static void main(String[] args) {Hello hello = new Hello();System.out.println(hello.i);}public Hello() {//这个就相当于外面的hello.ithis.i = 100;}public Hello(int a) {System.out.println("调用的是带参数的构造器,所以值不变");}}

在这里插入图片描述

我们这里再教一个this的用法,就是我可以用this()
然后里面带上参数或者不带参数,可以在构造器里面调用我另外一个重载的构造器,但是这里有要求,只能位于方法开始的第一行,其他会出问题,我们先看成功的再看失败的

public class Hello {public int i = 50;public static void main(String[] args) {Hello hello = new Hello(123);System.out.println(hello.i);}public Hello() {this.i = 100;}public Hello(int a) {//这里要写在第一行//就相当于是构造器然后通过重载根据我参数里面写或者不写来调用构造器this();System.out.println("调用的是带参数的构造器,所以值不变");}
}

在这里插入图片描述

接下来就是出问题的,因为this()不在第一行的情况

public class Hello {public int i = 50;public static void main(String[] args) {Hello hello = new Hello(123);System.out.println(hello.i);}public Hello() {this.i = 100;}public Hello(int a) {this.i = a;this();System.out.println("调用的是带参数的构造器,所以值不变");}
}

在这里插入图片描述

还有个小知识点,就是我们的参数列表里的参数的命名如果和我们类里面的属性重名了,那我该如何区分和调用

public class Hello {public int i = 0;public static void main(String[] args) {Hello hello = new Hello(123);System.out.println("有参构造器的i: " + hello.i);Hello hello1 = new Hello();System.out.println("无参构造器的i: " + hello1.i);}public Hello() {i = 100;}public Hello(int i) {//其实也很简单,我们只需要通过this.i就是调用我们类里面的属性了//他取元素其实也是就近原则,假如我直接写i他只会取参数里的,想要使用类里的需要使用this//自然,如果我们没有参数i的时候,自然可以直接写,因为在编译的时候//会自动加上this.的this.i = i;}
}

在这里插入图片描述

第二章 package关键字

主要是确实就是普通方法的变形,没什么好说的,我们重点来到访问控制符,就是前面的那个public,但是我们虽然说要讲控制符,但是在访问控制符之前我们先讲一个东西,那就是package关键字

写法是很简单的,就是在最上方的开头加上package关键字和包名,这个包名其实就是文件夹的名字,如果是多级的,那就是使用点来分开,比如我现在的文件在Test文件夹下那就是 package Test;
假如我现在的文件夹在Test\Test1的话,在linux上是Test/Test1,我们都是写的 package Test.Test1;
我们使用点去分割多级目录,我们下面的案例使用单级目录,多级就是多个等级的分明,使用的就是 .
和对象调用方法有点像,我们里面还有方法可以直接查看这个类的目录的

//如果有package的话那就得写在最开头不然会报错
package Test;public class Hello {public static void main(String[] args) {//只要编译没有报错那就是成功System.out.println("Hello world");}
}

我们先说说结构,先别急着看结果,我们的文件结构现在不能是单单的散在地上的,我们需要先创建一个Test文件夹然后再把Hello.java文件丢进去,希望大家能够理解这样做的目的
在这里插入图片描述

我们先看看这次的编译命令,是不是还是javac但是路径不一样的,我们先回到了上一级的目录,方式也很简单先输入 cd ..
即可,然后再使用javac编译,但是因为我们回到了上一级的目录,所以我们需要通过加上文件夹的方式进行编译,根据我们的程序是这样的 javac Test\Hello.java
然后我们运行的方式也是在这个文件夹内部使用的还是java,但是我们需要加上 包.类 这样的方式来进行运行

package Test;public class Hello {public static void main(String[] args) {//还记得我们说打印路径吗?我们使用这个就能打印这个类的路径了System.out.println(Hello.class);}
}

在这里插入图片描述

这就是包,package,假如我们再来个几层,比如我基于现在的Test我再往里面深入几层然后把类命名为PackageTest好了,不要忘记java的最基础的,public
class的类名要和文件名一样

package Test.learning.packageUsing;public class PackageTest {public static void main(String[] args) {System.out.println(PackageTest.class);}
}

在这里插入图片描述

再给大家看看文件情况,其实只需要看上面的路径就知道了

那么这个就是我们的package内容了,是不是非常的简单,以后用package的情况一般都是在ide中了,但是ide中你甚至都不需要关心怎么打编译指令了

第三章 访问修饰符

既然都已经讲完了package关键字了,那接下来就是要讲访问修饰符了,这个时候就要提一提我以前踩的坑了,以前学package这个关键字是在ide之后才学的,甚至都搞不清在外面是干什么用的
所以那个时候刚切出来的时候还是很蒙蔽的,但是后面慢慢的捣鼓还是给我摸索出来了,因为在ide之中真的很安逸,这种琐事鸟都不用鸟。
接下来要说访问修饰符了,之前也说了和这个package可以是息息相关

首先我们先来说说这个访问修饰符的关键字有哪几个,不搞谜语人直接说,有三个,但是有四个访问级别,分别是public protected default private
,分别是从最大到最小,然后刚刚说到的,三个关键字,但是四个访问级别,是不是能想到,有个访问级别就是不写访问修饰符。

public 这个我们很熟悉,毕竟经常写,意思也是公有,所以我们被public修饰的,无论在哪个包的类都是可以调用的,这个包的分类就是通过package进行分的

protected 受保护的,这个是以后再讲,在我们说过继承之后再说,他的访问等级是同包和不同包的子类,这块有面向对象的内容,所以在我们之后再讲,我们现在只需要认个齐就行

default 不知道大家有没有猜到,这个访问等级就是,不写的那个,他的访问级别是同包

private 私有,只有本类可以访问,同包的也不行,一般private和public在正常的开发中使用的比较多,或者说基本上都是这两个,上了private就是我只能内部用用,使用了public就是哪里都能用。

既然已经讲完了这四个,所以我们现在在直接上案例好吧,这次就要使用一个方式了,单个文件多个类,大家要注意,开发中一定不能这么写,顶多也是内部类,当然这个内部类也是以后的内容。
其实听名字也听出来了,内部类就是内部的类,和我们现在要采用的操作还是有很多的区别的。

package Test;public class Hello {public static void main(String[] args) {//首先我们先来测试这四个对本类的访问控制,其实都是能访问的//毕竟我们的主方法就在我们的Hello类中Hello hello = new Hello();hello.p1();hello.p2();hello.p3();hello.p4();}public void p1() {System.out.println("public p1()");}protected void p2() {System.out.println("protected p2()");}void p3() {System.out.println("default p3()");}private void p4() {System.out.println("private p4()");}
}

在这里插入图片描述

其实猜都不用猜,同个类是这样的,接下来我们使用多个类

package Test;public class Hello {public void p1() {System.out.println("public p1()");}protected void p2() {System.out.println("protected p2()");}void p3() {System.out.println("default p3()");}private void p4() {System.out.println("private p4()");}
}

在这里插入图片描述

很明显,在编译阶段就已经报错了,所以我们现在使用两个不同文件的类去访问

package Test;public class H1 {public static void main(String[] args) {Hello hello = new Hello();hello.p1();hello.p2();hello.p3();hello.p4();}
}
package Test;public class Hello {public void p1() {System.out.println("public p1()");}protected void p2() {System.out.println("protected p2()");}void p3() {System.out.println("default p3()");}private void p4() {System.out.println("private p4()");}
}

在这里插入图片描述

很明显,及时分开了还是在编译的时候检查了,还是不行,那我们现在再来增加测试,就是分不同的包,我们再来看看有几个报错

package Test.T1;//因为在不同包里了,所以我们想要使用其他包的里类需要使用importimport Test.Hello;public class H1 {public static void main(String[] args) {Hello hello = new Hello();hello.p1();hello.p2();hello.p3();}
}
package Test;public class Hello {public void p1() {System.out.println("public p1()");}protected void p2() {System.out.println("protected p2()");}void p3() {System.out.println("default p3()");}private void p4() {System.out.println("private p4()");}
}

在这里插入图片描述

很明显啊,直接两个错误,还记得我之前说的吗default的访问级别只有同包,因为不同包所以直接报错,还有protected,因为不是子类所以直接报错,详情在后面学了面向对象的继承之后我再细说

今天的东西其实就这么点,可能day10要讲面向对象相关的东西了,虽然我们这一天也讲了,就访问修饰符其实就是面向对象的三大特性中的封装性

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

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

相关文章

代码随想录 (三)—— 哈希表部分刷题

当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。 数组set (集合)map(映射) 在java中有就是,hashmap, LinkedHashMap, TreeMap ,HashTable 等 总结一下,当我们遇到了要快速判断一个…

系统开发基础错题解析二【软考】

目录 前言1.人机界面设计2.架构设计2.1管道过滤器体系2.2仓库风格 3.软件测试相关概念4.白盒测试用例4.14.2 5.测试分类与阶段任务划分6.软件维护类型7.软件质量保证8.软件过程改进 前言 本文专门用来记录本人在做软考中有关系统开发基础的错题,我始终认为教学相长…

利用特征点采样一致性改进icp算法点云配准方法

1、index、vector 2、kdtree和kdtreeflann 3、if kdtree.radiusSearch(。。。) > 0)

平板外壳高精度标签粘贴应用

电子平板、手机等产品的外壳的上常会贴有各式各样的标签,这是电子设备制造业中不可或缺的环节,它不仅关乎产品信息的准确传达,还承载着品牌宣传、防伪追溯等多重功能。通过贴标,设备制造商能够清晰地标注设备的型号、序列号、生产…

通过AI技术克服自动化测试难点(上)

本文我们一起分析一下AI技术如何解决现有的自动化测试工具的不足和我们衍生出来的新的测试需求。 首先我们一起看一下计算机视觉的发展历史,在上世纪70年代,处于技术萌芽期,由字符的识别技术慢慢进行演化,发展到现在,人…

Microbiome | 嫁接植物微生态大揭秘:抗病研究的新思路

在现代农业中,嫁接技术作为一种有效的植物改良方法,已被广泛应用于瓜果种植。然而,嫁接技术背后的微生物学奥秘却鲜为人知。今天,我们将通过一篇《Microbiome》的文章带您深入探讨嫁接西瓜的根际微生物群,了解它们如何…

DMA 详解

目录 一、简介二、STM32 中的 DMA1、DMA 框图1.1 传输方式1.2 仲裁器1.3 数据流1.4 指针递增模式1.5 存储器到存储器模式1.6 DMA 中断 2、DMA 配置 一、简介 DMA(Direct Memory Access,直接存储器访问)顾名思义,就是绕开 CPU 直接…

美国1米DEM地形瓦片数据免费分享(4)-新泽西州

一、简要介绍 新泽西州(英语:State of New Jersey)位于美国中大西洋地区,其命名源自位于英吉利海峡中的泽西岛,昵称为“花园州”。新泽西州亦为美国东部的一个州,北接纽约州,东面大西洋,南向特拉华州,西临…

OpenEBS 实现 PV 动态持久化存储安装

什么是 OpenEBS OpenEBS 将 Kubernetes 工作节点可用的任何存储转换为本地或复制的 Kubernetes 持久卷。OpenEBS 可帮助应用程序和平台团队轻松部署需要快速、高持久性、可靠且可扩展的容器原生存储的Kubernetes 有状态工作负载。 安装OpenEBS 1.所有节点安装iSCSI启动器 yu…

生成式专题的第二节课--DCGAN

一、DCGAN基础概念 DCGAN(Deep Convolutional Generative Adversarial Network,即深度卷积生成对抗网络),于2016年提出,是一种深度学习模型,是生成对抗网络(GAN)的一种变体&#xf…

HarmonyOS NEXT应用元服务开发按钮标注场景

对于用户可点击等操作的任何按钮,如果不是文本类控件,则须通过给出标注信息,包括用户自定义的控件中的虚拟按钮区域,否则可能会导致屏幕朗读用户无法完成对应的功能。 此类控件在进行标注时,标注文本不要包含控件类型、…

干部管理系统:全面提升干部管理效能

数字化浪潮下,干部管理系统作为管理利器,日益凸显其核心价值。该系统全面实现干部信息的数据化,涵盖从基础档案到教育、工作、培训及考核等全方位细节,信息详尽且条理清晰。这不仅极大提升了干部信息查询与更新的效率,…

商标恶意维权形式及应对策略

在商业领域,商标恶意维权的现象时有出现,给正常的市场秩序和企业经营带来了不良影响。以下将介绍其常见形式及应对方法。 一、商标恶意维权的形式1、囤积商标后恶意诉讼。一些人或企业大量注册与知名品牌相似或具有一定通用性的商标,并非用于…

【STL】二叉搜索树模拟实现

BinarySearchTree模拟实现 1 什么是二叉搜索树2 二叉搜索树的插入2.1 插入的流程2.2 插入的代码 3 二叉搜索树的查找3.1 查找的流程3.2 查找的代码 4 二叉搜索树的中序遍历4.1 中序遍历流程4.2 中序遍历代码 5 二叉搜索树的删除5.1 没有孩子 | 有右孩子5.2 没有右孩子5.3 有两个…

广州自闭症寄宿学校有哪些?选择最适合孩子的学校

在广州这座繁华而充满人文关怀的城市里,有一群特殊的孩子,他们被称为“星星的孩子”——自闭症儿童。他们生活在自己的世界里,对外界的刺激反应迟钝或过度敏感,社交互动困难,语言表达受限。然而,在广州&…

医学图像处理入门:VS2019+DCMTK3.6.8编译及环境配置

1. 下载DCMTK的源文件包和支持库 首先下载dcmtk软件包,此处我们下载源码和支持库来进行自己编译。下载网址: https://dicom.offis.de/en/dcmtk/dcmtk-software-development/ 如图所示,选择合适的版本进行下载,此处采用VS2019进行…

5款人声分离免费软件分享,从入门到精通,伴奏提取分分钟拿捏!

人声分离通常是音乐制作、混音和卡拉OK中常用的重要技术之一。它的核心是将乐器伴奏从原始音轨中分离出来,使得用户可以单独处理或重混音频,创造出清晰干净的伴奏轨道。若缺乏强大的音频剪辑软件或专业人声分离工具,这一过程往往会比较困难。…

Xinstall品牌揭秘:如何成为App拉新的行业翘楚?

在移动互联网时代,App作为连接用户与服务的桥梁,其重要性不言而喻。然而,随着市场竞争的加剧,App拉新(即吸引新用户下载并使用App)的难度也在逐渐增大。传统的营销方式往往面临着成本高、效率低、用户留存差…

前端开发攻略---分块加载大数据

一、问题 解决当遇到较大的数据请求,当用户网络较差的时候,需要等很久很久才能拿到服务器的响应结果,如果这个响应结果需要再页面上展示的话,会导致页面长时间白屏的问题 二、实现原理 当发送一个请求时,需要等服务器把…

照片相册SDK解决方案,模板化包装,简化视频制作流程

专业的视频制作往往门槛较高,让许多用户望而却步,美摄科技推出了全新的照片相册SDK解决方案,旨在通过模板化包装方式,让用户轻松上传照片,快速生成一个充满创意和个性化的照片视频,让每个人都能成为自己生活…