**堆:**java的数据区,是一个运行时数据区,类的对象从中分配空间,他们不需要程序代码显示的释放,而是由垃圾回收机制来负责的。优势可以动态得分配内存地址,生存期也不必事先告诉编译区,因为它是运行时动态分配内存的,java有自动回收垃圾体制,自动收取不再使用的数据。**缺点:**是由于要在运行时动态分配内存,存取速度较慢
由此可见栈内存的引用变量并没有真正存储对象中的变量数据,对象的变量数据实际放在了堆内存,引用变量只是指向堆内存里的对象。
属性注意事项和细节说明
1.属性的定义语法同变量 如:访问修饰符 属性类型 属性名;
2.属性的定义类型可以为任意类型,包含基本类型或引用类型
3.属性如果不赋值,有默认值,规则和数组一致,具体的说:
int 0,short 0,byte 0,long 0,float 0.0 , double 0,char \u0000,
boolean false,String null;
访问属性
基本语法
对象名.属性名;
对象分配机制
类和对象的内存分配机制
java内存结构分析
1.栈:一般存放基本数据类型(局部变量)
2.堆:存放对象(Cat cat 数组等)
3.方法区:常量池(常量,比如字符串),类加载信息
4.示意图[Cat(name,age,price)]
Java创建对象的流程简单分析
Person p = new Person();
p.name = "jack";
p.age = 10;
1.先加载Person类信息(属性和方法信息,只会加载一次)
2.在堆中分配空间,进行默认初始化(看规则)
3.把地址p,p就指向对象
4.进行指定初始化,比如p.name = “jack” p.age = 10
创建对象流程
public class Person01 {
public static void main(String[] args) {
//创建Person对象
//p1 是对象名(对象引用)
//new Person()创建的对象空间(数据)才是真正的对象
Person p1 = new Person();
System.out.println(p1.age);
System.out.println(p1.name);
System.out.println(p1.sal);
System.out.println(p1.isPass);
}
}
class Person{
//四个属性
int age;
String name;
double sal;
boolean isPass;
}
成员方法(简称行为)
基本介绍
在某些情况,我们需要定义成员方法,比如人类:除了有一些属性外(年龄,姓名)我们人类还有一些行为比如
说话、跑步、学习,交朋友。现在我们就可以用成员方法来完成
public 表示公开 void:表示方法没有返回值 speak():speak方法名, ()形参列表
{}方法体,可以写我们要执行的代码
System.out.println("我是一个好人");
表示我们的方法就是输出
一句话
classPerson{
public void speak(){
System.out.println("我是一个好人");
}
}
方法使用
class Test{
public static void main(String[] args){
Person p1 = newPerson;
p1.speak();
p1.call();
}
}
public void call(){
int res = 0;
for(int i = 1; i<=1000;i++){
res+= i;
}
System.out.println("计算结果="+res);
}
形参使用
public int getsum(int num1,int num2){
int res = num1 + num2;
return res;
}
public static void main(String[] args){
//调用getsum方法,同时num1 = 10; num2 = 20
//吧getsum返回的值赋给变量returnRes
int returnRes = p1.getsum(10,20);
}
成员方法的定义
public 返回数据类型 方法名(参数表…){//方法体
语句;
return 返回值;
}
返回类型注意事项和细节
1.一个方法最多有一个返回值[思考,怎么返回多个结果?]
2.返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
3.如果方法要求有返回数值类型,则方法体中最后的执行语句必须为return 值
而且要求返回值类型必须和return的值类型一致或兼容
4.如果方法是void,则方法体可以没有return语句,或者只写return;
参数列表注意事项和使用细节
1.一个方法可以有多个0个参数,也可以有多个参数,中间用逗号隔开。getSum(int n1,int n2)
2.参数类型可以为任意类型,包含基本类型或引用类型。printArr(int[ ,][, ] map )
3.调用参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数【getSum】
4.方法定义时的参数称为形式参数,简称形参;方法调用时的参数称为实际参数,简称实参,实参和形参的类型
要一致或兼容、个数、顺序必须一致!
方法体
里面写完成的功能的具体的语句,可以输入、输出、变量、运算、分支、循环、方法调用,但里面不能
再定义方法! 即:方法不能嵌套定义。
方法调用细节注意事项和使用细节
1.同一个类中的方法调用说明:直接调用即可。比如print(参数);
2.跨类中的方法A类调用B类方法:需要通过对象名调用。
3.跨类的方法调用和方法的访问修饰符相关。
方法调用细节
1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2.当方法执行完毕,或者执行到return语句时,就会返回
3.返回到调用发的地方
4.返回后,继续执行方法后面的代码
5.当main方法(栈)执行完毕,整个程序退出
方法传参机制
1.基本数据类型的传参机制
public void swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
System.out.println("a="+a+"\tb="+b);
}
2.结论
基本数据类型, 传递的值是(值拷贝),形参的任何改变不影响实参!
2.引用类型传参机制
public class Method {
public static void main(String[] args) {
//测试
B b= new B();
int[] arr = {1,2,3};
b.test100(arr);
System.out.println("main的arr数组");
//遍历数组
for (int i= 0; i< arr.length;i++){
System.out.println(arr[i]);
}
}
}
class B{
public void test100(int[] arr){
arr[0] = 200;//修改元素
// 遍历B的数组
for (int i = 0;i< arr.length;i++){
System.out.print(arr[i]+"\t");
}
}
}
看案例B类编写一个方法test100,可以接收一个数组,在方法中修改修改该数组,原来的数组是否
发生改变
2.结论
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参。
方法递归
基本介绍
简单的说:递归就是方法调用自己,每次调用时传入不同的变量;有助于编程者解决复杂问题,让代码变得简洁
递归能解决什么问题?
1.各种数学问题:如8皇后问题、汉诺塔、阶乘问题、迷宫、球和篮子
2.各种算法也会使用到递归,比如快排、归并排序、二分查找、分治算法
3.将用栈解决的问题----》递归代码比较简洁
递归调用机制图
public class jicheng1 {
public static void main(String[] args) {
o o1 = new o();
o1.test(4);
}
}
class o {
public void test(int n) {
if (n > 1) {
test(n - 1);
}
System.out.println("n=" + n);
}
}
public class jicheng1 {
public static void main(String[] args) {
o o1 = new o();
int res = o1.fact(5);
System.out.println("res="+res);
}
}
class o {
public int fact(int n){
if (n==1){
return 1;
}else{
return fact(n-1)\*n;
}
}
}
递归注意事项和说明
1.当执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
2.方法的局部变量是独立的,不会相互影响,比如n变量
2.如果方法中使用的是引用变量(比如数组),就会共享引用类型的数据
4.递归必须向退出递归的条件逼近,否则就是无限递归
5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时执行完毕或者返回时,该方法也就执行完毕。
方法重载
基本介绍
Java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致
好处
1.减轻了起名的麻烦 2.记名的麻烦
使用细节
1.方法名:必须相同
2.参数列表:必须不同(参数类型或个数或顺序,至少一样不同,参数名无要求)
3.返回类型:无要求
public class zaiOne {
public static void main(String[] args) {
Methods rn = new Methods();
System.out.println(rn.max(95,100));
System.out.println(rn.max(25.1,26.3));
System.out.println(rn.max(25.1,26.3,85.2));
}
}
class Methods{
public int max(int n1,int n2){
return n1>n2?n1:n2;
}
public double max(double n1,double n2){
return n1>n2?n1:n2;
}
public double max(double n1,double n2,double n3){
double max1 = n1>n2?n1:n2;
return max1>n3?max1:n3;
}
}
可变参数
基本概念
Java允许将同一个类中多个同名功能但参数个数不同的方法,封装成一个方法
基本语法
访问修饰符 返回类型 方法名(数据类型… 形参名){
}
注意事项和使用细节
1.可变参数的实参可以为0个或任意多个。
2.可变参数的实参可以为数组。
3.可变参数的本质就是数组。
4.可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
最后
即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!
我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:
Dubbo面试专题
JVM面试专题
Java并发面试专题
Kafka面试专题
MongDB面试专题
MyBatis面试专题
MySQL面试专题
Netty面试专题
RabbitMQ面试专题
Redis面试专题
Spring Cloud面试专题
SpringBoot面试专题
zookeeper面试专题
常见面试算法题汇总专题
计算机网络基础专题
设计模式专题
题**
[外链图片转存中…(img-ah8gCZag-1714336759143)]
Netty面试专题
[外链图片转存中…(img-qt1EFxFM-1714336759143)]
RabbitMQ面试专题
[外链图片转存中…(img-9NUjXjoi-1714336759143)]
Redis面试专题
[外链图片转存中…(img-taVNyKm2-1714336759144)]
Spring Cloud面试专题
[外链图片转存中…(img-9FOdIpOq-1714336759144)]
SpringBoot面试专题
[外链图片转存中…(img-cM4yro4i-1714336759144)]
zookeeper面试专题
[外链图片转存中…(img-kd5CCi1K-1714336759144)]
常见面试算法题汇总专题
[外链图片转存中…(img-0Xs2ERvX-1714336759145)]
计算机网络基础专题
[外链图片转存中…(img-dJfqxmlv-1714336759145)]
设计模式专题
[外链图片转存中…(img-ySzCT6PF-1714336759145)]