0


【Java基础总结】类加载顺序,new关键字,访问权限修饰符与方法重载等【二】

📢博客主页:🏀傻根根呀🏀
📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!👏
📢本文由 【傻根根呀】 原创,首发于 CSDN🙉🙉🙉
📢由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!✨个人主页
📖精品专栏(不定时更新)【JavaSE】 【MySQL】【LeetCode】【Web】【操作系统】

📖精品文章(纯JavaSE实现图书管理系统<含精解注释>)

📖精品文章【Java】JDBC连接MySQL数据库,一把斗地主时间从无到有讲个通透~​​​​​​

📖精品文章 讲明白Java中的引用,对象,和空指针异常~

📖系列文章一:面向对象时,哈喽一定爱极了world吧?【史上最有爱的Java基础总结(足足六千字)】【一】_m0_56164356的博客-CSDN博客

📖系列文章二:舍友给我带饭,请我给他讲明白Java中的引用,对象,和空指针异常听完直呼值了,问我下顿想吃啥_m0_56164356的博客-CSDN博客

写在前面

最近再回头过来看Java基础知识,以不同的角度再去看,收获良多,特记之。

在学习过程中,我们通常纠结于要不要深入钻研,结合本人的学习过程最近再回头反省。

我觉得学习初期,还是应该在大的体系上去学习,不要卡进度,但是也不可盲目追求进度,一旦自欺欺人盲目追求速度。久而久之自己都怀疑自己了。不如脚踏实地的系统学习,打扎实基础逐步推进。只有系统学习才能学到真东西!其中尤其忌讳无论什么东西,第一遍看不懂,也不仔细钻研,便将不懂的问题逐渐搁置一旁,久而久之,积累的多了,蚁多尚能噬象,何况基础不牢呢?必然是地动山摇!

但是学习过程中也确实有些内容偏难,晦涩难懂,针对这些,我们可以大致有个印象。说到这里就不得不提一嘴,譬如有力扣刷题经验的同学,你第一次见难题,压根没头绪,没见过类似题 和 看了题解也没做出来,但是大致知道怎么做了,隔一段时间第二次再去做这个题,多多少少就有头绪了。

我们不可以去追逐偏难怪知识点和 刷题。但是有些简单中等高频率的题,和学习过程中重要的知识点,这些一定要第一次就弄懂,而后学习过程中不断巩固,加深理解。佛说三重境界,看山是山,看山不是山,看山仍是山。二哥有句话讲得好:无论沿途有多少风景,没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。

我们不做停留,我们一无所有,我们巍然矗立,一往无前。在前进的过程中,渐识乾坤大,看山是山,然后才知看山是山!

更新本系列文章的初心,一是巩固当初年少无知,漏过的重要知识点。二是对Java重要知识点进行系统的梳理和总结,对自己负责,建立完整健全的java基础知识体系结构。三是文章可能写一些俏皮话,保持更新频率,也算是学习反思和日记了吧!自引,复习专用!

由于本人水平有限,只是在学小白一枚。知识的理解难免有不当之处,代码可能存在错误的地方,有任何问题欢迎评论区留言指出,感激不尽!

创作不易,烦请三连支持一下!~

Java学习之旅,我们一起学习,共同进步!~


碎碎念

有人生来就能咔咔编程和输出高质量内容的博客吗?

就此问题,我咨询了老产科张姨。

她职业生涯三十年,从来没见过,哪个北鼻生下来,手里还攥着杆毛笔,拎着一副键盘的。

没有,都空着手。

大家都一样。

哥们,你可以放心了,没有天生这回事。

但是距离上次热榜博客为什么我断更足足三十七天?(草稿攥写于三十七天前)

因为“写”在你这儿有规矩,有N多的规矩,无数的规矩:

——你说话无所顾忌,因为交流对象有限,你话一出口,随风而散,说的对不对无所谓。但“写”就不一样,那玩意白纸黑字算是证据,有可能被无数人看到,这让你亚历山大,“写”就变成了个严肃的事儿。

——不敢写脏话,不想三俗,不想用方言俚语,不敢写大白话,非要努力文雅一点,绞尽脑汁找成语,引典故……

这些规矩都控制着你,从脑到手臂到指尖,你本来想写一篇表达真情实感,结果越写越扭曲,落到纸上变成一坨屎。

