方法详解、方法参数传递机制、形参个数可变

方法是类或对象的行为特征的抽象,方法是类或对象最重要的组成部分,但从都能上来看,方法完全类似传统结构化程序设计的函数,指得指出的是,Java里的方法不能独立存在,所有的方法都必须定义在类里。方法在逻辑上要么属于类,要么属于对象。

方法的所属性
  • 在结构化程序语言里,函数是一等公民,整个软件由一个个的函数组成,在面向对象编程语言里,类才是一等公民,整个系统由一个一个的类组成,因此在Java语言里,方法不能独立存在,方法必须属于类或对象。

  • 如果需要定义方法,则只能在类体内定义,不能独立定义一个方法。一旦将一个方法定义在某个类里,并且这个方法使用了static 修饰,则这个方法属于这个类,否则这个方法属于这个类的实例(对象)。

  • Java里的方法不能独立存在,它必须属于一个类或一对象,因此方法也不能像函数那样独立执行,执行方法时必须使用类或对象作为调用者,即所有方法都必须使用“类.方法” 或 “对象.方法”的形式调用。

  • 此上产生一个问题: 同一个类里不同方法之间相互调用时,不就可以直接调用吗?这里需要指出,同一个类的一个方法调用另外一个方法时,如果被被调用的是普通方法,则默认使用 this 作为调用者;如果被调方法是静态方法,则默认使用类作为调用者。也就是说,表面上看起来某个些方法可以被独立执行,但实际上还是使用 this 或 类 来作为调用者。

  • 永远不要把方法当成独立存在的实体,正如现实世界由类和对象组成,而方法只能作为类和对象的附属。

  1. 使用 static 修饰的方法属于这个类本身,使用 static 修饰的方法即可以使用类作为调用者,也可以使用对象作为调用者,值得指出的是,使用static修饰的方法是属于这个类的,因此使用该类的任何对象来调用这个方法时将会得到相同的执行结果,这是由于底层依然是使用这些实例所属的类作为调用者

  2. 没有 static 修饰的方法则属于该类的对象,不属于这个类本身。因此没有使用 static 修饰的方法只能使用对象作为调用者来调用。使用不同的对象作为调用者来调用同一个方法,可能得到不同的结果。

方法的参数传递机制

如果声明的方法包含了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时实际传给形参的参数值也被称为实参

  • java里方法的参数传递方式只有一种值传递。所谓的值传递,就是将实际参数值的副本(复制品)传入方法内。
    (个人理解:为什么是复制品?参考作用域;方法有自己作用域,按作用域说法,实参,和方法本身是两个没有关联的作用域,所以不可能访问到实际参数本身,所以在方法里面的只是实际参数的副本)☺笔者只是这么觉得,介意直接忽略这段。
注意:引用类型也是值传递
  • 对于基本类型可能比较好理解,对于引用类型来说传递的也是 值传递 ,可能有人会觉得,引用类型不是应该是“址传递” ?在方法里面不是能改变对象的字段值(实例变量)吗? 这的确没错,可是这还是"值传递" 传递的只是引用的一个副本(复制品),看如下代码再来分析:
public class Test {
	public static void main(String[] args) {
			
		book bk = new book();
		
		//先把price的值赋为60,如果不赋值,则是初始值0
		bk.price = 60;
		System.out.println(bk.price);//输出60
		
		test(bk);//1
		System.out.println(bk.price);//输出98
		
		
	}

	static void test(book b) {

		b.price = 98;

	}

}
 //为了测试引用类型,特有写了一个类便于理解
	class book {
		int price; // 价格
	}
  1. 不是说是值传递嘛?为什么还可以修改对象数据;在调用方法传入实参时际是: 实际数值的副本(复制品)传入方法内,而这个副本,也引用同一个对象而已,所以改变了同一个实例变量的值,如还比较模糊继续看下列代码:
public class Test {
	public static void main(String[] args) {
			
		book bk = new book(60);
		//输出60	
		System.out.println(bk.price);
		
		test(bk);//此方法让变量引用一个全新的对象
		
		//下列结果还是60,
		System.out.println(bk.price);
		
	}

	static void test(book b) {

		b = new book(98);

	}

}
 //为了测试引用类型,特有写了一个类便于理解
	class book {
		int price; // 价格
		
		public book(int price){
			
			this.price = price;
		}
	}
  1. 上面代码有点小改动,类加个带参构造,赋值创建对象时候初始值,
  2. 可以看到我们在方法中里实现把 变量引用一个全新的对象,执行方法后发现并未改变 bk(传递的实参)所引用的对象,
  3. 这也再次证实了在调用方法传入实参时际是: 实际数值的副本(复制品)传入方法内
    内存分配参考 - > 内存
  4. 内存分析: 上面所说的副本是:
  • 在test栈区里的 b -->指向 main栈区的bk 所指向(引用)的 book对象;
  • 当执行 b = new book(98);实际只是断开了 b 开始所引用的book对象
  • 此时 b指向(引用)了 堆内存中新的book对象;
  • 至始至终 bk 所引用的对象从未改变(实例变量price为60的那个对象)
形参个数可变的方法

从 JDK 1.5 之后,java允许定义形参个数可变的参数,从而允许为方法指定数量不确定的形参。如果在定义方法时,在最后一个形参后增加三点(…),则表明该形参可以接受多参数值,多个参数值被当成数组传入。

public class Test {
	public static void main(String[] args)  {
		
		
		//输出:碌-无-为-
		
		test2(6, "碌","无", "为");
		

	}
	
	static void test2(int a,String... names){
		
		//names 被当成数组处理
		for(String tmp : names){
			
			System.out.print(tmp+"-");
		}
		
	}

}

foreach循环可参考 -> foreach详解篇
总结几点:

  1. 形参个数可变的参数本质就是一个数组参数,下列两种效果完全一样
static void test2(int a,String... names){}
static void test2(int a,String[] names){}

2.即使是采用形参个数可变的形式定义方法,调用方法时也可以为个数可变的参数传入一个数组。
注意: 数组形式参数可以处于形参任意位置,但个数可变的形参只能处于形参列表的最后。也就是说,一个方法中最多只能有一个 个数可变的形参。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值