而valueOf()方法则是静态的,不需要对象的具体特征,不需要依靠对象,直接把一个字符数组 返回为 一个字符串对象。
虽然静态方法也可以使用“对象.静态方法”的形式进行调用,但通常不建议用这样的形式,因为这样容易混淆静态方法和非静态方法,也违背了将通用抽象方法写作static,不需要具体对象特征就能调用的初衷!
虽然静态变量也可以使用“对象.静态成员”的形式进行调用,但通常不建议用这样的形式,因为这样容易混淆静态成员和非静态成员。
this关键字的作用
this关键字作用(1)用来表明当前正在构造的对象
**用来表明当前正在构造的对象。**用在对象内来加以区分,防止传进来的形参 和 类内方法的变量重名,方法之内局部变量优先,形参先于实参,但那时形参自己给自己赋值,传进来的值无意义,不能起到实际作用,当setter改变不了要改变的对象内的值,就要使用this加以区别。
package Person;
public class PersonTest {
private String name = “srs”;
private int date = 312;
public String getName() {
return name;
}
public void setName(String name) {
name = name;
}
public int getDate() {
return date;
}
public void setDate(int date) {
date = date;
}
public static void main(String[] args) {
PersonTest personTest = new PersonTest();
System.out.println(personTest.date);
System.out.println(personTest.name);
}
}
此处输出结果就是初始值312 和 srs 我们调用访问器方法对其进行更改:
public static void main(String[] args) {
PersonTest personTest = new PersonTest();
System.out.println(personTest.date);
System.out.println(personTest.name);
personTest.setDate(666);
personTest.setName(“nbnb”);
System.out.println(personTest.date);
System.out.println(personTest.name);
}
结果如上图所示,传进去的实参并没有起到实际的作用。
我们加上this之后再进行测试:
加上this之后输出结果如下,显然通过访问器可以对其进行修改了!
this的身影
初识类与对象,对这些抽象的概念我们都很疑惑,那么在哪儿能找到this呢?
万事不决Debug!
我们在debug中可以找到this的身影,别说,this这小东西还挺别致,挺能藏,我之前学习还没发现debug中能找到,多亏了老陈,对暗号:老陈YYDS!
this关键字作用(2)
我们可以使用this()调用构造方法
其中括号内可以与其他构造方法的参数列来调用其他构造方法,但是传进去的必须是实参:
如此处通过this(20211128);可以调用,而不能 this(int date);
package com.zdx.csdn.blog.test;
public class test1_20211128 {
public static void main(String[] args) {
new TestConstructor();
}
}
class TestConstructor{
int date;
TestConstructor(int date){
System.out.println(“参数列表不为空的构造方法”+date);
}
TestConstructor(){
this(20211128);
System.out.println(“空构造方法”);
};
}
package com.zdx.csdn.blog.test;
public class test1_20211128 {
public static void main(String[] args) {
new TestConstructor(20211128);
}
}
class TestConstructor{
int date;
TestConstructor(int date){
this();
System.out.println(“参数列表不为空的构造方法”+date);
}
TestConstructor(){
System.out.println(“空构造方法”);
};
}
通过对比:我们发现this的第二个作用,引用其他的构造方法的特点
一言以蔽之:在构造方法中使用this可以调用不同于当前构造方法的参数列的其他任意方法(但是受限于this语句必须写在构造方法第一行,只能调用一次;
不能调用参数列表相同的,是因为会形成递归。
2:从类的内容层面了解类
============
我们知道类包括五种
=============
属性
方法
内部类
代码块(官名构造代码块!)
构造方法(严格意义上来说也可叫构造器!)
万物皆对象:
在逻辑层 >>>我们面向存在于开发人员脑海中的世界 >>对现实中的一类有形或无形的概念的特征抽取,
特征表现为属性,对其行为的抽取,表现为方法。
换言之,属性即是数据,方法即是针对数据的操作。
内部类我们暂时还不需要了解那么深;
随着后续的学习,当深入到继承时,还有父子类优先关系需要比较
类加载的优先级规则:
==========
存在继承关系的不同类中,同一部分父类优先子类
同一父(子)类中static系列 优先于 不含 static 的一系列
同类型内(同是static,同非static)即:
1:默认值最先**(即赋值为类0:数字赋0,布尔赋false,字符串赋""这种)最先**
2:定义时初始化和代码块同等级,在代码中谁的位置在前,谁先执行
3:然后是构造器(构造函数)
package com.zdx.csdn.blog.test;
public class TestStaticVar {
static int staticint = si();
int one = un_si();
public static int si(){
System.out.println(“静态变量被初始化”);
return 1;
}
public int un_si(){
System.out.println(“成员变量one被初始化”);
return 2;
}
public static void main(String[] args) {
new TestStaticVar();
new TestStaticVar();
}
}
静态对象(变量)优先于非静态变量(对象)初始化,其中,静态变量(对象只初始化一次)
非静态对象(变量)可能会初始化多次。
3:对象
====
3.1:面向对象三个层次:
1)概念层(现实生活中) 万物皆对象 风,过程(学习过程,入学时间,学习内容,操作系统中的进程)也是对象
2)逻辑层 >>>存在于开发人员脑海中的世界 >>对现实中的一类有形或无形的概念的特征抽取,
特征表现为属性,对其行为的抽取,表现为方法。
换言之,属性即是数据,方法即是针对数据的操作。
3)物理层 >> 对象在堆区,对象在堆上是怎么存的?
3.2:对象的声明,其物理层面的操作及其存储:
Person person = new Person();
对象的引用变量:在栈上 即等号左边的stu存储在栈上
Java中每次 new 的 出现即在内存(heap堆区域)要内存,由JVM分配空间。
此处就要提到JAVA的安全机制做的格外不错
等号右边的对象存储在堆上,我们根本拿不到地址
等号左边的存储在栈上,我们能拿到如下图的地址,但是经过哈希处理的!
把这段内存区域,全部用0(或者null,或者false这种类似0的不同类型的初始值)去进行初始化,大略估计内存后对其进行分配。//这也就解释了为什么类内的成员变量需要初始化。
但是我们在堆上申请的内存是给对象用的!
//静态变量属于是初始化就焊死在JVM的方法区了。
本处所说的主要是指 Java 中 每次 有 new 出现 必有对象生成。
static变量 和 static方法 加上static 就和 对象无关了。static属于是跟着类走的,和类是一家人,类的预加载和 对象的初始化时两个阶段!
3.2:浅谈对象的消亡:
上文讲述了对象的诞生与操作。,对象的消亡指的是:
没有任何的引用指向它,他就死亡了,被称为垃圾
JVM中很重要的机制叫做垃圾回收,也就是JVM管杀管埋
Java舍弃了指针、舍弃了内存管理。说白了Java就是不信任所有的程序员都一定能够理性、安全和高效率的去处理这类复杂问题,
所以就在语言设计上用弱化复杂度(或者说灵活性、丰富度)去换取安全性罢了 。
每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由java虚拟机(JVM)自带的垃圾回收机制处理。不能再进行使用。
在学习垃圾回收机制之前,首先需要了解何种对象会被Java虚拟机视为垃圾:
-
🔲对象引用超过其作用范围,这个对象将被视为垃圾;
-
🔲将对象赋值为null
——————————补充内容————————————
==========================
4:初识JVM
=======
4.1:JVM是什么
JVM是Java Virtual Machine的缩写。它是一种基于计算设备的规范,是一台虚拟机,即虚构的计算机。
JVM屏蔽了具体操作系统平台的信息(显然,就像是我们在电脑上开了个虚拟机一样),当然,JVM执行字节码时实际上还是要解释成具体操作平台的机器指令的。
通过JVM,Java实现了平台无关性,Java语言在不同平台运行时不需要重新编译,只需要在该平台上部署JVM就可以了。因而能实现一次编译多处运行。(就像是你的虚拟机也可以在任何安了VMWare的系统上运行)
4.2:JVM的内容:
JVM主要包括:程序计数器(Program Counter),Java堆(Heap),Java虚拟机栈(Stack),本地方法栈(Native Stack),方法区(Method Area)
4.2.1:方法区:method
又叫静态区,存放所有的
①类(class),
②静态变量(static变量),
③静态方法,
④常量
⑤成员方法(就是普通方法,由访问修饰符,返回值类型,类名和方法体组成)。
4.2.2:堆:
jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 。
4.2.3:栈:
Java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,每个方法执行时都会创建一个栈帧(Stack Frame),描述的是java方法执行的内存模型,用于存储局部变量,操作数栈,方法出口,基本数据类型的数据,和对象的引用(reference)等。每个方法的调用都对应的出栈和入栈。
4.2.4:程序计数器(ProgramCounter)寄存器:
PC寄存器( PC register ):每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。
4.2.5:运行时常量池:
是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
4.2.6:本地方法栈:
本地方法栈与Java虚拟机栈发挥的作用非常相似,它们之间的区别在于虚拟机栈为虚拟机执行java方法(也就是字节码文件)服务,而本地方法栈则为使用到Native方法服务。
5:变量
====
目前学习见到的变量:
Java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,每个方法执行时都会创建一个栈帧(Stack Frame),描述的是java方法执行的内存模型,用于存储局部变量,操作数栈,方法出口,基本数据类型的数据,和对象的引用(reference)等。每个方法的调用都对应的出栈和入栈。
6:方法
====
静态方法VS普通方法
==========
6.1:静态方法,
类方法 不能访问对象,因为他是预先加载的,static方法预先加载与成员变量一样,属于类的本身,在类加载的时候被装载到内存,不自动进行摧毁,会一直存储在内存中方法区,直到JVM关闭。
6.2:普通方法,
实例方法,成员方法,非静态方法 不加 static **实例化后才会分配内存,分配内存也在方法区。**必须通过类的实例来引用。不会常驻内存,当实例对象(在Java中每次有new出现,必然在堆Heap上声明一块内存用来存储对象)被JVM回收(通常对象被JVM回收是因为他没有了引用变量指向它)之后,也跟着消失。
6.3:构造方法
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
独家面经总结,超级精彩
本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!
Java面试准备
准确的说这里又分为两部分:
- Java刷题
- 算法刷题
Java刷题:此份文档详细记录了千道面试题与详解;
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
7)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
独家面经总结,超级精彩
本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!
[外链图片转存中…(img-qT1ZkCVd-1713526095569)]
[外链图片转存中…(img-Io0gLp9N-1713526095570)]
[外链图片转存中…(img-Axs34kIN-1713526095571)]
[外链图片转存中…(img-se7b9DoB-1713526095573)]
Java面试准备
准确的说这里又分为两部分:
- Java刷题
- 算法刷题
Java刷题:此份文档详细记录了千道面试题与详解;
[外链图片转存中…(img-O1UAaxDa-1713526095576)]
[外链图片转存中…(img-Lca6QVEz-1713526095577)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!