所以大部分人觉得自己文笔差,在于:规矩太多,胆太小,不敢,害怕。

真到了西安快要解封,我们校区能回家过年,人逢喜事精神爽,我悟了!(QwQ但是写了没更新,友友赎罪~)

下次喝酒吹牛逼,提前开了录音笔,酒醒之后整理出来,就是一篇好文章,保证妙语如珠,金句频出,比莫言写的强。

言为心声,平时你说话老流利了,心里想什么,嘴上就敢说什么,加特林一样突突扫射。

文以载道,这个“道”没那么高大上,指的就是你提起笔来那一刻,脑子里的所思所想所得,嘎嘎写疯狂输出就对了。

只要你直抒胸臆,心里想什么,笔尖就写什么,情感真挚充沛,无所顾忌,一气呵成,就是一篇动人的好文章。

哪怕格式不对,哪怕文笔粗糙,哪怕词句不美,都不影响。

文字是信息,文章是一堆信息的有效组合,而信息的核心价值及第一要求——真实。

一真遮百丑,一真胜所有。

没有这一点“真核”,文笔再好,技巧再华丽,也不过是一盘煎炒烹炸后的屎。

中国传统文学有所谓的“三泪文”,相信很多人都学过,三篇文章文笔并没有多么华丽,用词质朴,情感自然流淌,娓娓道来,跟大白话差不了多少。

为什么被奉为千年经典,传承至今?

因为它们做到了文章的最高境界——情感真挚,情绪饱满,情深动人,打动心灵自然引发共鸣。

网络时代,很多普通人输出文字内容,有几个文笔好,文采华丽的?有几个上过作家培训班的?

少之又少。

大多数只靠一点“真”就能光芒万丈。

真实的经历,真挚的情感,真正的思有所悟、悟有所得.......

当年产房里,大家都空手而来,一样九年义务教育,谁比谁差,谁比谁强?

没有的事儿。


目录


一: 类加载时究竟经历了什么!?(以static关键字深入剖析)

前言(知识铺垫)

1、源文件由编译器编译成字节码(ByteCode)

2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言

( "semi-interpreted" language)


一个Java文件从编码完成到最终执行,一般主要包括两个过程 编译 和 运行

编译

我们了解这一流程,可以把我们写好的java源文件在cmd中通过javac命令编译成字节码(ByteCode),也就是生成我们常说的.class文件。

解释运行

则是把编译生成的.class文件交给Java虚拟机(JVM)解释执行,我们同样在cmd使用Java命令可以了解这一流程

关于上面的具体流程和两个命令的详细内容如需深入理解请移步我本系列文章的第一篇:【请点击链接】


类加载的发生

举个通俗点的例子来说,JVM在执行某段代码时,到了需要class A这个类的环节, 然而此时内存中并没有class A的相关信息,于是JVM就会到一堆相应的.class文件(已经编译好的二进制字节码)中去寻找class A的类信息,并加载进内存中,这就是我们所说的类加载过程。

由此可见,JVM不是一开始就把所有的类都加载进内存中,而是只有第一次遇到某个需要运行的类时才会加载,且只加载一次。

具体内容还请看之前文章: 请移步我系列文章第一篇:【请点击链接】

这里只讲原因:****因为在Java中,类是最基本的单位,JVM最小单位就是按照类加载进入内存。

而我们Java中用static修饰的属性,叫做类变量(也叫静态变量),用static修饰的代码块,叫做静态代码块。用static修饰的方法叫做静态方法(也叫类方法),以上三者在下文中统称静态内容!


main方法在类加载中的顺序

运行需要某个类,不知道诸位还记得否我们第一次在main方法内输出HelloWorld时候的主函数,

这里我们main方法是程序的入口,从入口进入输出HelloWorld!

我们有没有办法在main函数输出HelloWorld前输出别的内容?答案是肯定的!

关于静态内容在类加载时加载的顺序,静态代码块和类变量(静态变量)是同等优先级的,先后顺序取决于他们在类中的定义位置的顺序先后。

如上图测试用例所示:代码如下,请君自取

package com.zdx.daily.java0112.p1;

/**
 * @program: daily.study
 * @description:
 * @author: SmallRedSun
 * @create: 2022-01-12 08:59
 **/
