一些方法的使用细节和注意事项
访问修饰符:作用是控制方法使用的范围
四种:public protected 默认 private
方法调用细节
1.同一个类中的方法调用:直接调用即可。
2.跨类中的方法A类调用B类方法:需要通过对象名调用。比如 对象名.方法名(参数);
3.特别说明一下:跨类的方法调用和方法的访问修饰符相关
传参机制:引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参
对象存在堆里 基本数据类型存放在堆里,引用数据类型在方法区。
调用方法 会在栈内开辟空间
递归 如果方法中使用的是引用类型变量(比如 数组、对象),就会共享该引用类型的数据。
方法重载的细节
1、方法名:必须相同
2、参数列表:必须不同(参数类型或个数或顺序,至少有一样不同,参数名无要求)
3、返回类型:无要求
public class OverLoad01{
//编写一个main函数
public static void main(String[] args){
MyCalculator mc = new MyCalculator();
System.out.println(mc.calculate(1,2));
System.out.println(mc.calculate(1.3,2));
System.out.println(mc.calculate(1,2.1));
System.out.println(mc.calculate(1,2,5));
}
}
class MyCalculator{
//下面的四个calculate方法构成了重载
public int calculate(int n1,int n2){
return n1 + n2;
}
public double calculate(int n1,double n2){
return n1 + n2;
}
public double calculate(double n1,int n2){
return n1 + n2;
}
public int calculate(int n1,int n2,int n3){
return n1 + n2 + n3;
}
}
可变参数
java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。就可以通过可变参数实现
基本语法:
访问修饰符 返回类型 方法名 (数据类型… 形参名){
}
public class VarParameter01{
//编写一个main函数
public static void main(String[] args){
HspMethod m = new HspMethod();
System.out.println(m.sun(1,5,100));
}
}
class HspMethod{
//解读
//1、 int... 表示接收的是可变参数,类型是int,既可以接收多个int(0-多)
//2、 使用可变参数时,可以当作数组来使用,即nums可以当作数组
//3、 求和则可以遍历nums求和
public int sun(int... nums){
//System.out.println("接收的参数个数=" + nums.length);
int res=0;
for(int i=0;i<nums.length;i++){
res+=nums[i];
}
return res;
}
}
可变参数的注意事项和细节
1、可变参数的实参可以为0个或任意多个
2、可变参数的实参可以为数组
3、可变参数的本质就是数组
4、可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在后面
5、一个形参列表中只能出现一个可变参数
作用域
1、属性和局部变量可以崇明,访问时遵循就近原则
2、在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名
3、属性生命周期较长,伴随着对象的创建而创建,伴随着对象的死亡而死亡。局部变量,生命周期较短,伴随着他的代码块的执行而创建,伴随着代码块的结束而死亡,即在一次方法调用过程中。
4、作用域范围不同
全局变量/属性:可以被本类使用,或其它类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用
5、修饰符不同
全局变量/属性可以加修饰符
局部变量不可以加修饰符
this关键字使用细节
class Person{
String name;
int age;
// this 用法
public Person(String name , int age){
//this.name this.age指的是当前对象(当前对象:创建好对象后,谁在调用这个构造器,this就是哪一个对象)的属性
this.name = name;
this.age = nge;
//简单的说,哪个对象调用,this就代表哪个对象
}
}
1、this关键字可以用来访问本类的属性、方法、构造器
2、this用于区分当前类的属性和局部变量
class T{
String name = "jack";
int num =10;
public void f3(){
String name = "Smith";
//传统方式 就近原则
System.out.println("name=" + name +" " + "num=" + num);//Smith 10
//也可以使用this访问属性
System.out.println("name=" + this.name +" " + "num=" + this.num);//jack 10
}
}
3、访问成员方法的语法:this.方法名(参数列表)
public class ThisDetail{
//编写一个main函数
public static void main(String[] args){
//当new一个对象时,直接通过构造器指定名字和年龄
Person p1 = new Person("smith" , 80);
T t1 = new T();
t1.f2();//运行结果 f2() 方法..
// f1() 方法..
// f1() 方法..
}
}
class T{
public void f1(){
System.out.println("f1() 方法..");
}
public void f2(){
System.out.println("f2() 方法..");
//调用本类的 f1
//第一种方式
f1();
//第二种方式
this.f1();
}
}
4、访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中访问另一个构造器)
访问构造器语法:this(参数列表);必须放在第一条语句
public class thisDetail{
//编写一个main函数
public static void main(String[] args){
T t2 = new T();//运行结果 T(String name,int age) 构造器
// T() 构造器
}
}
class T{
public T(){
//这里去访问T(String name,int age) 构造器
this ("jack",100);//放在第一条语句
System.out.println("T() 构造器");
}
public T(String name,int age){
System.out.println("T(String name,int age) 构造器");
}
}
5、this不能在类定义的外部使用,只能在类定义的方法中使用