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

news2024/10/11 17:00:21

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 {
    //咱们使用属性来搞一下,现在初始化为50
    public int i = 50;

    public static void main(String[] args) {
        Hello hello = new Hello();
        System.out.println(hello.i);
    }

    public Hello() {
        //这个就相当于外面的hello.i
        this.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;

//因为在不同包里了,所以我们想要使用其他包的里类需要使用import

import 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.coloradmin.cn/o/2205290.html

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

相关文章

CANoe_调用C#控件的方法_DEMO方法演示

1、DEMO存放位置 D:\Users\Public\Documents\Vector\CANoe\Sample Configurations 11.0.96\CAN\MoreExamples\ActiveX_DotNET_Panels 每个人的电脑因为有区别存放位置不一样 2、控件制作--使用C#控件可以直接制作 3、控件代码 using System; using System.Collections; usi…

探索血糖人工智能预测可穿戴设备

导言 论文地址:https://arxiv.org/abs/2404.12605 数字生物标志物是一种新型医疗指标,其数据来源于可穿戴设备和智能手机等数字设备收集的数据。与从传统生物样本中提取的病理标志物不同,数字生物标志物能提供行为模式、生理节奏和环境因素的…

DBeaver的安装与使用

文章目录 前言一、DBeaver 的安装二、DBeaver 的基本使用三、DBeaver 的高级功能四、使用小技巧五、总结 前言 DBeaver 是一款广泛应用的数据库管理工具,支持多种数据库系统。以下是它的安装与使用方法。 一、DBeaver 的安装 下载 DBeaver: 前往 DBeaver 官方网站…

Vue工程化结构环境安装及搭建教程 : 之nvm

vue需要的环境: node.js : Node.js和Vue.js通常会一起使用。Node.js作为后端服务器,处理服务器端的逻辑和数据访问,而Vue.js则负责前端用户界面的构建和交互。通过Ajax通信,Vue.js应用程序向Node.js服务器发送请求,并…

Collection 集合框架

Collection 集合框架 各类集合 Set TreeSet 基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 HashSet 基于哈希表实现&…

Python入门笔记(四)

文章目录 第九章 集合set9.1 创建集合:set()、集合生成式9.2 集合性质9.3 一些函数:issubset()、issuperset()、isdisjoint()9.4 集合增加元素:add()、update()9.5 集合删除元素:remove()、discard()、pop()、clear()9.6 创建不能…

ELM分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类)

分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类) 目录 分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类)效果一览基本介绍程序设计学习总结参考资料效果一览 训练集正确率Accuracy = 89%(445/500) 测试集正确率Accuracy = 86.9565%(60/69) 基本介绍 MATLA…

《RabbitMQ篇》消费者轮询消费消息

当有多个消费者都在同一个队列中拿取消息时,会轮询从队列中拿取消息消费。 RabbitMQUtil类为工具类,获取Channel。 import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory;public…

基于SSM的线上学习网站【附源码】

基于SSM的线上学习网站(源码L文说明文档) 目录 4 系统设计 4.1 系统结构设计 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1 学生信息管理 5.1.2 教…

亚马逊云科技生成式 AI 认证正式上线!

为了更好帮助大家在人工智能领域入门及快速成长,助力企业发掘优秀人工智能人才,亚马逊云科技推出 AWS Certified AI Practitioner 认证,涵盖人工智能领域的必备技能、前沿技术和实践经验。 通过该认证,你将掌握设计考虑、RAG&…

大傻工具提示:没有找到c:\windows\system32\msrd3x43.dll

解决办法: 1、不用理会它,对串口工具运行没有任何影响。就算你下载了也没用,依然会有提示。 2、右键以管理员身份运行就不报错了。

医学大模型微调·数据处理全流程:炼丹,是自我超越的方法

医学大模型微调数据处理全流程:炼丹,是自我超越的方法 数据清洗脚本数据标注数据核验转为微调格式随机化 数据清洗脚本 HTML标签移除 去除文本中的所有HTML标签,保留纯文本内容。 特殊字符处理 替换特殊数字符号(如①②③&#x…

如何保护源代码?十种有效方法实现源代码防泄密

在数字化时代,源代码的安全保护对于企业来说至关重要。源代码不仅是企业技术创新的成果,更是其核心竞争力的体现。一旦源代码泄露,不仅可能导致企业丧失市场优势,还可能引发知识产权纠纷、增加竞争对手的市场竞争力,甚…

k8s 1.28.2 集群部署 MinIO 分布式集群

文章目录 [toc]MinIO 介绍MinIO 生产硬件要求MinIO 存储要求MinIO 内存要求MinIO 网络要求MinIO 部署架构分布式 MinIO复制的 MinIO 部署 MinIO创建目录节点打标签创建 namespace创建 pv创建 MinIO配置 ingress问题记录通过代理服务器访问 MinIO 的 Object Browser 界面一直显示…

用echarts画天气预报

如图 上代码 <template><div id"temp15day"></div> </template><script setup> import * as echarts from "echarts"; const initChart () > {const machart echarts.init(document.getElementById("temp15day&q…

如何选择最合适的华为云数据库:指南与建议

在数字化转型的浪潮中&#xff0c;选择合适的数据库是企业成功的关键。华为云提供了多种数据库服务&#xff0c;以满足不同业务需求。以下是九河云总结的一些指南和建议&#xff0c;帮助您选择最合适的华为云数据库。 1. 了解业务需求 在选择数据库之前&#xff0c;首先需要了…

西米:未来的支付还能做吗?

未来支付行业还能做吗&#xff1f;一直是在洗牌&#xff0c;一直让你有上场的机会&#xff0c;做一个行业&#xff0c;最好的时间是行业刚刚开始&#xff0c;市场相对空白&#xff0c;跑马圈地&#xff0c;广撒网&#xff0c;利用时差赚钱&#xff0c;这是最好的时间。 另外&a…

【Kubernets】容器网络基础二:通讲CNI(Container Network Interface)容器网络接口实现方案

文章目录 背景知识Underlay网络Overlay网络一、基本概念二、工作原理三、实现方案四、应用场景 两者对比示意图 CNI实现有哪些&#xff1f;FlannelFlannel 的工作原理Flannel 的主要组件数据传输机制总结 Calico一、架构基础二、核心组件与功能三、路由与数据包转发四、安全策略…

Java微信支付接入(4) - API V3 API字典和相关工具

1. API列表 Native下单 - Native支付 | 微信支付商户文档中心 (qq.com) 以下是微信提供的 Native 支付的相关 API 微信提供了详细的请求接口和参数 2.接口规则 概述 - 通用规则 | 微信支付商户文档中心 (qq.com) 微信支付 APIv3 使用 JSON 作为消息体的数据交换格式。 JSO…

jupyterlab的安装与使用攻略

官网链接 Project Jupyter | Home 1.第一步安装 打开控制台 使用pip工具安装 pip install jupyterlab 如图 2.安装成功后启动 jupyter lab 会自动启动它的web页面 然后就可以正常使用咯&#xff01;&#xff01; 如果需要更换浏览器访问 新开控制台执行下面命令 jupy…