public class TestStatic {
    static int anInt=getInt();

    private static int getInt() {
        System.out.println("1;这是第一个类成员变量");
        return 1;
    }

    static{
        System.out.println("2:这是第一个静态代码块!");
    }
    static int anInt1=getInt1();

    private static int getInt1() {
        System.out.println("3;这是第二个类成员变量");
        return 1;
    }

    static{
        System.out.println("4:这是第二个静态代码块!");
    }

    public static void main(String[] args) {
        System.out.println("HelloWorld");
    }
}

被静态修饰符修饰的静态内容,就相当于跟类进行绑定了。****且随着类被加载,静态内容就被加载,且只加载一次。既然赋予了你跟类牢不可破共生共灭的关系,理论上静态内容的生命周期是从类加载到类的卸载。那么就要剥夺你一些东西,譬如剥夺使得你的静态内容只能伴随着类的加载过程加载一次!

用白话来解释说明

静态代码块和类变量这两个的优先级是平级的。也就是在天龙八部中北萧峰和南慕容的关系,五五开水平,就看谁先被加载。然后是段誉这种只会跟在后面叫大哥的三弟(静态方法)。。。至于非静态变量和非静态方法以及非静态代码块(下称非静态内容),就相当于聚贤庄那些二流高手,不知名的高手,射雕英雄传中小王爷完颜康,倚天屠龙剑中郡主赵敏所豢养在府上的高手。构造方法就相当于是情节。把上述这些丰满的人物串联起来。所以构造方法对类内的各种成员(无论是静态内容还是非静态内容)都可以进行使用。然后我们的类实例化出对象时, 就相当于金庸老爷子在创作天龙八部武侠小说。但是在一本书(一个类)中,静态内容只会被加载出来一次。比如说深藏不露的少林扫地高僧;要江山不要语嫣,一手好牌不躺平非要搞内卷结果被卷的稀烂的鲜卑后裔慕容复,英雄顶峰,莫过萧峰。还有有情人终成兄妹的段誉,但行好事莫问前程的虚竹小和尚。这一个个生动鲜明,熠熠发光的人物形象,一本书,也就加载一次足矣。这些鲜明的人物(静态部分)早就成为了天龙八部(类)这本书的符号,彼此绑定在了一起。深深的烙印在了读者的内心中。就像提起来萧峰雁门关抗辽,就想起来天龙八部,提起扫地僧,就想起来少林寺一样。静态内容只加载一次即可,英雄的唯一性,加载出来就跟类牢牢地绑定在一起了,在创作一本书(实例化对象的时候)也只能有一个萧峰(生于雁门关截杀,死于雁门关抗辽的大英雄萧峰)。

public class 天龙八部 {
    public static String 萧峰;
    public static String 扫地僧;
    public static String 段誉;
    public static String 虚竹;
}

但是其他的二流高手(非静态内容)手拿把掐,一抓一大把。在写书过程中加个名字就好了:就相当于聚贤庄那些二流高手,不知名的高手,射雕英雄传中小王爷完颜康,倚天屠龙剑中郡主赵敏所豢养在府上的高手。飞雪连天射白鹿,笑书神侠倚碧鸳!~十六本书,二流高手每次创作一本书的时候,拿出来用即可,他们就相当于非静态内容。

但是情节是截然不同的,情节就相当于(构造函数)。所以构造函数****被调用之前,必须先将类中的静态部分和非静态部分都加载一次!~

用static这个关键字来修饰的内容,出现在类之内,普通方法之外,修饰的作用就是和该类的对象解绑,只和类绑定。

A类实例化对象,new一次绿色部分的非静态内容加载一次。但是A类的静态部分(红色)只加载一次。

到了此处,相信类的加载 和 对象的创建过程 你已经轻松拿下了!

加入继承之后父类子类的加载构造顺序,还请移步我系列文章第一篇:【请点击链接】


二 :Java中的new关键字 究竟是干嘛的?

从数组开始,我们初识new关键字,然后在用类实例化对+象的时候,又认识到了new。

Java中引用类型有三种:数组array引用,类class引用以及接口interface引用。

前两种引用都和new关键字息息相关,关于new关键字的具体详解。

这个板块儿请参考我之前的对象文章!【点击跳转】


