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就属于哪个对象。