韩顺平0基础学Java——第11天

p234-249

又一个月了,时间过得好快啊,希望支棱起来

可变参数

public int sum(int ... nums){

}

这个nums是数组

细节:

1可变参数可以为0个,或任意个

2可变参数的实参可以为数组

3可变参数的本质就是数组

4可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后

5一个形参列表中只能有一个可变参数

练习:

第一次见return可以这样写的。

作用域

1.。Java中,主要的便利就是属性(成员变量)和局部变量、

2.。我们说的局部变量一般是指在成员方法中定义的变量

3.java中的作用于分类

全局变量:即属性,作用域为整个类体

局部变量:也就是除了属性之外,作用域为定义它的代码块中

4.全局变量可以不赋值直接用,因为有默认值,局部变量必须赋值后,才能使用(,)

所以说调用的时候,属性可以直接用,但是方法之间是独立的栈,所以不行。

作用域细节

1属性和局部变量可以重名,调用时遵循就近原则

2在同一个作用域中,不能重名

3.属性(字段)的生命周期更长,和对象一同生灭,局部变量伴随它 的代码块的执行而创建,伴随代码块的结束而销毁,即在一次方法调用的过程中。

4作用域范围不同:全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)

5.局部变量只能在本类中对应的方法调用

6修饰符不一样:全局变量可以有修饰符,但是局部不行。修饰符:public、protected、privated等等

构造方法/构造器constructor

在前文创造人类的对象的时,是先把一个对象创造好后,再给它的年龄和姓名属性赋值,如果现在要求在创建人类的对象时,就直接指定这个对象的年龄和姓名?

作用:对新对象的初始化

基本语法:

【修饰符】 方法名 (形参列表){

方法体

}

注:构造器的修饰符可以默认,没有返回值,方法名和类名必须一样,参数列表和成员方法一样的规则,构造器的调用由系统完成。

class Person{

int age;

String name;

public Person(String pName,int pAge){

System.out.println("构造器被调用,完成初始化~");

name = pName;

age = pAge;

}//构造器没有返回值,void都不写,构造器的名称和类名一致。

}

然后如何使用呢?

直接通过构造器指定名字。

Person p1 = new Person("madake",88);

注意事项:一个类可以定义多个构造器

这种情况可以选择初始化年龄+名字,或者只初始化名字了~

构造器是完成对象的初始化,不是创建对象!!构造器不能像成员方法那样调用。

如果没有定义构造器,系统会自动给类生成一个默认无参构造器,使用javap反编译。

当我们新建对象时的那个小括号,其实就是在调用那个默认的无参构造器!

Person p1 = new Person();

一旦定义了自己的构造器,默认的构造器就被覆盖了,就不能再使用默认无参构造器了。除非显式的定义一下,如Dog(){}

这相当于方法重载了?

练习

对象创建的流程分析

流程分析:0244_韩顺平Java_对象创建流程详解_哔哩哔哩_bilibili

1.在方法区加载Person类,只会加载一次。

2.在堆里分配空间(地址),并赋默认值。即age=0,name=null

3.显式初始化:给age变成90,name不动

4.执行构造器初始化,再进行属性的赋值→把age变成20,把name指向常量池的"小倩"

5.再把p指向堆里的空间

实际上,真正的对象在堆里面,p只是对象的引用(名字)

关键字:this

如果构造器的形参,能够直接写成属性名,就更好了。比如:

实际上,传进来的name和age变成null和0了。根据变量的作用域原则,就近,构造器的name就是局部变量了,而不是属性(字段)了。ai的解释:

this:java虚拟机会给每个对象分配this,代表当前对象。(py的self?)

老王:我的眼睛。

小美:我的眼睛。

虽然都是我的,但是指向的是两个不同的眼睛。

this的本质

this关键字的理解:指向了自己。

每一个对象都是有this的

this指向当前对象在内存中的地址。当一个对象被创建时,Java运行时环境会为这个对象分配内存,并使用this来引用这个内存地址。

使用hashCode方法可以找到对象的(虚拟)地址。比如:System.out.println(dog1.hashCode);

简单的说,哪个对象调用,this就属于哪个对象。

相关推荐
懒惰才能让科技进步29 分钟前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara43 分钟前
函数对象笔记
c++·算法
泉崎1 小时前
11.7比赛总结
数据结构·算法
你好helloworld1 小时前
滑动窗口最大值
数据结构·算法·leetcode
AI街潜水的八角2 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
白榆maple2 小时前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少2 小时前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs112 小时前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
此生只爱蛋3 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp3 小时前
Java:数据结构-枚举
java·开发语言·数据结构