三:方法重载(method overlooading)

    书接上回,上文我们提到了《天龙八部》中只会跟在后面喊哥哥的段誉,我们说段老三在类加载过程中静态方法顺序排老三(类变量和静态代码块根据顺序排一二)。
    public static String 段誉追求(String action,int time,boolean isKonwChineseKungfu){
        return "钟灵";
    }
    public static String 段誉追求(String action,int time){
        return "木婉清";
    }

要了解方法的重载,就要先了解方法的构成,方能手到擒来。

剖析Java中一个方法的构成后,就可以深入了解Java的方法重载


方法重载要求
1,重载的方法名称必须相同2,重载的方法必须在同一个类中3,参数列表不做要求4,返回值类型不做要求

用白话来说明

一:在天龙八部这本书围绕着段誉所展开的情节中,段誉在追求每一位书中女子的过程中,都使用不同的方法,最终都追求成功了,但是这个方法名,必须是段誉追求,你不能说是段延庆来追求,这就离离原上谱了。这是第一点,重载方法名必须相同。

二:重载的方法必须在同一个类中,我们把天龙八部来抽象成一个类,在这个类中,你段誉可以追求多位女子。在这本书内,你怎么追求都行。但是你要是说张无忌追王语嫣,段誉追赵敏,这就不合适了嗷兄弟,关公战秦琼。所以第二点,重载的方法必须在一个类中。

上述是两个做要求的必须墨守成规的,下面的要求则是灵活多变的,毕竟咱老段也是个玲珑人儿,不是么?

三:但是由于追求这么多女子,她们的性格,生长环境和喜好是迥异的。而且需要在特定场景,不同情况下才能触发对段誉同学的好感。比如初识钟灵,段誉首先需要达成:1,长得俊,2,不会武,3,不会武还要讲道理。到了木婉清那里则需要达成 1,长得俊,2,摘下面纱。到再到王语嫣那里,需要达成1,长得俊,2 ,死缠烂打,舔一人为狗,舔几人终为《战狼八部》。可见我们特定场景下不同的方法执行不同的参数,参数列表就是天时地利人和。这也就是第三点,我们的重载方法对参数列表不做要求。

四:小心翼翼地调用方法,最终追求到了1,钟灵:一身青衫,笑靥如花,手中握着十来条尺许长小蛇。2,木婉清:新月清晕,花树堆雪。3,到了王语嫣,又是烟霞轻笼,山茶朝雾。段誉也追求到了不同的女主!这就好比与我们执行不同的方法,实现不同的参数列表,最终得到不同的返回值。不同类型的女主就像Java中不同类型的返回值类型。所以这第四点就是:我们对重载方法的返回值类型,不做要求!


四:漫谈权限修饰符(private,protected,public)

同类同包不同包同包中子类同包中非子类不同包中子类不同包中非子类private✓default✓✓✓protected✓✓✓✓public✓✓✓✓✓

故事发生在射雕英雄传时期,牧民A生活在辽阔的大草原上,他作为一个人是最基本的单位(class PersonA),他所拥有的全部家当被private修饰,只有他一个人能使用。后来他成家娶了牧民B(class PersonB),他俩一起生活在同一个蒙古包内(package aaa),他就把物品的修饰符private抹去了,在同一个蒙古包内,他和他妻子都能使用无修饰符的家当。后来他们生了一个孩子,class PersonC extends PersonA。孩子C成年了独立出去一个人住蒙古包,这时孩子C虽然成年了,牧民A不放心孩子一个人一个住一个蒙古包(package ccc),把家当的 修饰符改成了protected,孩子C虽然和孩子A虽然不在同一个蒙古包内生活,但是由于血缘继承关系(extends,implements)的存在,牧民C仍然可以跨包使用这些物品。后来牧民C越长越nb,长的跟我对床的舍友一样英姿飒爽帅气逼人,于是牧民C拥有了整座草原。他爹牧民A一看儿子这么给力,把物品修饰符权限改成了public,这下整个草原(项目project)不论是不是在同一个蒙古包内,都能使用public修饰的物品了!


五:关键字abstract(从关键字角度剖析抽象类)

1)剥夺

1.1 从类的角度,加上abstract修饰符

  **  ****一个类一旦用abstract修饰,他作为类被实例化创建对象的功能就被剥夺了!这个类就不能被实例化了!**

1.2 从方法的角度,加上abstract修饰符

 **当有abstract修饰的时候,你就不能有方法体,还要加上分号;而且还不能和static修饰符连用。连用非法!给你加上abstract关键字,就是赋予你为继承而生的使命!结果你加上了static修饰符和对象说再见了,去跟类绑定在一起,拉倒了您嘞!static和abstract连用非法。**

2)赋予

2.1 从类的角度,加上abstract修饰符

  **  ****一个类一旦用abstract修饰,他作为****抽象类就被赋予了为继承而生的使命****,除了不能实例化外其他部分跟类一模一样。**

2.2 从方法的角度,加上abstract修饰符

    **一个方法被abstract修饰,他就可以作为抽象方法出现了。抽象父类的抽象方法在非抽象的子类内最终一定是会被实现的!~**

综上!

从类的角度,抽象类就是除了不能实例化外和比普通类多了抽象方法外!跟普通类一模一样的类!

从方法的角度,抽象方法就是除了没有方法体,不能被static修饰,必须被非抽象子类实现的方法!


六:关键字interface

想象一下如下场景,你进入了阿里淘宝京东虾皮拼多多。

在开发过程中,团队成员给你说,给我开发一个名字为XXXX的类,内部有一个名为XXXX的方法,用来实现将商品按照价格升序或者降序排列!~

接口在开发过程中一个内容就是界定范围,责任和边界

做淘宝APP,我需要排序的对象

给你一个接口或抽象类,名字给你定好。下面需要使用排序的代码我都按照我给你的这个名字和返回值来先用着了,麻烦你去给我写实现类。谢谢!等你实现类写好,我再复制到我的工程里,美滋滋!

接口其实很少有人放属性,默认是常量的规则没啥用。、

接口大多数时候只是一组能力的聚合,描述具备某种(某些)能力的东西,但具体是什么东西,不知道

而且可用形容词

如Flyable具备飞行能力

具备行走能力Walkable

就记得接口内方法默认 public abstract就行。

只用这一个就行,别的不用扣细节,浪费时间。有害无益!

我们知道java的引用类型中包含三大类:
class类,类引用Java中的引用类型interface接口,接口引用array数组,数组引用
其中我们知道类是只能单一继承的,只能顺着一条线下来。

但是接口是可以按照标签来写的!根据标签分类处理。

接口之间可以相互继承,也可以一个接口继承多个接口,但是必须使用extends关键字来继承!

补充小Tips:

1)使用IDEA编译器查看项目中的继承关系图!

右键类文件,点击:

2)使用IDEA编译器绘制UML图!


写到这里,请原谅我小声说一句:小菜鸡真的不知道这篇文章质量如何,心中打着小鼓摇摆不定,但是官方大大私信我邀请我回来创作!~

因为真的是第一次尝试用这种语言风格来写作博客,这篇文章已经躺在我的草稿箱里一个半月有余啦!文章中难免有不当之处!~

后来才想明白,写博客的目的,其一是给自己梳理知识点,建立知识体系,其二是帮助有需要的朋友们。众生皆苦,执着反误。世事无常,佛者自渡。凡事不可强求~

如果是像这样迟迟压着不发,岂不是坏了道行。

所以还是觉得要发出来这篇文章,觉得写的还不错的好兄弟们,动动敲出完美无bug的小手支持一下,谢谢啦!觉得有不当之处的朋友们敬请指出,谢谢呀!假期之间解决了很多问题,也涉足了很多方面,有微信小程序,JavaWeb,前端,ELadmin项目等等后续都将更新出来,喜欢的老铁插个眼叭

不得不说梳理思路书写博客真的是能让人静下心来的一件事!

新年已过,但是没出正月就是年,给读者兄弟姐妹们拜个晚年~

新的一年里。祝福诸位写代码能面向对象,写人写景写情如红尘滚滚,写博客其文汪洋恣肆,学习工作一帆风顺,前程似锦。


本文转载自: https://blog.csdn.net/m0_56164356/article/details/122313513
版权归原作者 傻根根呀 所有, 如有侵权,请联系我们删除。

“【Java基础总结】类加载顺序,new关键字,访问权限修饰符与方法重载等【二】”的评论:

还没有评论